aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorMiklos Szeredi <miklos@szeredi.hu>2002-12-10 12:26:00 +0000
committerMiklos Szeredi <miklos@szeredi.hu>2002-12-10 12:26:00 +0000
commitc8ba2379a8dae3cc7a7fdeb6ee00fb95332212aa (patch)
tree8b1f359e15a795d5caef790e49637b6f457c7dcf /kernel
parent5e427cd2f1f312f31b998e714028580e16a86efa (diff)
downloadlibfuse-c8ba2379a8dae3cc7a7fdeb6ee00fb95332212aa.tar.gz
added release() callback
Diffstat (limited to 'kernel')
-rw-r--r--kernel/dev.c1
-rw-r--r--kernel/file.c22
-rw-r--r--kernel/fuse_i.h3
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 */