aboutsummaryrefslogtreecommitdiff
path: root/kernel/inode.c
diff options
context:
space:
mode:
authorGravatar Miklos Szeredi <miklos@szeredi.hu>2001-11-18 19:15:05 +0000
committerGravatar Miklos Szeredi <miklos@szeredi.hu>2001-11-18 19:15:05 +0000
commit43696434f8fd5cd1107658f329b6922ea947ed1f (patch)
treea0aaf6056690245d3fe946bbb32fc9c80d74fd2a /kernel/inode.c
parent07d2849a34149dd350e8a028e4b8012eb1d622be (diff)
performance improvements
Diffstat (limited to 'kernel/inode.c')
-rw-r--r--kernel/inode.c37
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);
}