Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 61152675 authored by Abhi Das's avatar Abhi Das Committed by Bob Peterson
Browse files

gfs2: Use gfs2 wrapper to sync inode before calling generic_file_splice_read()



gfs2_file_splice_read() f_op grabs and releases the cluster-wide
inode glock to sync the inode size to the latest.

Without this, generic_file_splice_read() uses an older i_size value
and can return EOF for valid offsets in the inode.

Signed-off-by: default avatarAbhi Das <adas@redhat.com>
Signed-off-by: default avatarBob Peterson <rpeterso@redhat.com>
parent 73cc8625
Loading
Loading
Loading
Loading
+26 −2
Original line number Diff line number Diff line
@@ -950,6 +950,30 @@ static long gfs2_fallocate(struct file *file, int mode, loff_t offset, loff_t le
	return ret;
}

static ssize_t gfs2_file_splice_read(struct file *in, loff_t *ppos,
				     struct pipe_inode_info *pipe, size_t len,
				     unsigned int flags)
{
	struct inode *inode = in->f_mapping->host;
	struct gfs2_inode *ip = GFS2_I(inode);
	struct gfs2_holder gh;
	int ret;

	mutex_lock(&inode->i_mutex);

	ret = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, 0, &gh);
	if (ret) {
		mutex_unlock(&inode->i_mutex);
		return ret;
	}

	gfs2_glock_dq_uninit(&gh);
	mutex_unlock(&inode->i_mutex);

	return generic_file_splice_read(in, ppos, pipe, len, flags);
}


static ssize_t gfs2_file_splice_write(struct pipe_inode_info *pipe,
				      struct file *out, loff_t *ppos,
				      size_t len, unsigned int flags)
@@ -1112,7 +1136,7 @@ const struct file_operations gfs2_file_fops = {
	.fsync		= gfs2_fsync,
	.lock		= gfs2_lock,
	.flock		= gfs2_flock,
	.splice_read	= generic_file_splice_read,
	.splice_read	= gfs2_file_splice_read,
	.splice_write	= gfs2_file_splice_write,
	.setlease	= simple_nosetlease,
	.fallocate	= gfs2_fallocate,
@@ -1140,7 +1164,7 @@ const struct file_operations gfs2_file_fops_nolock = {
	.open		= gfs2_open,
	.release	= gfs2_release,
	.fsync		= gfs2_fsync,
	.splice_read	= generic_file_splice_read,
	.splice_read	= gfs2_file_splice_read,
	.splice_write	= gfs2_file_splice_write,
	.setlease	= generic_setlease,
	.fallocate	= gfs2_fallocate,