Explorar o código

Btrfs: Optimise NFS readdir hack slightly; don't call readdir() again when done

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>
David Woodhouse %!s(int64=16) %!d(string=hai) anos
pai
achega
f2322b1c65
Modificáronse 1 ficheiros con 7 adicións e 4 borrados
  1. 7 4
      fs/btrfs/inode.c

+ 7 - 4
fs/btrfs/inode.c

@@ -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);