static void vvp_io_setattr_end(const struct lu_env *env,
const struct cl_io_slice *ios)
{
- struct cl_io *io = ios->cis_io;
- struct inode *inode = vvp_object_inode(io->ci_obj);
- struct ll_inode_info *lli = ll_i2info(inode);
+ struct cl_io *io = ios->cis_io;
+ struct inode *inode = vvp_object_inode(io->ci_obj);
+ struct ll_inode_info *lli = ll_i2info(inode);
+ loff_t size = io->u.ci_setattr.sa_attr.lvb_size;
if (cl_io_is_trunc(io)) {
/* Truncate in memory pages - they must be clean pages
* because osc has already notified to destroy osc_extents. */
- vvp_do_vmtruncate(inode, io->u.ci_setattr.sa_attr.lvb_size);
+ vvp_do_vmtruncate(inode, size);
mutex_unlock(&lli->lli_setattr_mutex);
trunc_sem_up_write(&lli->lli_trunc_sem);
} else if (cl_io_is_fallocate(io)) {
+ int mode = io->u.ci_setattr.sa_falloc_mode;
+
+ if (!(mode & FALLOC_FL_KEEP_SIZE) &&
+ size > i_size_read(inode)) {
+ ll_inode_size_lock(inode);
+ i_size_write(inode, size);
+ ll_inode_size_unlock(inode);
+ }
+ inode->i_ctime = current_time(inode);
mutex_unlock(&lli->lli_setattr_mutex);
trunc_sem_up_write(&lli->lli_trunc_sem);
} else {
}
run_test 150g "Verify fallocate punch on large range"
+test_150h() {
+ local file=$DIR/$tfile
+ local size
+
+ check_set_fallocate_or_skip
+ statx_supported || skip_env "Test must be statx() syscall supported"
+
+ # fallocate() does not update the size information on the MDT
+ fallocate -l 16K $file || error "failed to fallocate $file"
+ cancel_lru_locks $OSC
+ # STATX with cached-always mode will not send glimpse RPCs to OST,
+ # it uses the caching attrs on the client side as much as possible.
+ size=$($STATX --cached=always -c %s $file)
+ [ $size == 16384 ] ||
+ error "size after fallocate() is $size, expected 16384"
+}
+run_test 150h "Verify extend fallocate updates the file size"
+
#LU-2902 roc_hit was not able to read all values from lproc
function roc_hit_init() {
local list=$(comma_list $(osts_nodes))