diff options
author | Abhi Das <adas@redhat.com> | 2016-04-05 12:06:15 -0400 |
---|---|---|
committer | Bob Peterson <rpeterso@redhat.com> | 2016-04-05 12:06:15 -0400 |
commit | 611526756a3d0fa7f4d1c519397ba8898f40443f (patch) | |
tree | 170614d6a447935a0230d228415ea5a5c7c4b7c6 /fs/gfs2 | |
parent | 73cc86252bd8a547349d2856497eceaf4f2d1766 (diff) |
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: Abhi Das <adas@redhat.com>
Signed-off-by: Bob Peterson <rpeterso@redhat.com>
Diffstat (limited to 'fs/gfs2')
-rw-r--r-- | fs/gfs2/file.c | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c index c9384f932975..fd9a10e4518d 100644 --- a/fs/gfs2/file.c +++ b/fs/gfs2/file.c | |||
@@ -950,6 +950,30 @@ out_uninit: | |||
950 | return ret; | 950 | return ret; |
951 | } | 951 | } |
952 | 952 | ||
953 | static ssize_t gfs2_file_splice_read(struct file *in, loff_t *ppos, | ||
954 | struct pipe_inode_info *pipe, size_t len, | ||
955 | unsigned int flags) | ||
956 | { | ||
957 | struct inode *inode = in->f_mapping->host; | ||
958 | struct gfs2_inode *ip = GFS2_I(inode); | ||
959 | struct gfs2_holder gh; | ||
960 | int ret; | ||
961 | |||
962 | mutex_lock(&inode->i_mutex); | ||
963 | |||
964 | ret = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, 0, &gh); | ||
965 | if (ret) { | ||
966 | mutex_unlock(&inode->i_mutex); | ||
967 | return ret; | ||
968 | } | ||
969 | |||
970 | gfs2_glock_dq_uninit(&gh); | ||
971 | mutex_unlock(&inode->i_mutex); | ||
972 | |||
973 | return generic_file_splice_read(in, ppos, pipe, len, flags); | ||
974 | } | ||
975 | |||
976 | |||
953 | static ssize_t gfs2_file_splice_write(struct pipe_inode_info *pipe, | 977 | static ssize_t gfs2_file_splice_write(struct pipe_inode_info *pipe, |
954 | struct file *out, loff_t *ppos, | 978 | struct file *out, loff_t *ppos, |
955 | size_t len, unsigned int flags) | 979 | size_t len, unsigned int flags) |
@@ -1112,7 +1136,7 @@ const struct file_operations gfs2_file_fops = { | |||
1112 | .fsync = gfs2_fsync, | 1136 | .fsync = gfs2_fsync, |
1113 | .lock = gfs2_lock, | 1137 | .lock = gfs2_lock, |
1114 | .flock = gfs2_flock, | 1138 | .flock = gfs2_flock, |
1115 | .splice_read = generic_file_splice_read, | 1139 | .splice_read = gfs2_file_splice_read, |
1116 | .splice_write = gfs2_file_splice_write, | 1140 | .splice_write = gfs2_file_splice_write, |
1117 | .setlease = simple_nosetlease, | 1141 | .setlease = simple_nosetlease, |
1118 | .fallocate = gfs2_fallocate, | 1142 | .fallocate = gfs2_fallocate, |
@@ -1140,7 +1164,7 @@ const struct file_operations gfs2_file_fops_nolock = { | |||
1140 | .open = gfs2_open, | 1164 | .open = gfs2_open, |
1141 | .release = gfs2_release, | 1165 | .release = gfs2_release, |
1142 | .fsync = gfs2_fsync, | 1166 | .fsync = gfs2_fsync, |
1143 | .splice_read = generic_file_splice_read, | 1167 | .splice_read = gfs2_file_splice_read, |
1144 | .splice_write = gfs2_file_splice_write, | 1168 | .splice_write = gfs2_file_splice_write, |
1145 | .setlease = generic_setlease, | 1169 | .setlease = generic_setlease, |
1146 | .fallocate = gfs2_fallocate, | 1170 | .fallocate = gfs2_fallocate, |