aboutsummaryrefslogtreecommitdiffstats
path: root/fs/gfs2
diff options
context:
space:
mode:
authorAbhi Das <adas@redhat.com>2016-04-05 12:06:15 -0400
committerBob Peterson <rpeterso@redhat.com>2016-04-05 12:06:15 -0400
commit611526756a3d0fa7f4d1c519397ba8898f40443f (patch)
tree170614d6a447935a0230d228415ea5a5c7c4b7c6 /fs/gfs2
parent73cc86252bd8a547349d2856497eceaf4f2d1766 (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.c28
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
953static 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
953static ssize_t gfs2_file_splice_write(struct pipe_inode_info *pipe, 977static 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,