[PATCH] Factor out nfsd_do_readdir() into its own function
authorDavid Woodhouse <David.Woodhouse@intel.com>
Thu, 31 Jul 2008 16:16:51 +0000 (17:16 +0100)
committerAl Viro <viro@zeniv.linux.org.uk>
Thu, 23 Oct 2008 09:13:04 +0000 (05:13 -0400)
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/nfsd/vfs.c

index aa1d0d6489a119a3e8e00aa301cc9a9719006087..14eda20cc291c97cfc815f0aaab7bb7d67b07c07 100644 (file)
@@ -1813,6 +1813,29 @@ out:
        return err;
 }
 
+static int nfsd_do_readdir(struct file *file, filldir_t func,
+                          struct readdir_cd *cdp, loff_t *offsetp)
+{
+       int host_err;
+
+       /*
+        * Read the directory entries. This silly loop is necessary because
+        * readdir() is not guaranteed to fill up the entire buffer, but
+        * may choose to do less.
+        */
+       do {
+               cdp->err = nfserr_eof; /* will be cleared on successful read */
+               host_err = vfs_readdir(file, func, cdp);
+       } while (host_err >=0 && cdp->err == nfs_ok);
+
+       *offsetp = vfs_llseek(file, 0, 1);
+
+       if (host_err)
+               return nfserrno(host_err);
+       else
+               return cdp->err;
+}
+
 /*
  * Read entries from a directory.
  * The  NFSv3/4 verifier we ignore for now.
@@ -1822,7 +1845,6 @@ nfsd_readdir(struct svc_rqst *rqstp, struct svc_fh *fhp, loff_t *offsetp,
             struct readdir_cd *cdp, filldir_t func)
 {
        __be32          err;
-       int             host_err;
        struct file     *file;
        loff_t          offset = *offsetp;
 
@@ -1836,21 +1858,7 @@ nfsd_readdir(struct svc_rqst *rqstp, struct svc_fh *fhp, loff_t *offsetp,
                goto out_close;
        }
 
-       /*
-        * Read the directory entries. This silly loop is necessary because
-        * readdir() is not guaranteed to fill up the entire buffer, but
-        * may choose to do less.
-        */
-
-       do {
-               cdp->err = nfserr_eof; /* will be cleared on successful read */
-               host_err = vfs_readdir(file, func, cdp);
-       } while (host_err >=0 && cdp->err == nfs_ok);
-       if (host_err)
-               err = nfserrno(host_err);
-       else
-               err = cdp->err;
-       *offsetp = vfs_llseek(file, 0, 1);
+       err = nfsd_do_readdir(file, func, cdp, offsetp);
 
        if (err == nfserr_eof || err == nfserr_toosmall)
                err = nfs_ok; /* can still be found in ->err */