diff options
author | Anand V. Avati <avati@redhat.com> | 2012-08-19 08:53:23 -0400 |
---|---|---|
committer | Miklos Szeredi <mszeredi@suse.cz> | 2013-01-24 10:21:25 -0500 |
commit | 0b05b18381eea98c9c9ada95629bf659a88c9374 (patch) | |
tree | a6389eaffda03a2e28cb05be242e03ef839fcb91 /fs/fuse/fuse_i.h | |
parent | ff7532ca2c631e7e96dcd305a967b610259dc0ea (diff) |
fuse: implement NFS-like readdirplus support
This patch implements readdirplus support in FUSE, similar to NFS.
The payload returned in the readdirplus call contains
'fuse_entry_out' structure thereby providing all the necessary inputs
for 'faking' a lookup() operation on the spot.
If the dentry and inode already existed (for e.g. in a re-run of ls -l)
then just the inode attributes timeout and dentry timeout are refreshed.
With a simple client->network->server implementation of a FUSE based
filesystem, the following performance observations were made:
Test: Performing a filesystem crawl over 20,000 files with
sh# time ls -lR /mnt
Without readdirplus:
Run 1: 18.1s
Run 2: 16.0s
Run 3: 16.2s
With readdirplus:
Run 1: 4.1s
Run 2: 3.8s
Run 3: 3.8s
The performance improvement is significant as it avoided 20,000 upcalls
calls (lookup). Cache consistency is no worse than what already is.
Signed-off-by: Anand V. Avati <avati@redhat.com>
Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
Diffstat (limited to 'fs/fuse/fuse_i.h')
-rw-r--r-- | fs/fuse/fuse_i.h | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h index e105a53fc72d..5c5055306d3c 100644 --- a/fs/fuse/fuse_i.h +++ b/fs/fuse/fuse_i.h | |||
@@ -487,6 +487,9 @@ struct fuse_conn { | |||
487 | /** Use enhanced/automatic page cache invalidation. */ | 487 | /** Use enhanced/automatic page cache invalidation. */ |
488 | unsigned auto_inval_data:1; | 488 | unsigned auto_inval_data:1; |
489 | 489 | ||
490 | /** Does the filesystem support readdir-plus? */ | ||
491 | unsigned do_readdirplus:1; | ||
492 | |||
490 | /** The number of requests waiting for completion */ | 493 | /** The number of requests waiting for completion */ |
491 | atomic_t num_waiting; | 494 | atomic_t num_waiting; |
492 | 495 | ||
@@ -578,6 +581,9 @@ void fuse_queue_forget(struct fuse_conn *fc, struct fuse_forget_link *forget, | |||
578 | 581 | ||
579 | struct fuse_forget_link *fuse_alloc_forget(void); | 582 | struct fuse_forget_link *fuse_alloc_forget(void); |
580 | 583 | ||
584 | /* Used by READDIRPLUS */ | ||
585 | void fuse_force_forget(struct file *file, u64 nodeid); | ||
586 | |||
581 | /** | 587 | /** |
582 | * Initialize READ or READDIR request | 588 | * Initialize READ or READDIR request |
583 | */ | 589 | */ |