diff options
Diffstat (limited to 'fs/fuse/file.c')
-rw-r--r-- | fs/fuse/file.c | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/fs/fuse/file.c b/fs/fuse/file.c index d409deafc67b..4598345ab87d 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c | |||
@@ -2467,6 +2467,7 @@ static long fuse_file_fallocate(struct file *file, int mode, loff_t offset, | |||
2467 | { | 2467 | { |
2468 | struct fuse_file *ff = file->private_data; | 2468 | struct fuse_file *ff = file->private_data; |
2469 | struct inode *inode = file->f_inode; | 2469 | struct inode *inode = file->f_inode; |
2470 | struct fuse_inode *fi = get_fuse_inode(inode); | ||
2470 | struct fuse_conn *fc = ff->fc; | 2471 | struct fuse_conn *fc = ff->fc; |
2471 | struct fuse_req *req; | 2472 | struct fuse_req *req; |
2472 | struct fuse_fallocate_in inarg = { | 2473 | struct fuse_fallocate_in inarg = { |
@@ -2484,10 +2485,20 @@ static long fuse_file_fallocate(struct file *file, int mode, loff_t offset, | |||
2484 | 2485 | ||
2485 | if (lock_inode) { | 2486 | if (lock_inode) { |
2486 | mutex_lock(&inode->i_mutex); | 2487 | mutex_lock(&inode->i_mutex); |
2487 | if (mode & FALLOC_FL_PUNCH_HOLE) | 2488 | if (mode & FALLOC_FL_PUNCH_HOLE) { |
2488 | fuse_set_nowrite(inode); | 2489 | loff_t endbyte = offset + length - 1; |
2490 | err = filemap_write_and_wait_range(inode->i_mapping, | ||
2491 | offset, endbyte); | ||
2492 | if (err) | ||
2493 | goto out; | ||
2494 | |||
2495 | fuse_sync_writes(inode); | ||
2496 | } | ||
2489 | } | 2497 | } |
2490 | 2498 | ||
2499 | if (!(mode & FALLOC_FL_KEEP_SIZE)) | ||
2500 | set_bit(FUSE_I_SIZE_UNSTABLE, &fi->state); | ||
2501 | |||
2491 | req = fuse_get_req_nopages(fc); | 2502 | req = fuse_get_req_nopages(fc); |
2492 | if (IS_ERR(req)) { | 2503 | if (IS_ERR(req)) { |
2493 | err = PTR_ERR(req); | 2504 | err = PTR_ERR(req); |
@@ -2520,11 +2531,11 @@ static long fuse_file_fallocate(struct file *file, int mode, loff_t offset, | |||
2520 | fuse_invalidate_attr(inode); | 2531 | fuse_invalidate_attr(inode); |
2521 | 2532 | ||
2522 | out: | 2533 | out: |
2523 | if (lock_inode) { | 2534 | if (!(mode & FALLOC_FL_KEEP_SIZE)) |
2524 | if (mode & FALLOC_FL_PUNCH_HOLE) | 2535 | clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state); |
2525 | fuse_release_nowrite(inode); | 2536 | |
2537 | if (lock_inode) | ||
2526 | mutex_unlock(&inode->i_mutex); | 2538 | mutex_unlock(&inode->i_mutex); |
2527 | } | ||
2528 | 2539 | ||
2529 | return err; | 2540 | return err; |
2530 | } | 2541 | } |