__u32 enqflags = 0;
if (cl_io_is_trunc(io)) {
- if (io->u.ci_setattr.sa_attr.lvb_size == 0)
+ struct inode *inode = vvp_object_inode(io->ci_obj);
+
+ /* set enqueue flags to CEF_MUST in case of encrypted file,
+ * to prevent lockless truncate
+ */
+ if (S_ISREG(inode->i_mode) && IS_ENCRYPTED(inode))
+ enqflags = CEF_MUST;
+ else if (io->u.ci_setattr.sa_attr.lvb_size == 0)
enqflags = CEF_DISCARD_DATA;
} else if (cl_io_is_fallocate(io)) {
lock_start = io->u.ci_setattr.sa_falloc_offset;
if (cl_io_is_trunc(io)) {
trunc_sem_down_write(&lli->lli_trunc_sem);
- inode_lock(inode);
+ mutex_lock(&lli->lli_setattr_mutex);
inode_dio_wait(inode);
} else if (cl_io_is_fallocate(io)) {
inode_lock(inode);
inode_dio_wait(inode);
} else {
- inode_lock(inode);
+ mutex_lock(&lli->lli_setattr_mutex);
}
if (io->u.ci_setattr.sa_avalid & TIMES_SET_FLAGS)
/* 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);
- inode_unlock(inode);
+ mutex_unlock(&lli->lli_setattr_mutex);
trunc_sem_up_write(&lli->lli_trunc_sem);
} else if (cl_io_is_fallocate(io)) {
inode_unlock(inode);
} else {
- inode_unlock(inode);
+ mutex_unlock(&lli->lli_setattr_mutex);
}
}
ClearPageReclaim(pvec->pages[i]);
LASSERTF(page->mapping,
- "mapping must be set. page %p, page->private (cl_page) %p",
+ "mapping must be set. page %p, page->private (cl_page) %p\n",
page, (void *) page->private);
/* Rest of code derived from __set_page_dirty_nobuffers */