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.
             struct readdir_cd *cdp, filldir_t func)
 {
        __be32          err;
-       int             host_err;
        struct file     *file;
        loff_t          offset = *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 */