Whamcloud - gitweb
b=19964 SOM cleanups, part1
[fs/lustre-release.git] / lustre / llite / llite_close.c
index 28f5b07..f2f36c2 100644 (file)
@@ -122,9 +122,29 @@ void ll_queue_done_writing(struct inode *inode, unsigned long flags)
         EXIT;
 }
 
+void ll_done_writing_attr(struct inode *inode, struct md_op_data *op_data)
+{
+        struct ll_inode_info *lli = ll_i2info(inode);
+        ENTRY;
+
+        op_data->op_flags |= MF_SOM_CHANGE;
+        /* Check if Size-on-MDS attributes are valid. */
+        if (lli->lli_flags & LLIF_MDS_SIZE_LOCK)
+                CERROR("ino %lu/%u(flags %lu) som valid it just after "
+                       "recovery\n", inode->i_ino, inode->i_generation,
+                       lli->lli_flags);
+
+        if (!cl_local_size(inode)) {
+                /* Send Size-on-MDS Attributes if valid. */
+                op_data->op_attr.ia_valid |= ATTR_MTIME_SET | ATTR_CTIME_SET |
+                                ATTR_ATIME_SET | ATTR_SIZE | ATTR_BLOCKS;
+        }
+        EXIT;
+}
+
 /** Closes epoch and sends Size-on-MDS attribute update if possible.  Call
  * this under ll_inode_info::lli_lock spinlock. */
-void ll_epoch_close(struct inode *inode, struct md_op_data *op_data,
+void ll_ioepoch_close(struct inode *inode, struct md_op_data *op_data,
                     struct obd_client_handle **och, unsigned long flags)
 {
         struct ll_inode_info *lli = ll_i2info(inode);
@@ -187,20 +207,8 @@ void ll_epoch_close(struct inode *inode, struct md_op_data *op_data,
         LASSERT(list_empty(&club->cob_pending_list));
         lli->lli_flags &= ~LLIF_SOM_DIRTY;
         spin_unlock(&lli->lli_lock);
-        op_data->op_flags |= MF_SOM_CHANGE;
+        ll_done_writing_attr(inode, op_data);
 
-        /* Check if Size-on-MDS attributes are valid. */
-        if (lli->lli_flags & LLIF_MDS_SIZE_LOCK)
-                CWARN("ino %lu/%u(flags %lu) som valid it just after "
-                      "recovery\n",
-                      inode->i_ino, inode->i_generation, lli->lli_flags);
-
-        if (!cl_local_size(inode)) {
-                /* Send Size-on-MDS Attributes if valid. Atime is sent along
-                 * with all the attributes. */
-                op_data->op_attr.ia_valid |= ATTR_MTIME_SET | ATTR_CTIME_SET |
-                                ATTR_ATIME_SET | ATTR_SIZE | ATTR_BLOCKS;
-        }
         EXIT;
 out:
         return;
@@ -215,12 +223,10 @@ int ll_sizeonmds_update(struct inode *inode, struct lustre_handle *fh,
         int rc;
         ENTRY;
 
-        /* LASSERT(!(lli->lli_flags & LLIF_MDS_SIZE_LOCK)); */
-        /* After recovery that can be valid. */
         if (lli->lli_flags & LLIF_MDS_SIZE_LOCK)
-                CWARN("ino %lu/%u(flags %lu) som valid it just after "
-                      "recovery\n", inode->i_ino, inode->i_generation,
-                      lli->lli_flags);
+                CERROR("ino %lu/%u(flags %lu) som valid it just after "
+                       "recovery\n", inode->i_ino, inode->i_generation,
+                       lli->lli_flags);
 
         OBDO_ALLOC(oa);
         OBD_ALLOC_PTR(op_data);
@@ -228,20 +234,24 @@ int ll_sizeonmds_update(struct inode *inode, struct lustre_handle *fh,
                 CERROR("can't allocate memory for Size-on-MDS update.\n");
                 RETURN(-ENOMEM);
         }
-        rc = ll_inode_getattr(inode, oa);
-        if (rc == -ENOENT) {
-                oa->o_valid = 0;
-                CDEBUG(D_INODE, "objid "LPX64" is already destroyed\n",
-                       lli->lli_smd->lsm_object_id);
-        } else if (rc) {
-                CERROR("inode_getattr failed (%d): unable to send a "
-                       "Size-on-MDS attribute update for inode %lu/%u\n",
-                       rc, inode->i_ino, inode->i_generation);
-                GOTO(out, rc);
+        /* If inode is already in another epoch, skip getattr from OSTs. */
+        if (lli->lli_ioepoch == ioepoch) {
+                rc = ll_inode_getattr(inode, oa);
+                if (rc == -ENOENT) {
+                        oa->o_valid = 0;
+                        CDEBUG(D_INODE, "objid "LPX64" is already destroyed\n",
+                               lli->lli_smd->lsm_object_id);
+                } else if (rc) {
+                        CERROR("inode_getattr failed (%d): unable to send a "
+                               "Size-on-MDS attribute update for inode "
+                               "%lu/%u\n", rc, inode->i_ino,
+                               inode->i_generation);
+                        GOTO(out, rc);
+                }
+                CDEBUG(D_INODE, "Size-on-MDS update on "DFID"\n",
+                       PFID(&lli->lli_fid));
+                md_from_obdo(op_data, oa, oa->o_valid);
         }
-        CDEBUG(D_INODE, "Size-on-MDS update on "DFID"\n", PFID(&lli->lli_fid));
-
-        md_from_obdo(op_data, oa, oa->o_valid);
         memcpy(&op_data->op_handle, fh, sizeof(*fh));
 
         op_data->op_ioepoch = ioepoch;
@@ -266,7 +276,7 @@ static void ll_done_writing(struct inode *inode)
         int rc;
         ENTRY;
 
-        LASSERT(ll_i2mdexp(inode)->exp_connect_flags & OBD_CONNECT_SOM);
+        LASSERT(exp_connect_som(ll_i2mdexp(inode)));
 
         OBD_ALLOC_PTR(op_data);
         if (op_data == NULL) {
@@ -275,7 +285,7 @@ static void ll_done_writing(struct inode *inode)
                 return;
         }
 
-        ll_epoch_close(inode, op_data, &och, LLIF_DONE_WRITING);
+        ll_ioepoch_close(inode, op_data, &och, LLIF_DONE_WRITING);
         /* If there is no @och, we do not do D_W yet. */
         if (och == NULL)
                 GOTO(out, 0);
@@ -286,7 +296,7 @@ static void ll_done_writing(struct inode *inode)
         if (rc == -EAGAIN) {
                 /* MDS has instructed us to obtain Size-on-MDS attribute from
                  * OSTs and send setattr to back to MDS. */
-                rc = ll_sizeonmds_update(inode, &och->och_fh,
+                rc = ll_sizeonmds_update(inode, &op_data->op_handle,
                                          op_data->op_ioepoch);
         } else if (rc) {
                 CERROR("inode %lu mdc done_writing failed: rc = %d\n",