Whamcloud - gitweb
b=23289 no need to always start transaction for attr_set(atime) on close
authorJian Yu <jian.yu@oracle.com>
Tue, 23 Nov 2010 05:24:11 +0000 (13:24 +0800)
committerVitaly Fertman <vitaly.fertman@oracle.com>
Tue, 23 Nov 2010 21:17:41 +0000 (00:17 +0300)
To reduce unnecessary transaction overhead on file closing.

o=Liang Zhen
i=mikhail.pershin
i=di.wang

lustre/mdd/mdd_object.c
lustre/mdt/mdt_open.c

index 604b713..95420dc 100644 (file)
@@ -1431,6 +1431,16 @@ static int mdd_attr_set(const struct lu_env *env, struct md_object *obj,
 #endif
         ENTRY;
 
 #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);
         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);
 
                 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;
 #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;
index e0d4072..d581b82 100644 (file)
@@ -1471,6 +1471,7 @@ int mdt_mfd_close(struct mdt_thread_info *info, struct mdt_file_data *mfd)
         if ((mode & MDS_FMODE_EXEC || mode & FMODE_READ || mode & FMODE_WRITE)
             && (ma->ma_valid & MA_INODE) && (ma->ma_attr.la_valid & LA_ATIME)) {
                 /* Set the atime only. */
         if ((mode & MDS_FMODE_EXEC || mode & FMODE_READ || mode & FMODE_WRITE)
             && (ma->ma_valid & MA_INODE) && (ma->ma_attr.la_valid & LA_ATIME)) {
                 /* Set the atime only. */
+                ma->ma_valid = MA_INODE;
                 ma->ma_attr.la_valid = LA_ATIME;
                 rc = mo_attr_set(info->mti_env, next, ma);
         }
                 ma->ma_attr.la_valid = LA_ATIME;
                 rc = mo_attr_set(info->mti_env, next, ma);
         }