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);
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;
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);
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;
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) {
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);
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",