aboutsummaryrefslogtreecommitdiffstats
path: root/fs/fuse/fuse_i.h
diff options
context:
space:
mode:
authorAnand V. Avati <avati@redhat.com>2012-08-19 08:53:23 -0400
committerMiklos Szeredi <mszeredi@suse.cz>2013-01-24 10:21:25 -0500
commit0b05b18381eea98c9c9ada95629bf659a88c9374 (patch)
treea6389eaffda03a2e28cb05be242e03ef839fcb91 /fs/fuse/fuse_i.h
parentff7532ca2c631e7e96dcd305a967b610259dc0ea (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.h6
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
579struct fuse_forget_link *fuse_alloc_forget(void); 582struct fuse_forget_link *fuse_alloc_forget(void);
580 583
584/* Used by READDIRPLUS */
585void 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 */