@@ -1287,7 +1287,7 @@ int ll_statfs_internal(struct ll_sb_info *sbi, struct obd_statfs *osfs,
void ll_update_inode_flags(struct inode *inode, unsigned int ext_flags);
void ll_update_dir_depth(struct inode *dir, struct inode *inode);
int ll_read_inode2(struct inode *inode, void *opaque);
-void ll_truncate_inode_pages_final(struct inode *inode);
+void ll_truncate_inode_pages_final(struct inode *inode, struct cl_io *io);
void ll_delete_inode(struct inode *inode);
int ll_iocontrol(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg);
@@ -2755,12 +2755,15 @@ void ll_update_dir_depth(struct inode *dir, struct inode *inode)
PFID(&lli->lli_fid), lli->lli_dir_depth, lli->lli_inherit_depth);
}
-void ll_truncate_inode_pages_final(struct inode *inode)
+void ll_truncate_inode_pages_final(struct inode *inode, struct cl_io *io)
{
struct address_space *mapping = &inode->i_data;
unsigned long nrpages;
unsigned long flags;
+ LASSERTF(io == NULL || inode_is_locked(inode), "io %p (type %d)\n",
+ io, io ? io->ci_type : 0);
+
truncate_inode_pages_final(mapping);
/* Workaround for LU-118: Note nrpages may not be totally updated when
@@ -2777,9 +2780,10 @@ void ll_truncate_inode_pages_final(struct inode *inode)
xa_unlock_irqrestore(&mapping->i_pages, flags);
} /* Workaround end */
- LASSERTF(nrpages == 0, "%s: inode="DFID"(%p) nrpages=%lu, see https://jira.whamcloud.com/browse/LU-118\n",
+ LASSERTF(nrpages == 0, "%s: inode="DFID"(%p) nrpages=%lu io %p (io_type %d), see https://jira.whamcloud.com/browse/LU-118\n",
ll_i2sbi(inode)->ll_fsname,
- PFID(ll_inode2fid(inode)), inode, nrpages);
+ PFID(ll_inode2fid(inode)), inode, nrpages,
+ io, io ? io->ci_type : 0);
}
int ll_read_inode2(struct inode *inode, void *opaque)
@@ -2843,7 +2847,7 @@ void ll_delete_inode(struct inode *inode)
CL_FSYNC_LOCAL : CL_FSYNC_DISCARD, 1);
}
- ll_truncate_inode_pages_final(inode);
+ ll_truncate_inode_pages_final(inode, NULL);
ll_clear_inode(inode);
clear_inode(inode);
}
@@ -153,6 +153,7 @@ static int vvp_conf_set(const struct lu_env *env, struct cl_object *obj,
static int vvp_prune(const struct lu_env *env, struct cl_object *obj)
{
+ struct cl_io *io = vvp_env_io(env)->vui_cl.cis_io;
struct inode *inode = vvp_object_inode(obj);
int rc;
@@ -163,9 +164,15 @@ static int vvp_prune(const struct lu_env *env, struct cl_object *obj)
return rc;
}
- ll_truncate_inode_pages_final(inode);
+ if (io != NULL)
+ inode_lock(inode);
+
+ ll_truncate_inode_pages_final(inode, io);
mapping_clear_exiting(inode->i_mapping);
+ if (io != NULL)
+ inode_unlock(inode);
+
return 0;
}