summaryrefslogtreecommitdiffstats
path: root/fs/ceph/addr.c
diff options
context:
space:
mode:
authorYan, Zheng <zyan@redhat.com>2015-12-29 22:32:46 -0500
committerIlya Dryomov <idryomov@gmail.com>2016-01-21 13:36:08 -0500
commit99c88e6900fb05d267ae9f6d5e15dc7192ba6f8d (patch)
tree025263471172932f2c0b332979cf56c60ae836db /fs/ceph/addr.c
parent5be0389dac662995eade757ec678931f0be23d33 (diff)
ceph: use i_size_{read,write} to get/set i_size
Cap message from MDS can update i_size. In that case, we don't hold i_mutex. So it's unsafe to directly access inode->i_size while holding i_mutex. Signed-off-by: Yan, Zheng <zyan@redhat.com>
Diffstat (limited to 'fs/ceph/addr.c')
-rw-r--r--fs/ceph/addr.c5
1 files changed, 2 insertions, 3 deletions
diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
index 6dfff0ba4d98..c22213789090 100644
--- a/fs/ceph/addr.c
+++ b/fs/ceph/addr.c
@@ -1108,7 +1108,7 @@ retry_locked:
1108 return 0; 1108 return 0;
1109 1109
1110 /* past end of file? */ 1110 /* past end of file? */
1111 i_size = inode->i_size; /* caller holds i_mutex */ 1111 i_size = i_size_read(inode);
1112 1112
1113 if (page_off >= i_size || 1113 if (page_off >= i_size ||
1114 (pos_in_page == 0 && (pos+len) >= i_size && 1114 (pos_in_page == 0 && (pos+len) >= i_size &&
@@ -1183,8 +1183,7 @@ static int ceph_write_end(struct file *file, struct address_space *mapping,
1183 zero_user_segment(page, from+copied, len); 1183 zero_user_segment(page, from+copied, len);
1184 1184
1185 /* did file size increase? */ 1185 /* did file size increase? */
1186 /* (no need for i_size_read(); we caller holds i_mutex */ 1186 if (pos+copied > i_size_read(inode))
1187 if (pos+copied > inode->i_size)
1188 check_cap = ceph_inode_set_size(inode, pos+copied); 1187 check_cap = ceph_inode_set_size(inode, pos+copied);
1189 1188
1190 if (!PageUptodate(page)) 1189 if (!PageUptodate(page))