Skip to content

Commit

Permalink
fuse: extract helper for range writeback
Browse files Browse the repository at this point in the history
The fuse_writeback_range() helper flushes dirty data to the userspace
filesystem.

When the function returns, the WRITE requests for the data in the given
range have all been completed.  This is not equivalent to fsync() on the
given range, since the userspace filesystem may not yet have the data on
stable storage.

Signed-off-by: Miklos Szeredi <[email protected]>
  • Loading branch information
Miklos Szeredi committed May 28, 2019
1 parent a2bc923 commit 26eb3ba
Showing 1 changed file with 14 additions and 12 deletions.
26 changes: 14 additions & 12 deletions fs/fuse/file.c
Original file line number Diff line number Diff line change
Expand Up @@ -3021,6 +3021,16 @@ fuse_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
return ret;
}

static int fuse_writeback_range(struct inode *inode, loff_t start, loff_t end)
{
int err = filemap_write_and_wait_range(inode->i_mapping, start, end);

if (!err)
fuse_sync_writes(inode);

return err;
}

static long fuse_file_fallocate(struct file *file, int mode, loff_t offset,
loff_t length)
{
Expand Down Expand Up @@ -3049,12 +3059,10 @@ static long fuse_file_fallocate(struct file *file, int mode, loff_t offset,
inode_lock(inode);
if (mode & FALLOC_FL_PUNCH_HOLE) {
loff_t endbyte = offset + length - 1;
err = filemap_write_and_wait_range(inode->i_mapping,
offset, endbyte);

err = fuse_writeback_range(inode, offset, endbyte);
if (err)
goto out;

fuse_sync_writes(inode);
}
}

Expand Down Expand Up @@ -3136,10 +3144,7 @@ static ssize_t fuse_copy_file_range(struct file *file_in, loff_t pos_in,

if (fc->writeback_cache) {
inode_lock(inode_in);
err = filemap_write_and_wait_range(inode_in->i_mapping,
pos_in, pos_in + len);
if (!err)
fuse_sync_writes(inode_in);
err = fuse_writeback_range(inode_in, pos_in, pos_in + len);
inode_unlock(inode_in);
if (err)
return err;
Expand All @@ -3148,12 +3153,9 @@ static ssize_t fuse_copy_file_range(struct file *file_in, loff_t pos_in,
inode_lock(inode_out);

if (fc->writeback_cache) {
err = filemap_write_and_wait_range(inode_out->i_mapping,
pos_out, pos_out + len);
err = fuse_writeback_range(inode_out, pos_out, pos_out + len);
if (err)
goto out;

fuse_sync_writes(inode_out);
}

if (is_unstable)
Expand Down

0 comments on commit 26eb3ba

Please sign in to comment.