Btrfs: Optimise NFS readdir hack slightly; don't call readdir() again when done
authorDavid Woodhouse <David.Woodhouse@intel.com>
Sun, 17 Aug 2008 16:12:56 +0000 (17:12 +0100)
committerChris Mason <chris.mason@oracle.com>
Thu, 25 Sep 2008 15:04:06 +0000 (11:04 -0400)
Date: Sun, 17 Aug 2008 17:12:56 +0100
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/inode.c

index c7b7095634da2bf2a8e4273fefa5639141855bc5..10f26f445328b40e442792e4347975bb3f2c0498 100644 (file)
@@ -2040,6 +2040,7 @@ struct nfshack_dirent {
 struct nfshack_readdir {
        char            *dirent;
        size_t          used;
+       int             full;
 };
 
 
@@ -2052,8 +2053,10 @@ static int btrfs_nfshack_filldir(void *__buf, const char *name, int namlen,
        unsigned int reclen;
 
        reclen = ALIGN(sizeof(struct nfshack_dirent) + namlen, sizeof(u64));
-       if (buf->used + reclen > PAGE_SIZE)
+       if (buf->used + reclen > PAGE_SIZE) {
+               buf->full = 1;
                return -EINVAL;
+       }
 
        de->namlen = namlen;
        de->offset = offset;
@@ -2080,11 +2083,11 @@ static int btrfs_nfshack_readdir(struct file *file, void *dirent,
 
        offset = file->f_pos;
 
-       while (1) {
+       do {
                unsigned int reclen;
 
                buf.used = 0;
-
+               buf.full = 0;
                err = btrfs_real_readdir(file, &buf, btrfs_nfshack_filldir);
                if (err)
                        break;
@@ -2108,7 +2111,7 @@ static int btrfs_nfshack_readdir(struct file *file, void *dirent,
                        size -= reclen;
                        de = (struct nfshack_dirent *)((char *)de + reclen);
                }
-       }
+       } while (buf.full);
 
  done:
        free_page((unsigned long)buf.dirent);