diff options
Diffstat (limited to 'fs/fuse/file.c')
-rw-r--r-- | fs/fuse/file.c | 38 |
1 files changed, 28 insertions, 10 deletions
diff --git a/fs/fuse/file.c b/fs/fuse/file.c index 6bc3fb26de39..224453557cf6 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c | |||
@@ -12,7 +12,7 @@ | |||
12 | #include <linux/slab.h> | 12 | #include <linux/slab.h> |
13 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
14 | 14 | ||
15 | static int fuse_open(struct inode *inode, struct file *file) | 15 | int fuse_open_common(struct inode *inode, struct file *file, int isdir) |
16 | { | 16 | { |
17 | struct fuse_conn *fc = get_fuse_conn(inode); | 17 | struct fuse_conn *fc = get_fuse_conn(inode); |
18 | struct fuse_req *req; | 18 | struct fuse_req *req; |
@@ -56,7 +56,7 @@ static int fuse_open(struct inode *inode, struct file *file) | |||
56 | 56 | ||
57 | memset(&inarg, 0, sizeof(inarg)); | 57 | memset(&inarg, 0, sizeof(inarg)); |
58 | inarg.flags = file->f_flags & ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC); | 58 | inarg.flags = file->f_flags & ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC); |
59 | req->in.h.opcode = FUSE_OPEN; | 59 | req->in.h.opcode = isdir ? FUSE_OPENDIR : FUSE_OPEN; |
60 | req->in.h.nodeid = get_node_id(inode); | 60 | req->in.h.nodeid = get_node_id(inode); |
61 | req->inode = inode; | 61 | req->inode = inode; |
62 | req->in.numargs = 1; | 62 | req->in.numargs = 1; |
@@ -85,7 +85,7 @@ static int fuse_open(struct inode *inode, struct file *file) | |||
85 | return err; | 85 | return err; |
86 | } | 86 | } |
87 | 87 | ||
88 | static int fuse_release(struct inode *inode, struct file *file) | 88 | int fuse_release_common(struct inode *inode, struct file *file, int isdir) |
89 | { | 89 | { |
90 | struct fuse_conn *fc = get_fuse_conn(inode); | 90 | struct fuse_conn *fc = get_fuse_conn(inode); |
91 | struct fuse_file *ff = file->private_data; | 91 | struct fuse_file *ff = file->private_data; |
@@ -94,7 +94,7 @@ static int fuse_release(struct inode *inode, struct file *file) | |||
94 | 94 | ||
95 | inarg->fh = ff->fh; | 95 | inarg->fh = ff->fh; |
96 | inarg->flags = file->f_flags & ~O_EXCL; | 96 | inarg->flags = file->f_flags & ~O_EXCL; |
97 | req->in.h.opcode = FUSE_RELEASE; | 97 | req->in.h.opcode = isdir ? FUSE_RELEASEDIR : FUSE_RELEASE; |
98 | req->in.h.nodeid = get_node_id(inode); | 98 | req->in.h.nodeid = get_node_id(inode); |
99 | req->inode = inode; | 99 | req->inode = inode; |
100 | req->in.numargs = 1; | 100 | req->in.numargs = 1; |
@@ -107,6 +107,16 @@ static int fuse_release(struct inode *inode, struct file *file) | |||
107 | return 0; | 107 | return 0; |
108 | } | 108 | } |
109 | 109 | ||
110 | static int fuse_open(struct inode *inode, struct file *file) | ||
111 | { | ||
112 | return fuse_open_common(inode, file, 0); | ||
113 | } | ||
114 | |||
115 | static int fuse_release(struct inode *inode, struct file *file) | ||
116 | { | ||
117 | return fuse_release_common(inode, file, 0); | ||
118 | } | ||
119 | |||
110 | static int fuse_flush(struct file *file) | 120 | static int fuse_flush(struct file *file) |
111 | { | 121 | { |
112 | struct inode *inode = file->f_dentry->d_inode; | 122 | struct inode *inode = file->f_dentry->d_inode; |
@@ -178,8 +188,9 @@ static int fuse_fsync(struct file *file, struct dentry *de, int datasync) | |||
178 | return err; | 188 | return err; |
179 | } | 189 | } |
180 | 190 | ||
181 | static ssize_t fuse_send_read(struct fuse_req *req, struct file *file, | 191 | size_t fuse_send_read_common(struct fuse_req *req, struct file *file, |
182 | struct inode *inode, loff_t pos, size_t count) | 192 | struct inode *inode, loff_t pos, size_t count, |
193 | int isdir) | ||
183 | { | 194 | { |
184 | struct fuse_conn *fc = get_fuse_conn(inode); | 195 | struct fuse_conn *fc = get_fuse_conn(inode); |
185 | struct fuse_file *ff = file->private_data; | 196 | struct fuse_file *ff = file->private_data; |
@@ -189,7 +200,7 @@ static ssize_t fuse_send_read(struct fuse_req *req, struct file *file, | |||
189 | inarg.fh = ff->fh; | 200 | inarg.fh = ff->fh; |
190 | inarg.offset = pos; | 201 | inarg.offset = pos; |
191 | inarg.size = count; | 202 | inarg.size = count; |
192 | req->in.h.opcode = FUSE_READ; | 203 | req->in.h.opcode = isdir ? FUSE_READDIR : FUSE_READ; |
193 | req->in.h.nodeid = get_node_id(inode); | 204 | req->in.h.nodeid = get_node_id(inode); |
194 | req->inode = inode; | 205 | req->inode = inode; |
195 | req->file = file; | 206 | req->file = file; |
@@ -204,6 +215,13 @@ static ssize_t fuse_send_read(struct fuse_req *req, struct file *file, | |||
204 | return req->out.args[0].size; | 215 | return req->out.args[0].size; |
205 | } | 216 | } |
206 | 217 | ||
218 | static inline size_t fuse_send_read(struct fuse_req *req, struct file *file, | ||
219 | struct inode *inode, loff_t pos, | ||
220 | size_t count) | ||
221 | { | ||
222 | return fuse_send_read_common(req, file, inode, pos, count, 0); | ||
223 | } | ||
224 | |||
207 | static int fuse_readpage(struct file *file, struct page *page) | 225 | static int fuse_readpage(struct file *file, struct page *page) |
208 | { | 226 | { |
209 | struct inode *inode = page->mapping->host; | 227 | struct inode *inode = page->mapping->host; |
@@ -293,8 +311,8 @@ static int fuse_readpages(struct file *file, struct address_space *mapping, | |||
293 | return err; | 311 | return err; |
294 | } | 312 | } |
295 | 313 | ||
296 | static ssize_t fuse_send_write(struct fuse_req *req, struct file *file, | 314 | static size_t fuse_send_write(struct fuse_req *req, struct file *file, |
297 | struct inode *inode, loff_t pos, size_t count) | 315 | struct inode *inode, loff_t pos, size_t count) |
298 | { | 316 | { |
299 | struct fuse_conn *fc = get_fuse_conn(inode); | 317 | struct fuse_conn *fc = get_fuse_conn(inode); |
300 | struct fuse_file *ff = file->private_data; | 318 | struct fuse_file *ff = file->private_data; |
@@ -332,7 +350,7 @@ static int fuse_commit_write(struct file *file, struct page *page, | |||
332 | unsigned offset, unsigned to) | 350 | unsigned offset, unsigned to) |
333 | { | 351 | { |
334 | int err; | 352 | int err; |
335 | ssize_t nres; | 353 | size_t nres; |
336 | unsigned count = to - offset; | 354 | unsigned count = to - offset; |
337 | struct inode *inode = page->mapping->host; | 355 | struct inode *inode = page->mapping->host; |
338 | struct fuse_conn *fc = get_fuse_conn(inode); | 356 | struct fuse_conn *fc = get_fuse_conn(inode); |