Merge git://git.kernel.org/pub/scm/linux/kernel/git/joern/logfs
[linux-2.6-block.git] / fs / 9p / vfs_dir.c
index 6580aa4495414bd33a2d260eec8eb95c2bc0a59e..0adfd64dfcee88117a93aa9d2a0547cb6852d6e4 100644 (file)
@@ -32,6 +32,7 @@
 #include <linux/sched.h>
 #include <linux/inet.h>
 #include <linux/idr.h>
+#include <linux/slab.h>
 #include <net/9p/9p.h>
 #include <net/9p/client.h>
 
@@ -76,6 +77,15 @@ static inline int dt_type(struct p9_wstat *mistat)
        return rettype;
 }
 
+static void p9stat_init(struct p9_wstat *stbuf)
+{
+       stbuf->name  = NULL;
+       stbuf->uid   = NULL;
+       stbuf->gid   = NULL;
+       stbuf->muid  = NULL;
+       stbuf->extension = NULL;
+}
+
 /**
  * v9fs_dir_readdir - read a directory
  * @filp: opened file structure
@@ -121,6 +131,8 @@ static int v9fs_dir_readdir(struct file *filp, void *dirent, filldir_t filldir)
        rdir = (struct p9_rdir *) fid->rdir;
 
        err = mutex_lock_interruptible(&rdir->mutex);
+       if (err)
+               return err;
        while (err == 0) {
                if (rdir->tail == rdir->head) {
                        err = v9fs_file_readn(filp, rdir->buf, NULL,
@@ -131,8 +143,8 @@ static int v9fs_dir_readdir(struct file *filp, void *dirent, filldir_t filldir)
                        rdir->head = 0;
                        rdir->tail = err;
                }
-
                while (rdir->head < rdir->tail) {
+                       p9stat_init(&st);
                        err = p9stat_read(rdir->buf + rdir->head,
                                                buflen - rdir->head, &st,
                                                fid->clnt->proto_version);