- CDEBUG(D_INODE, "Closing epoch "LPU64" on "DFID". Count %d\n",
- o->mot_ioepoch, PFID(mdt_object_fid(o)), o->mot_epochcount);
-
- if (info->mti_attr.ma_attr.la_valid & LA_SIZE) {
- /* Do Size-on-MDS attribute update.
- * Size-on-MDS is re-enabled inside. */
- /* XXX: since we have opened the file, it is unnecessary
- * to check permission when close it. Between the "open"
- * and "close", maybe someone has changed the file mode
- * or flags, or the file created mode do not permit wirte,
- * and so on. Just set MDS_PERM_BYPASS for all the cases. */
- info->mti_attr.ma_attr_flags |= MDS_PERM_BYPASS | MDS_SOM;
- info->mti_attr.ma_attr.la_valid &= LA_SIZE | LA_BLOCKS |
- LA_ATIME | LA_MTIME | LA_CTIME;
- RETURN(mdt_attr_set(info, o, 0));
- } else
- mdt_sizeonmds_enable(info, o);
- RETURN(0);
+ CDEBUG(D_INODE, "Size-on-MDS attribute %s for epoch "LPU64
+ " on "DFID".\n", enable ? "update" : "disabling",
+ ioepoch, PFID(mdt_object_fid(obj)));
+
+ ma->ma_valid |= MA_SOM;
+ ma->ma_som = &info->mti_u.som.data;
+ if (enable) {
+ struct mdt_device *mdt = info->mti_mdt;
+ struct lu_attr *la = &ma->ma_attr;
+
+ ma->ma_som->msd_ioepoch = ioepoch;
+ ma->ma_som->msd_size = la->la_valid & LA_SIZE ? la->la_size : 0;
+ ma->ma_som->msd_blocks = la->la_valid & LA_BLOCKS ?
+ la->la_blocks : 0;
+ ma->ma_som->msd_mountid = mdt->mdt_mount_count;
+ ma->ma_attr.la_valid &= LA_ATIME | LA_MTIME | LA_CTIME;
+ } else {
+ ma->ma_som->msd_ioepoch = IOEPOCH_INVAL;
+ ma->ma_attr.la_valid &= LA_ATIME;
+ }
+
+ /* Since we have opened the file, it is unnecessary
+ * to check permission when close it. Between the "open"
+ * and "close", maybe someone has changed the file mode
+ * or flags, or the file created mode do not permit wirte,
+ * and so on. Just set MDS_PERM_BYPASS for all the cases. */
+ ma->ma_attr_flags |= MDS_PERM_BYPASS | MDS_SOM;
+
+ rc = mdt_attr_set(info, obj, ma, 0);
+ RETURN(rc);
+}
+
+/** Perform the eviction specific actions on ioepoch close. */
+static inline int mdt_ioepoch_close_on_eviction(struct mdt_thread_info *info,
+ struct mdt_object *o)
+{
+ int rc = 0;
+
+ cfs_down(&o->mot_ioepoch_sem);
+ CDEBUG(D_INODE, "Eviction. Closing IOepoch "LPU64" on "DFID". "
+ "Count %d\n", o->mot_ioepoch, PFID(mdt_object_fid(o)),
+ o->mot_ioepoch_count);
+ o->mot_ioepoch_count--;
+
+ /* If eviction occured set MOF_SOM_RECOV,
+ * if no other epoch holders, disable SOM on disk. */
+ o->mot_flags |= MOF_SOM_CHANGE | MOF_SOM_RECOV;
+ if (!mdt_ioepoch_opened(o)) {
+ rc = mdt_som_attr_set(info, o, o->mot_ioepoch, MDT_SOM_DISABLE);
+ mdt_object_som_enable(o, o->mot_ioepoch);
+ }
+ cfs_up(&o->mot_ioepoch_sem);
+ RETURN(rc);