X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fmdd%2Fmdd_object.c;h=6209af94235872700143155891adbde7d38e22e2;hp=4882609a24c689f0bdc7e9026480f2cc648dcae7;hb=ddd2b0e4c4170071948e27bf4e4dcd81ef24291e;hpb=2e0ad6d40070d38076c77038b7d48ac90af7b130;ds=sidebyside diff --git a/lustre/mdd/mdd_object.c b/lustre/mdd/mdd_object.c index 4882609..6209af9 100644 --- a/lustre/mdd/mdd_object.c +++ b/lustre/mdd/mdd_object.c @@ -372,7 +372,7 @@ static int mdd_path2fid(const struct lu_env *env, struct mdd_device *mdd, if (obj == NULL) GOTO(out, rc = -EREMOTE); if (IS_ERR(obj)) - GOTO(out, rc = -PTR_ERR(obj)); + GOTO(out, rc = PTR_ERR(obj)); /* get child fid from parent and name */ rc = mdd_lookup(env, &obj->mod_obj, lname, f, NULL); mdd_object_put(env, obj); @@ -435,7 +435,7 @@ static int mdd_path_current(const struct lu_env *env, if (mdd_obj == NULL) GOTO(out, rc = -EREMOTE); if (IS_ERR(mdd_obj)) - GOTO(out, rc = -PTR_ERR(mdd_obj)); + GOTO(out, rc = PTR_ERR(mdd_obj)); rc = lu_object_exists(&mdd_obj->mod_obj.mo_lu); if (rc <= 0) { mdd_object_put(env, mdd_obj); @@ -1431,6 +1431,16 @@ static int mdd_attr_set(const struct lu_env *env, struct md_object *obj, #endif ENTRY; + *la_copy = ma->ma_attr; + rc = mdd_fix_attr(env, mdd_obj, la_copy, ma); + if (rc != 0) + RETURN(rc); + + /* setattr on "close" only change atime, or do nothing */ + if (ma->ma_valid == MA_INODE && + ma->ma_attr.la_valid == LA_ATIME && la_copy->la_valid == 0) + RETURN(0); + mdd_setattr_txn_param_build(env, obj, (struct md_attr *)ma, MDD_TXN_ATTR_SET_OP); handle = mdd_trans_start(env, mdd); @@ -1456,11 +1466,6 @@ static int mdd_attr_set(const struct lu_env *env, struct md_object *obj, CDEBUG(D_INODE, "setting mtime "LPU64", ctime "LPU64"\n", ma->ma_attr.la_mtime, ma->ma_attr.la_ctime); - *la_copy = ma->ma_attr; - rc = mdd_fix_attr(env, mdd_obj, la_copy, ma); - if (rc) - GOTO(cleanup, rc); - #ifdef HAVE_QUOTA_SUPPORT if (mds->mds_quota && la_copy->la_valid & (LA_UID | LA_GID)) { struct obd_export *exp = md_quota(env)->mq_exp; @@ -1956,7 +1961,7 @@ int accmode(const struct lu_env *env, struct lu_attr *la, int flags) if (flags & (FMODE_WRITE | MDS_OPEN_TRUNC | MDS_OPEN_APPEND)) res |= MAY_WRITE; if (flags & MDS_FMODE_EXEC) - res |= MAY_EXEC; + res = MAY_EXEC; return res; } @@ -2063,7 +2068,7 @@ static int mdd_close(const struct lu_env *env, struct md_object *obj, { struct mdd_object *mdd_obj = md2mdd_obj(obj); struct mdd_device *mdd = mdo2mdd(obj); - struct thandle *handle; + struct thandle *handle = NULL; int rc; int reset = 1; @@ -2075,14 +2080,26 @@ static int mdd_close(const struct lu_env *env, struct md_object *obj, #endif ENTRY; - rc = mdd_log_txn_param_build(env, obj, ma, MDD_TXN_UNLINK_OP); - if (rc) - RETURN(rc); - handle = mdd_trans_start(env, mdo2mdd(obj)); - if (IS_ERR(handle)) - RETURN(PTR_ERR(handle)); + /* check without any lock */ + if (mdd_obj->mod_count == 1 && + (mdd_obj->mod_flags & (ORPHAN_OBJ | DEAD_OBJ)) != 0) { + again: + rc = mdd_log_txn_param_build(env, obj, ma, MDD_TXN_UNLINK_OP); + if (rc) + RETURN(rc); + handle = mdd_trans_start(env, mdo2mdd(obj)); + if (IS_ERR(handle)) + RETURN(PTR_ERR(handle)); + } mdd_write_lock(env, mdd_obj, MOR_TGT_CHILD); + if (handle == NULL && + mdd_obj->mod_count == 1 && + (mdd_obj->mod_flags & ORPHAN_OBJ) != 0) { + mdd_write_unlock(env, mdd_obj); + goto again; + } + /* release open count */ mdd_obj->mod_count --; @@ -2137,7 +2154,8 @@ out: ma->ma_valid &= ~(MA_LOV | MA_COOKIE); mdd_write_unlock(env, mdd_obj); - mdd_trans_stop(env, mdo2mdd(obj), rc, handle); + if (handle != NULL) + mdd_trans_stop(env, mdo2mdd(obj), rc, handle); #ifdef HAVE_QUOTA_SUPPORT if (quota_opc) /* Trigger dqrel on the owner of child. If failed, @@ -2435,4 +2453,6 @@ const struct md_object_operations mdd_obj_ops = { .moo_version_get = mdd_version_get, .moo_version_set = mdd_version_set, .moo_path = mdd_path, + .moo_file_lock = mdd_file_lock, + .moo_file_unlock = mdd_file_unlock, };