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>
This commit is contained in:
@@ -548,7 +548,7 @@ int ceph_fill_file_size(struct inode *inode, int issued,
|
||||
if (ceph_seq_cmp(truncate_seq, ci->i_truncate_seq) > 0 ||
|
||||
(truncate_seq == ci->i_truncate_seq && size > inode->i_size)) {
|
||||
dout("size %lld -> %llu\n", inode->i_size, size);
|
||||
inode->i_size = size;
|
||||
i_size_write(inode, size);
|
||||
inode->i_blocks = (size + (1<<9) - 1) >> 9;
|
||||
ci->i_reported_size = size;
|
||||
if (truncate_seq != ci->i_truncate_seq) {
|
||||
@@ -808,7 +808,7 @@ static int fill_inode(struct inode *inode, struct page *locked_page,
|
||||
spin_unlock(&ci->i_ceph_lock);
|
||||
|
||||
err = -EINVAL;
|
||||
if (WARN_ON(symlen != inode->i_size))
|
||||
if (WARN_ON(symlen != i_size_read(inode)))
|
||||
goto out;
|
||||
|
||||
err = -ENOMEM;
|
||||
@@ -1549,7 +1549,7 @@ int ceph_inode_set_size(struct inode *inode, loff_t size)
|
||||
|
||||
spin_lock(&ci->i_ceph_lock);
|
||||
dout("set_size %p %llu -> %llu\n", inode, inode->i_size, size);
|
||||
inode->i_size = size;
|
||||
i_size_write(inode, size);
|
||||
inode->i_blocks = (size + (1 << 9) - 1) >> 9;
|
||||
|
||||
/* tell the MDS if we are approaching max_size */
|
||||
@@ -1911,7 +1911,7 @@ int ceph_setattr(struct dentry *dentry, struct iattr *attr)
|
||||
inode->i_size, attr->ia_size);
|
||||
if ((issued & CEPH_CAP_FILE_EXCL) &&
|
||||
attr->ia_size > inode->i_size) {
|
||||
inode->i_size = attr->ia_size;
|
||||
i_size_write(inode, attr->ia_size);
|
||||
inode->i_blocks =
|
||||
(attr->ia_size + (1 << 9) - 1) >> 9;
|
||||
inode->i_ctime = attr->ia_ctime;
|
||||
|
Reference in New Issue
Block a user