From: John L. Hammond Date: Tue, 9 Apr 2013 17:02:52 +0000 (-0500) Subject: LU-2789 lod: sidestep setstripe vs rename race X-Git-Tag: 2.3.64~13 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=040179b84330689b1b2cd128dcdd711bfc8f0b4e;hp=9a01e2b52ecec9dfd33068fe75afeaf102046091 LU-2789 lod: sidestep setstripe vs rename race In mdd_declare_link() and mdd_declare_rename() pass the actual attributes to be set down to mdo_declare_attr_set(). In lod_declare_attr_set() and lod_attr_set() only handle striping if setting UID or GID. Signed-off-by: John L. Hammond Change-Id: I511e35833042f6004fa6befd382831b7f33bef5a Reviewed-on: http://review.whamcloud.com/5802 Reviewed-by: Alex Zhuravlev Tested-by: Hudson Tested-by: Maloo Reviewed-by: Mike Pershin Reviewed-by: Oleg Drokin --- diff --git a/lustre/lod/lod_object.c b/lustre/lod/lod_object.c index a5c22cd..8fa06a6 100644 --- a/lustre/lod/lod_object.c +++ b/lustre/lod/lod_object.c @@ -291,6 +291,16 @@ static int lod_declare_attr_set(const struct lu_env *env, if (rc) RETURN(rc); + /* osp_declare_attr_set() ignores all attributes other than + * UID, GID, and size, and osp_attr_set() ignores all but UID + * and GID. Declaration of size attr setting happens through + * lod_declare_init_size(), and not through this function. + * Therefore we need not load striping unless ownership is + * changing. This should save memory and (we hope) speed up + * rename(). */ + if (!(attr->la_valid & (LA_UID | LA_GID))) + RETURN(rc); + /* * load striping information, notice we don't do this when object * is being initialized as we don't need this information till @@ -334,6 +344,9 @@ static int lod_attr_set(const struct lu_env *env, if (rc) RETURN(rc); + if (!(attr->la_valid & (LA_UID | LA_GID))) + RETURN(rc); + /* * if object is striped, apply changes to all the stripes */ diff --git a/lustre/mdd/mdd_dir.c b/lustre/mdd/mdd_dir.c index c28c068..2a8fd65 100644 --- a/lustre/mdd/mdd_dir.c +++ b/lustre/mdd/mdd_dir.c @@ -1193,6 +1193,7 @@ static int mdd_declare_link(const struct lu_env *env, struct mdd_object *c, const struct lu_name *name, struct thandle *handle, + struct lu_attr *la, struct linkea_data *data) { int rc; @@ -1205,11 +1206,13 @@ static int mdd_declare_link(const struct lu_env *env, if (rc) return rc; - rc = mdo_declare_attr_set(env, p, NULL, handle); - if (rc) - return rc; + la->la_valid = LA_CTIME | LA_MTIME; + rc = mdo_declare_attr_set(env, p, la, handle); + if (rc != 0) + return rc; - rc = mdo_declare_attr_set(env, c, NULL, handle); + la->la_valid = LA_CTIME; + rc = mdo_declare_attr_set(env, c, la, handle); if (rc) return rc; @@ -1243,8 +1246,11 @@ static int mdd_link(const struct lu_env *env, struct md_object *tgt_obj, memset(ldata, 0, sizeof(*ldata)); + LASSERT(ma->ma_attr.la_valid & LA_CTIME); + la->la_ctime = la->la_mtime = ma->ma_attr.la_ctime; + rc = mdd_declare_link(env, mdd, mdd_tobj, mdd_sobj, lname, handle, - ldata); + la, ldata); if (rc) GOTO(stop, rc); @@ -1274,9 +1280,6 @@ static int mdd_link(const struct lu_env *env, struct md_object *tgt_obj, GOTO(out_unlock, rc); } - LASSERT(ma->ma_attr.la_valid & LA_CTIME); - la->la_ctime = la->la_mtime = ma->ma_attr.la_ctime; - la->la_valid = LA_CTIME | LA_MTIME; rc = mdd_attr_check_set_internal(env, mdd_tobj, la, handle, 0); if (rc) @@ -1412,7 +1415,8 @@ static int mdd_declare_unlink(const struct lu_env *env, struct mdd_device *mdd, if (rc) return rc; - rc = mdo_declare_attr_set(env, c, NULL, handle); + la->la_valid = LA_CTIME; + rc = mdo_declare_attr_set(env, c, la, handle); if (rc) return rc; @@ -2390,6 +2394,9 @@ static int mdd_declare_rename(const struct lu_env *env, struct lu_attr *la = &mdd_env_info(env)->mti_la_for_fix; int rc; + LASSERT(ma->ma_attr.la_valid & LA_CTIME); + la->la_ctime = la->la_mtime = ma->ma_attr.la_ctime; + LASSERT(mdd_spobj); LASSERT(mdd_tpobj); LASSERT(mdd_sobj); @@ -2426,13 +2433,16 @@ static int mdd_declare_rename(const struct lu_env *env, } - rc = mdo_declare_attr_set(env, mdd_spobj, NULL, handle); - if (rc) - return rc; - - LASSERT(ma->ma_attr.la_valid & LA_CTIME); - la->la_ctime = la->la_mtime = ma->ma_attr.la_ctime; la->la_valid = LA_CTIME | LA_MTIME; + rc = mdo_declare_attr_set(env, mdd_spobj, la, handle); + if (rc != 0) + return rc; + + rc = mdo_declare_attr_set(env, mdd_tpobj, la, handle); + if (rc != 0) + return rc; + + la->la_valid = LA_CTIME; rc = mdo_declare_attr_set(env, mdd_sobj, la, handle); if (rc) return rc; @@ -2441,10 +2451,6 @@ static int mdd_declare_rename(const struct lu_env *env, if (rc) return rc; - rc = mdo_declare_attr_set(env, mdd_tpobj, NULL, handle); - if (rc) - return rc; - /* new name */ rc = mdo_declare_index_insert(env, mdd_tpobj, mdo2fid(mdd_sobj), tname->ln_name, handle); @@ -2477,7 +2483,8 @@ static int mdd_declare_rename(const struct lu_env *env, return rc; } - rc = mdo_declare_attr_set(env, mdd_tobj, NULL, handle); + la->la_valid = LA_CTIME; + rc = mdo_declare_attr_set(env, mdd_tobj, la, handle); if (rc) return rc;