ornagefs: ensure that truncate has an up to date inode size
Signed-off-by: Martin Brandenburg <martin@omnibond.com> Signed-off-by: Mike Marshall <hubcap@omnibond.com>
This commit is contained in:
Родитель
e8da254c41
Коммит
fecd86aac5
|
@ -157,7 +157,7 @@ static int orangefs_setattr_size(struct inode *inode, struct iattr *iattr)
|
|||
{
|
||||
struct orangefs_inode_s *orangefs_inode = ORANGEFS_I(inode);
|
||||
struct orangefs_kernel_op_s *new_op;
|
||||
loff_t orig_size = i_size_read(inode);
|
||||
loff_t orig_size;
|
||||
int ret = -EINVAL;
|
||||
|
||||
gossip_debug(GOSSIP_INODE_DEBUG,
|
||||
|
@ -168,6 +168,17 @@ static int orangefs_setattr_size(struct inode *inode, struct iattr *iattr)
|
|||
orangefs_inode->refn.fs_id,
|
||||
iattr->ia_size);
|
||||
|
||||
/* Ensure that we have a up to date size, so we know if it changed. */
|
||||
ret = orangefs_inode_getattr(inode, 0, 1);
|
||||
if (ret == -ESTALE)
|
||||
ret = -EIO;
|
||||
if (ret) {
|
||||
gossip_err("%s: orangefs_inode_getattr failed, ret:%d:.\n",
|
||||
__func__, ret);
|
||||
return ret;
|
||||
}
|
||||
orig_size = i_size_read(inode);
|
||||
|
||||
truncate_setsize(inode, iattr->ia_size);
|
||||
|
||||
new_op = op_alloc(ORANGEFS_VFS_OP_TRUNCATE);
|
||||
|
|
Загрузка…
Ссылка в новой задаче