aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2008-11-26 06:03:55 -0500
committerMiklos Szeredi <miklos@szeredi.hu>2008-11-26 06:03:55 -0500
commitacf99433d98c2570a619d8fb8b51abce4e532059 (patch)
tree3d8c6933448ad67c4343808113c7ee8f41050349 /fs
parent59efec7b903987dcb60b9ebc85c7acd4443a11a1 (diff)
fuse: add file kernel handle
The file handle, fuse_file->fh, is opaque value supplied by userland FUSE server and uniqueness is not guaranteed. Add file kernel handle, fuse_file->kh, which is allocated by the kernel on file allocation and guaranteed to be unique. This will be used by poll to match notification to the respective file but can be used for other purposes where unique file handle is necessary. Signed-off-by: Tejun Heo <tj@kernel.org> Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
Diffstat (limited to 'fs')
-rw-r--r--fs/fuse/dir.c2
-rw-r--r--fs/fuse/file.c8
-rw-r--r--fs/fuse/fuse_i.h8
-rw-r--r--fs/fuse/inode.c1
4 files changed, 15 insertions, 4 deletions
diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c
index 9e7c5385699f..16ae55d347bb 100644
--- a/fs/fuse/dir.c
+++ b/fs/fuse/dir.c
@@ -408,7 +408,7 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry, int mode,
408 goto out_put_forget_req; 408 goto out_put_forget_req;
409 409
410 err = -ENOMEM; 410 err = -ENOMEM;
411 ff = fuse_file_alloc(); 411 ff = fuse_file_alloc(fc);
412 if (!ff) 412 if (!ff)
413 goto out_put_request; 413 goto out_put_request;
414 414
diff --git a/fs/fuse/file.c b/fs/fuse/file.c
index baed06ea7622..a28ced678d38 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -46,7 +46,7 @@ static int fuse_send_open(struct inode *inode, struct file *file, int isdir,
46 return err; 46 return err;
47} 47}
48 48
49struct fuse_file *fuse_file_alloc(void) 49struct fuse_file *fuse_file_alloc(struct fuse_conn *fc)
50{ 50{
51 struct fuse_file *ff; 51 struct fuse_file *ff;
52 ff = kmalloc(sizeof(struct fuse_file), GFP_KERNEL); 52 ff = kmalloc(sizeof(struct fuse_file), GFP_KERNEL);
@@ -58,6 +58,9 @@ struct fuse_file *fuse_file_alloc(void)
58 } else { 58 } else {
59 INIT_LIST_HEAD(&ff->write_entry); 59 INIT_LIST_HEAD(&ff->write_entry);
60 atomic_set(&ff->count, 0); 60 atomic_set(&ff->count, 0);
61 spin_lock(&fc->lock);
62 ff->kh = ++fc->khctr;
63 spin_unlock(&fc->lock);
61 } 64 }
62 } 65 }
63 return ff; 66 return ff;
@@ -108,6 +111,7 @@ void fuse_finish_open(struct inode *inode, struct file *file,
108 111
109int fuse_open_common(struct inode *inode, struct file *file, int isdir) 112int fuse_open_common(struct inode *inode, struct file *file, int isdir)
110{ 113{
114 struct fuse_conn *fc = get_fuse_conn(inode);
111 struct fuse_open_out outarg; 115 struct fuse_open_out outarg;
112 struct fuse_file *ff; 116 struct fuse_file *ff;
113 int err; 117 int err;
@@ -120,7 +124,7 @@ int fuse_open_common(struct inode *inode, struct file *file, int isdir)
120 if (err) 124 if (err)
121 return err; 125 return err;
122 126
123 ff = fuse_file_alloc(); 127 ff = fuse_file_alloc(fc);
124 if (!ff) 128 if (!ff)
125 return -ENOMEM; 129 return -ENOMEM;
126 130
diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h
index 4fc5131f5c9d..86f013303828 100644
--- a/fs/fuse/fuse_i.h
+++ b/fs/fuse/fuse_i.h
@@ -100,6 +100,9 @@ struct fuse_file {
100 /** Request reserved for flush and release */ 100 /** Request reserved for flush and release */
101 struct fuse_req *reserved_req; 101 struct fuse_req *reserved_req;
102 102
103 /** Kernel file handle guaranteed to be unique */
104 u64 kh;
105
103 /** File handle used by userspace */ 106 /** File handle used by userspace */
104 u64 fh; 107 u64 fh;
105 108
@@ -322,6 +325,9 @@ struct fuse_conn {
322 /** The list of requests under I/O */ 325 /** The list of requests under I/O */
323 struct list_head io; 326 struct list_head io;
324 327
328 /** The next unique kernel file handle */
329 u64 khctr;
330
325 /** Number of requests currently in the background */ 331 /** Number of requests currently in the background */
326 unsigned num_background; 332 unsigned num_background;
327 333
@@ -499,7 +505,7 @@ void fuse_read_fill(struct fuse_req *req, struct file *file,
499 */ 505 */
500int fuse_open_common(struct inode *inode, struct file *file, int isdir); 506int fuse_open_common(struct inode *inode, struct file *file, int isdir);
501 507
502struct fuse_file *fuse_file_alloc(void); 508struct fuse_file *fuse_file_alloc(struct fuse_conn *fc);
503void fuse_file_free(struct fuse_file *ff); 509void fuse_file_free(struct fuse_file *ff);
504void fuse_finish_open(struct inode *inode, struct file *file, 510void fuse_finish_open(struct inode *inode, struct file *file,
505 struct fuse_file *ff, struct fuse_open_out *outarg); 511 struct fuse_file *ff, struct fuse_open_out *outarg);
diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c
index fa474989ec76..0e15bc221d23 100644
--- a/fs/fuse/inode.c
+++ b/fs/fuse/inode.c
@@ -485,6 +485,7 @@ static struct fuse_conn *new_conn(struct super_block *sb)
485 fc->bdi.unplug_io_fn = default_unplug_io_fn; 485 fc->bdi.unplug_io_fn = default_unplug_io_fn;
486 /* fuse does it's own writeback accounting */ 486 /* fuse does it's own writeback accounting */
487 fc->bdi.capabilities = BDI_CAP_NO_ACCT_WB; 487 fc->bdi.capabilities = BDI_CAP_NO_ACCT_WB;
488 fc->khctr = 0;
488 fc->dev = sb->s_dev; 489 fc->dev = sb->s_dev;
489 err = bdi_init(&fc->bdi); 490 err = bdi_init(&fc->bdi);
490 if (err) 491 if (err)