/** * Cliens updates SOM attributes on MDS (including llog cookies): * obd_getattr with no lock and md_setattr. */ int ll_som_update(struct inode *inode, struct md_op_data *op_data) { struct ll_inode_info *lli = ll_i2info(inode); struct ptlrpc_request *request = NULL; __u32 old_flags; struct obdo *oa; int rc; ENTRY; LASSERT(op_data != NULL); if (lli->lli_flags & LLIF_MDS_SIZE_LOCK) CERROR("ino %lu/%u(flags %u) som valid it just after " "recovery\n", inode->i_ino, inode->i_generation, lli->lli_flags); OBDO_ALLOC(oa); if (!oa) { CERROR("can't allocate memory for Size-on-MDS update.\n"); RETURN(-ENOMEM); } old_flags = op_data->op_flags; op_data->op_flags = MF_SOM_CHANGE; /* If inode is already in another epoch, skip getattr from OSTs. */ if (lli->lli_ioepoch == op_data->op_ioepoch) { rc = ll_inode_getattr(inode, oa, op_data->op_ioepoch, old_flags & MF_GETATTR_LOCK); if (rc) { oa->o_valid = 0; if (rc != -ENOENT) 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); } else { CDEBUG(D_INODE, "Size-on-MDS update on "DFID"\n", PFID(&lli->lli_fid)); } /* Install attributes into op_data. */ md_from_obdo(op_data, oa, oa->o_valid); } rc = md_setattr(ll_i2sbi(inode)->ll_md_exp, op_data, NULL, 0, NULL, 0, &request, NULL); ptlrpc_req_finished(request); OBDO_FREE(oa); RETURN(rc); }
/** Cliens updates SOM attributes on MDS: obd_getattr and md_setattr. */ int llu_som_update(struct inode *inode, struct md_op_data *op_data) { struct llu_inode_info *lli = llu_i2info(inode); struct llu_sb_info *sbi = llu_i2sbi(inode); struct obdo oa = { 0 }; __u32 old_flags; int rc; ENTRY; LASSERT(!(lli->lli_flags & LLIF_MDS_SIZE_LOCK)); LASSERT(sbi->ll_lco.lco_flags & OBD_CONNECT_SOM); old_flags = op_data->op_flags; op_data->op_flags = MF_SOM_CHANGE; /* If inode is already in another epoch, skip getattr from OSTs. */ if (lli->lli_ioepoch == op_data->op_ioepoch) { rc = llu_inode_getattr(inode, &oa, op_data->op_ioepoch, old_flags & MF_GETATTR_LOCK); if (rc) { oa.o_valid = 0; if (rc == -ENOENT) CDEBUG(D_INODE, "objid "LPX64" is destroyed\n", lli->lli_smd->lsm_object_id); else CERROR("inode_getattr failed (%d): unable to " "send a Size-on-MDS attribute update " "for inode %llu/%lu\n", rc, (long long)llu_i2stat(inode)->st_ino, lli->lli_st_generation); } else { CDEBUG(D_INODE, "Size-on-MDS update on "DFID"\n", PFID(&lli->lli_fid)); } /* Install attributes into op_data. */ md_from_obdo(op_data, &oa, oa.o_valid); } rc = llu_md_setattr(inode, op_data, NULL); RETURN(rc); }