Commit 26eb3bae authored by Miklos Szeredi's avatar Miklos Szeredi
Browse files

fuse: extract helper for range writeback



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: default avatarMiklos Szeredi <mszeredi@redhat.com>
parent a2bc9236
Loading
Loading
Loading
Loading
+14 −12
Original line number Diff line number Diff line
@@ -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)
{
@@ -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);
		}
	}

@@ -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;
@@ -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)