X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fmds%2Fmds_open.c;h=510d8444ea8bcb3f37cab7fa66ed91434f07ddf1;hp=14d740bbd08b998d862dbbdf3b11205ed90a6a29;hb=794cb3c1776be961a3a06c9b7c7dbdcfd4a37493;hpb=bbce01b553de8ce3880cee5b156c4ec5616c616e diff --git a/lustre/mds/mds_open.c b/lustre/mds/mds_open.c index 14d740b..510d844 100644 --- a/lustre/mds/mds_open.c +++ b/lustre/mds/mds_open.c @@ -390,21 +390,10 @@ static int mds_create_objects(struct ptlrpc_request *req, int offset, if (rc) GOTO(out_oa, rc); } else { - OBD_ALLOC(lmm, mds->mds_max_mdsize); - if (lmm == NULL) - GOTO(out_oa, rc = -ENOMEM); - - lmm_size = mds->mds_max_mdsize; - rc = mds_get_md(obd, dchild->d_parent->d_inode, - lmm, &lmm_size, 1); - if (rc > 0) - rc = obd_iocontrol(OBD_IOC_LOV_SETSTRIPE, - mds->mds_osc_exp, - 0, &lsm, lmm); - OBD_FREE(lmm, mds->mds_max_mdsize); - if (rc) - GOTO(out_oa, rc); - } + /* Per-directory striping default code removed, because + * it uses the same unnamed EA storage as the directory + * striping for CMD. -p */ + } LASSERT(oa->o_gr >= FILTER_GROUP_FIRST_MDS); rc = obd_create(mds->mds_osc_exp, oa, &lsm, &oti); if (rc) { @@ -652,8 +641,20 @@ static int mds_finish_open(struct ptlrpc_request *req, struct dentry *dchild, up(&dchild->d_inode->i_sem); RETURN(rc); } + if (S_ISREG(dchild->d_inode->i_mode) && + (body->valid & OBD_MD_FLEASIZE)) { + rc = mds_revalidate_lov_ea(obd, dchild->d_inode, + req->rq_repmsg, 2); + if (!rc) + rc = mds_pack_md(obd, req->rq_repmsg, 2, body, + dchild->d_inode, 0); + if (rc) { + up(&dchild->d_inode->i_sem); + RETURN(rc); + } + } } - /* If the inode has EA data, then OSTs hold size, mtime */ + /* If the inode has no EA data, then MDSs hold size, mtime */ if (S_ISREG(dchild->d_inode->i_mode) && !(body->valid & OBD_MD_FLEASIZE)) { body->valid |= (OBD_MD_FLSIZE | OBD_MD_FLBLOCKS | @@ -817,6 +818,10 @@ int mds_open(struct mds_update_record *rec, int offset, int mea_size, update_mode; ENTRY; + DEBUG_REQ(D_INODE, req, "parent "LPU64"/%u name %*s mode %o", + rec->ur_fid1->id, rec->ur_fid1->generation, + rec->ur_namelen - 1, rec->ur_name, rec->ur_mode); + parent_lockh[0].cookie = 0; parent_lockh[1].cookie = 0; @@ -908,9 +913,13 @@ int mds_open(struct mds_update_record *rec, int offset, * should live at this MDS or at another one */ int i; i = mea_name2idx(mea, rec->ur_name, rec->ur_namelen - 1); - if (mea->mea_master != i) { - CERROR("inapropriate MDS(%d) for %s. should be %d\n", - mea->mea_master, rec->ur_name, i); + if (mea->mea_master != mea->mea_fids[i].mds) { + CDEBUG(D_OTHER, + "%s: inapropriate MDS(%d) for %lu/%u:%s." + " should be %d(%d)\n", obd->obd_name, + mea->mea_master, dparent->d_inode->i_ino, + dparent->d_inode->i_generation, rec->ur_name, + mea->mea_fids[i].mds, i); GOTO(cleanup, rc = -ERESTART); } } @@ -972,15 +981,16 @@ got_child: unsigned long ino = rec->ur_fid2->id; struct iattr iattr; struct inode *inode; - - if ((rc = mds_try_to_split_dir(obd, dparent, &mea, 0))) { - if (rc > 0) { - /* dir got splitted */ - GOTO(cleanup, rc = -ERESTART); - } else { - /* error happened during spitting */ - GOTO(cleanup, rc); - } + rc = mds_try_to_split_dir(obd, dparent, &mea, 0, update_mode); + CDEBUG(D_OTHER, "%s: splitted %lu/%u - %d\n", + obd->obd_name, dparent->d_inode->i_ino, + dparent->d_inode->i_generation, rc); + if (rc > 0) { + /* dir got splitted */ + GOTO(cleanup, rc = -ERESTART); + } else if (rc < 0) { + /* error happened during spitting */ + GOTO(cleanup, rc); } if (!(rec->ur_flags & MDS_OPEN_CREAT)) { @@ -1099,24 +1109,6 @@ got_child: } } - if (rc == 0) { - struct ldlm_res_id res_id = { . name = {0} }; - ldlm_policy_data_t policy; - int flags = 0; - res_id.name[0] = dchild->d_inode->i_ino; - res_id.name[1] = dchild->d_inode->i_generation; - policy.l_inodebits.bits = MDS_INODELOCK_LOOKUP | - MDS_INODELOCK_UPDATE; - rc = ldlm_cli_enqueue(NULL, NULL, obd->obd_namespace, - res_id, LDLM_IBITS, &policy, - LCK_PR, &flags, - mds_blocking_ast, - ldlm_completion_ast, NULL, NULL, - NULL, 0, NULL, child_lockh); - if (rc == 0) - cleanup_phase = 3; - } - /* Step 5: mds_open it */ rc = mds_finish_open(req, dchild, body, rec->ur_flags, &handle, rec, rep); @@ -1127,9 +1119,6 @@ got_child: req, rc, rep ? rep->lock_policy_res1 : 0); switch (cleanup_phase) { - case 3: - if (rc) - ldlm_lock_decref(child_lockh, LCK_PR); case 2: if (rc && created) { int err = vfs_unlink(dparent->d_inode, dchild); @@ -1139,7 +1128,9 @@ got_child: err); } } else if (created) { +#if 0 mds_lock_new_child(obd, dchild->d_inode, NULL); +#endif } l_dput(dchild); case 1: @@ -1160,8 +1151,6 @@ got_child: atomic_inc(&mds->mds_open_count); if (mea) OBD_FREE(mea, mea_size); - if ((cleanup_phase != 3) && !rc) - rc = ENOLCK; RETURN(rc); }