X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fmds%2Fmds_lmv.c;h=9dca6e354fbb947dc6c74eb0d72901e0cb9a7be2;hp=a49bf89ff82176c78eda5463c2ef264be6561633;hb=e44e9b278432a1df83482b1cd83b2081fabe94dc;hpb=2dc9c16e770415d56839e1996015fec5fab93f29 diff --git a/lustre/mds/mds_lmv.c b/lustre/mds/mds_lmv.c index a49bf89..9dca6e3 100644 --- a/lustre/mds/mds_lmv.c +++ b/lustre/mds/mds_lmv.c @@ -411,6 +411,46 @@ int scan_and_distribute(struct obd_device *obd, struct dentry *dentry, #define MAX_DIR_SIZE (64 * 1024) +int mds_splitting_expected(struct obd_device *obd, struct dentry *dentry) +{ + struct mds_obd *mds = &obd->u.mds; + struct mea *mea = NULL; + int rc, size; + + /* clustered MD ? */ + if (!mds->mds_lmv_obd) + RETURN(0); + + /* inode exist? */ + if (dentry->d_inode == NULL) + return 0; + + /* a dir can be splitted only */ + if (!S_ISDIR(dentry->d_inode->i_mode)) + return 0; + + /* large enough to be splitted? */ + if (dentry->d_inode->i_size < MAX_DIR_SIZE) + return 0; + + /* don't split root directory */ + if (dentry->d_inode->i_ino == mds->mds_rootfid.id) + return 0; + + mds_get_lmv_attr(obd, dentry->d_inode, &mea, &size); + if (mea) { + /* already splitted or slave object: shouldn't be splitted */ + rc = 0; + } else { + /* may be splitted */ + rc = 1; + } + + if (mea) + OBD_FREE(mea, size); + RETURN(rc); +} + /* * must not be called on already splitted directories */ @@ -425,22 +465,10 @@ int mds_try_to_split_dir(struct obd_device *obd, void *handle; ENTRY; - /* clustered MD ? */ - if (!mds->mds_lmv_obd) - RETURN(0); - - /* don't split root directory */ - if (dentry->d_inode->i_ino == mds->mds_rootfid.id) - RETURN(0); - - /* we want to split only large dirs. this may be already - * splitted dir or a slave dir created during splitting */ - if (dir->i_size < MAX_DIR_SIZE) - RETURN(0); - - /* check is directory marked non-splittable */ - if (mea && *mea) + /* TODO: optimization possible - we already may have mea here */ + if (!mds_splitting_expected(obd, dentry)) RETURN(0); + LASSERT(mea == NULL || *mea == NULL); CDEBUG(D_OTHER, "%s: split directory %u/%lu/%lu\n", obd->obd_name, mds->mds_num, dir->i_ino, @@ -459,8 +487,6 @@ int mds_try_to_split_dir(struct obd_device *obd, RETURN(-ENOMEM); (*mea)->mea_count = nstripes; -#warning "we have to take EX lock on a dir for splitting" - /* 1) create directory objects on slave MDS'es */ /* FIXME: should this be OBD method? */ oa = obdo_alloc(); @@ -490,7 +516,7 @@ int mds_try_to_split_dir(struct obd_device *obd, LASSERT(!IS_ERR(handle)); rc = fsfilt_set_md(obd, dir, handle, *mea, mea_size); LASSERT(rc == 0); - fsfilt_commit(obd, dir, handle, 0); + fsfilt_commit(obd, mds->mds_sb, dir, handle, 0); LASSERT(rc == 0); up(&dir->i_sem); obdo_free(oa); @@ -647,7 +673,7 @@ int mds_choose_mdsnum(struct obd_device *obd, const char *name, int len, int fla i = mds->mds_num; } else if (mds->mds_lmv_exp) { lmv = &mds->mds_lmv_exp->exp_obd->u.lmv; - i = raw_name2idx(lmv->count, name, len); + i = raw_name2idx(lmv->desc.ld_tgt_count, name, len); } RETURN(i); }