diff options
Diffstat (limited to 'fs/fuse/inode.c')
-rw-r--r-- | fs/fuse/inode.c | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index 13a7e8ab7a78..412892905838 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c | |||
@@ -98,6 +98,14 @@ static void fuse_clear_inode(struct inode *inode) | |||
98 | } | 98 | } |
99 | } | 99 | } |
100 | 100 | ||
101 | static int fuse_remount_fs(struct super_block *sb, int *flags, char *data) | ||
102 | { | ||
103 | if (*flags & MS_MANDLOCK) | ||
104 | return -EINVAL; | ||
105 | |||
106 | return 0; | ||
107 | } | ||
108 | |||
101 | void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr) | 109 | void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr) |
102 | { | 110 | { |
103 | if (S_ISREG(inode->i_mode) && i_size_read(inode) != attr->size) | 111 | if (S_ISREG(inode->i_mode) && i_size_read(inode) != attr->size) |
@@ -409,6 +417,7 @@ static struct super_operations fuse_super_operations = { | |||
409 | .destroy_inode = fuse_destroy_inode, | 417 | .destroy_inode = fuse_destroy_inode, |
410 | .read_inode = fuse_read_inode, | 418 | .read_inode = fuse_read_inode, |
411 | .clear_inode = fuse_clear_inode, | 419 | .clear_inode = fuse_clear_inode, |
420 | .remount_fs = fuse_remount_fs, | ||
412 | .put_super = fuse_put_super, | 421 | .put_super = fuse_put_super, |
413 | .umount_begin = fuse_umount_begin, | 422 | .umount_begin = fuse_umount_begin, |
414 | .statfs = fuse_statfs, | 423 | .statfs = fuse_statfs, |
@@ -428,8 +437,12 @@ static void process_init_reply(struct fuse_conn *fc, struct fuse_req *req) | |||
428 | ra_pages = arg->max_readahead / PAGE_CACHE_SIZE; | 437 | ra_pages = arg->max_readahead / PAGE_CACHE_SIZE; |
429 | if (arg->flags & FUSE_ASYNC_READ) | 438 | if (arg->flags & FUSE_ASYNC_READ) |
430 | fc->async_read = 1; | 439 | fc->async_read = 1; |
431 | } else | 440 | if (!(arg->flags & FUSE_POSIX_LOCKS)) |
441 | fc->no_lock = 1; | ||
442 | } else { | ||
432 | ra_pages = fc->max_read / PAGE_CACHE_SIZE; | 443 | ra_pages = fc->max_read / PAGE_CACHE_SIZE; |
444 | fc->no_lock = 1; | ||
445 | } | ||
433 | 446 | ||
434 | fc->bdi.ra_pages = min(fc->bdi.ra_pages, ra_pages); | 447 | fc->bdi.ra_pages = min(fc->bdi.ra_pages, ra_pages); |
435 | fc->minor = arg->minor; | 448 | fc->minor = arg->minor; |
@@ -447,7 +460,7 @@ static void fuse_send_init(struct fuse_conn *fc, struct fuse_req *req) | |||
447 | arg->major = FUSE_KERNEL_VERSION; | 460 | arg->major = FUSE_KERNEL_VERSION; |
448 | arg->minor = FUSE_KERNEL_MINOR_VERSION; | 461 | arg->minor = FUSE_KERNEL_MINOR_VERSION; |
449 | arg->max_readahead = fc->bdi.ra_pages * PAGE_CACHE_SIZE; | 462 | arg->max_readahead = fc->bdi.ra_pages * PAGE_CACHE_SIZE; |
450 | arg->flags |= FUSE_ASYNC_READ; | 463 | arg->flags |= FUSE_ASYNC_READ | FUSE_POSIX_LOCKS; |
451 | req->in.h.opcode = FUSE_INIT; | 464 | req->in.h.opcode = FUSE_INIT; |
452 | req->in.numargs = 1; | 465 | req->in.numargs = 1; |
453 | req->in.args[0].size = sizeof(*arg); | 466 | req->in.args[0].size = sizeof(*arg); |
@@ -479,6 +492,9 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent) | |||
479 | struct fuse_req *init_req; | 492 | struct fuse_req *init_req; |
480 | int err; | 493 | int err; |
481 | 494 | ||
495 | if (sb->s_flags & MS_MANDLOCK) | ||
496 | return -EINVAL; | ||
497 | |||
482 | if (!parse_fuse_opt((char *) data, &d)) | 498 | if (!parse_fuse_opt((char *) data, &d)) |
483 | return -EINVAL; | 499 | return -EINVAL; |
484 | 500 | ||