diff options
author | Miklos Szeredi <miklos@szeredi.hu> | 2002-12-10 12:26:00 +0000 |
---|---|---|
committer | Miklos Szeredi <miklos@szeredi.hu> | 2002-12-10 12:26:00 +0000 |
commit | c8ba2379a8dae3cc7a7fdeb6ee00fb95332212aa (patch) | |
tree | 8b1f359e15a795d5caef790e49637b6f457c7dcf /kernel | |
parent | 5e427cd2f1f312f31b998e714028580e16a86efa (diff) | |
download | libfuse-c8ba2379a8dae3cc7a7fdeb6ee00fb95332212aa.tar.gz |
added release() callback
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/dev.c | 1 | ||||
-rw-r--r-- | kernel/file.c | 22 | ||||
-rw-r--r-- | kernel/fuse_i.h | 3 |
3 files changed, 26 insertions, 0 deletions
diff --git a/kernel/dev.c b/kernel/dev.c index 7cf3844..002e23b 100644 --- a/kernel/dev.c +++ b/kernel/dev.c @@ -447,6 +447,7 @@ static struct fuse_conn *new_conn(void) INIT_LIST_HEAD(&fc->processing); sema_init(&fc->outstanding, MAX_OUTSTANDING); fc->reqctr = 1; + fc->has_release = 1; } return fc; } diff --git a/kernel/file.c b/kernel/file.c index 14ba59b..4940117 100644 --- a/kernel/file.c +++ b/kernel/file.c @@ -40,6 +40,27 @@ static int fuse_open(struct inode *inode, struct file *file) return out.h.error; } +static int fuse_release(struct inode *inode, struct file *file) +{ + struct fuse_conn *fc = INO_FC(inode); + struct fuse_in in = FUSE_IN_INIT; + struct fuse_out out = FUSE_OUT_INIT; + + if(!fc->has_release) + return 0; + + in.h.opcode = FUSE_RELEASE; + in.h.ino = inode->i_ino; + request_send(fc, &in, &out); + + if(out.h.error == -ENOSYS) { + fc->has_release = 0; + return 0; + } + + return out.h.error; +} + static int fuse_readpage(struct file *file, struct page *page) { @@ -159,6 +180,7 @@ static int fuse_commit_write(struct file *file, struct page *page, static struct file_operations fuse_file_operations = { open: fuse_open, + release: fuse_release, read: generic_file_read, write: generic_file_write, mmap: generic_file_mmap, diff --git a/kernel/fuse_i.h b/kernel/fuse_i.h index 23cc914..e4730e6 100644 --- a/kernel/fuse_i.h +++ b/kernel/fuse_i.h @@ -56,6 +56,9 @@ struct fuse_conn { /** The next unique request id */ int reqctr; + + /* Flag indicating whether the release call is supported */ + int has_release; }; /** One input argument of a request */ |