diff options
author | 2001-11-18 19:15:05 +0000 | |
---|---|---|
committer | 2001-11-18 19:15:05 +0000 | |
commit | 43696434f8fd5cd1107658f329b6922ea947ed1f (patch) | |
tree | a0aaf6056690245d3fe946bbb32fc9c80d74fd2a /kernel/inode.c | |
parent | 07d2849a34149dd350e8a028e4b8012eb1d622be (diff) |
performance improvements
Diffstat (limited to 'kernel/inode.c')
-rw-r--r-- | kernel/inode.c | 37 |
1 files changed, 28 insertions, 9 deletions
diff --git a/kernel/inode.c b/kernel/inode.c index 36819b7..df402ba 100644 --- a/kernel/inode.c +++ b/kernel/inode.c @@ -23,17 +23,35 @@ static void fuse_read_inode(struct inode *inode) static void fuse_clear_inode(struct inode *inode) { struct fuse_conn *fc = INO_FC(inode); - struct fuse_in in = FUSE_IN_INIT; - struct fuse_forget_in arg; + struct fuse_in *in = NULL; + struct fuse_forget_in *inarg = NULL; - arg.version = inode->i_version; - - in.h.opcode = FUSE_FORGET; - in.h.ino = inode->i_ino; - in.argsize = sizeof(arg); - in.arg = &arg; + if(fc == NULL) + return; + + in = kmalloc(sizeof(struct fuse_in), GFP_NOFS); + if(!in) + return; + + inarg = kmalloc(sizeof(struct fuse_forget_in), GFP_NOFS); + if(!inarg) + goto out_free; - request_send(fc, &in, NULL); + memset(inarg, 0, sizeof(struct fuse_forget_in)); + inarg->version = inode->i_version; + + in->h.opcode = FUSE_FORGET; + in->h.ino = inode->i_ino; + in->numargs = 1; + in->args[0].size = sizeof(struct fuse_forget_in); + in->args[0].value = inarg; + + if(!request_send_noreply(fc, in)) + return; + + out_free: + kfree(inarg); + kfree(in); } static void fuse_put_super(struct super_block *sb) @@ -45,6 +63,7 @@ static void fuse_put_super(struct super_block *sb) fc->uid = 0; fc->flags = 0; fuse_release_conn(fc); + sb->u.generic_sbp = NULL; spin_unlock(&fuse_lock); } |