bcachefs: fix truncate without a size change
Do not attempt to shortcut a truncate when the given new size is the same as the current size. There may be blocks allocated to the file that extend beyond the i_size. The ctime and mtime should not be updated in this case. Signed-off-by: Dan Robertson <dan@dlrobertson.com> Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
6f152b0f37
commit
78d66ab1ca
@ -2305,16 +2305,17 @@ int bch2_truncate(struct mnt_idmap *idmap,
|
||||
int ret = 0;
|
||||
|
||||
/*
|
||||
* Don't update timestamps if we're not doing anything:
|
||||
* If the truncate call with change the size of the file, the
|
||||
* cmtimes should be updated. If the size will not change, we
|
||||
* do not need to update the cmtimes.
|
||||
*/
|
||||
if (iattr->ia_size == inode->v.i_size)
|
||||
return 0;
|
||||
|
||||
if (!(iattr->ia_valid & ATTR_MTIME))
|
||||
ktime_get_coarse_real_ts64(&iattr->ia_mtime);
|
||||
if (!(iattr->ia_valid & ATTR_CTIME))
|
||||
ktime_get_coarse_real_ts64(&iattr->ia_ctime);
|
||||
iattr->ia_valid |= ATTR_MTIME|ATTR_CTIME;
|
||||
if (iattr->ia_size != inode->v.i_size) {
|
||||
if (!(iattr->ia_valid & ATTR_MTIME))
|
||||
ktime_get_coarse_real_ts64(&iattr->ia_mtime);
|
||||
if (!(iattr->ia_valid & ATTR_CTIME))
|
||||
ktime_get_coarse_real_ts64(&iattr->ia_ctime);
|
||||
iattr->ia_valid |= ATTR_MTIME|ATTR_CTIME;
|
||||
}
|
||||
|
||||
inode_dio_wait(&inode->v);
|
||||
bch2_pagecache_block_get(&inode->ei_pagecache_lock);
|
||||
|
Loading…
x
Reference in New Issue
Block a user