- struct inode *inode = ccc_object_inode(obj);
-
- if (valid & CAT_UID)
- inode->i_uid = attr->cat_uid;
- if (valid & CAT_GID)
- inode->i_gid = attr->cat_gid;
- if (valid & CAT_ATIME)
- LTIME_S(inode->i_atime) = attr->cat_atime;
- if (valid & CAT_MTIME)
- LTIME_S(inode->i_mtime) = attr->cat_mtime;
- if (valid & CAT_CTIME)
- LTIME_S(inode->i_ctime) = attr->cat_ctime;
- if (0 && valid & CAT_SIZE)
- cl_isize_write_nolock(inode, attr->cat_size);
- /* not currently necessary */
- if (0 && valid & (CAT_UID|CAT_GID|CAT_SIZE))
- mark_inode_dirty(inode);
- return 0;
+ struct ll_inode_info *lli = ll_i2info(conf->coc_inode);
+
+ if (conf->coc_opc == OBJECT_CONF_INVALIDATE) {
+ CDEBUG(D_VFSTRACE, DFID ": losing layout lock\n",
+ PFID(&lli->lli_fid));
+
+ ll_layout_version_set(lli, CL_LAYOUT_GEN_NONE);
+
+ /* Clean up page mmap for this inode.
+ * The reason for us to do this is that if the page has
+ * already been installed into memory space, the process
+ * can access it without interacting with lustre, so this
+ * page may be stale due to layout change, and the process
+ * will never be notified.
+ * This operation is expensive but mmap processes have to pay
+ * a price themselves. */
+ unmap_mapping_range(conf->coc_inode->i_mapping,
+ 0, OBD_OBJECT_EOF, 0);
+ pcc_layout_invalidate(conf->coc_inode);
+ }
+ return 0;
+}
+
+static int vvp_prune(const struct lu_env *env, struct cl_object *obj)
+{
+ struct inode *inode = vvp_object_inode(obj);
+ int rc;
+ ENTRY;
+
+ rc = cl_sync_file_range(inode, 0, OBD_OBJECT_EOF, CL_FSYNC_LOCAL, 1);
+ if (rc < 0) {
+ CDEBUG(D_VFSTRACE, DFID ": writeback failed: %d\n",
+ PFID(lu_object_fid(&obj->co_lu)), rc);
+ RETURN(rc);
+ }
+
+ truncate_inode_pages(inode->i_mapping, 0);
+ if (inode->i_mapping->nrpages) {
+ CDEBUG(D_VFSTRACE, DFID ": still has %lu pages remaining\n",
+ PFID(lu_object_fid(&obj->co_lu)),
+ inode->i_mapping->nrpages);
+ RETURN(-EIO);
+ }
+
+ RETURN(0);
+}
+
+static int vvp_object_glimpse(const struct lu_env *env,
+ const struct cl_object *obj, struct ost_lvb *lvb)
+{
+ struct inode *inode = vvp_object_inode(obj);
+
+ ENTRY;
+ lvb->lvb_mtime = inode->i_mtime.tv_sec;
+ lvb->lvb_atime = inode->i_atime.tv_sec;
+ lvb->lvb_ctime = inode->i_ctime.tv_sec;
+
+ /*
+ * LU-417: Add dirty pages block count lest i_blocks reports 0, some
+ * "cp" or "tar" on remote node may think it's a completely sparse file
+ * and skip it.
+ */
+ if (lvb->lvb_size > 0 && lvb->lvb_blocks == 0)
+ lvb->lvb_blocks = dirty_cnt(inode);
+
+ RETURN(0);
+}
+
+static void vvp_req_attr_set(const struct lu_env *env, struct cl_object *obj,
+ struct cl_req_attr *attr)
+{
+ struct inode *inode;
+ struct obdo *oa;
+ u64 valid_flags = OBD_MD_FLTYPE | OBD_MD_FLUID | OBD_MD_FLGID;
+
+ oa = attr->cra_oa;
+ inode = vvp_object_inode(obj);
+
+ if (attr->cra_type == CRT_WRITE) {
+ valid_flags |= OBD_MD_FLMTIME | OBD_MD_FLCTIME;
+ obdo_set_o_projid(oa, ll_i2info(inode)->lli_projid);
+ } else if (attr->cra_type == CRT_READ) {
+ valid_flags |= OBD_MD_FLATIME;
+ }
+ obdo_from_inode(oa, inode, valid_flags & attr->cra_flags);
+ obdo_set_parent_fid(oa, &ll_i2info(inode)->lli_fid);
+ if (OBD_FAIL_CHECK(OBD_FAIL_LFSCK_INVALID_PFID))
+ oa->o_parent_oid++;
+ memcpy(attr->cra_jobid, ll_i2info(inode)->lli_jobid,
+ sizeof(attr->cra_jobid));