Whamcloud - gitweb
LU-3087 mdd: Record layout changes.
authorHenri Doreau <henri.doreau@cea.fr>
Thu, 4 Apr 2013 14:18:22 +0000 (16:18 +0200)
committerOleg Drokin <oleg.drokin@intel.com>
Wed, 17 Apr 2013 20:30:33 +0000 (16:30 -0400)
1. Introduce a new CL_LAYOUT changelog record type.

2. Emit CL_LAYOUT records on layouts swap operations
and delayed LOVEA changes.

Signed-off-by: Henri Doreau <henri.doreau@cea.fr>
Change-Id: I5b94e9707b289e321e7d7f49a742ce3b002e2abb
Reviewed-on: http://review.whamcloud.com/5966
Reviewed-by: Fan Yong <fan.yong@intel.com>
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Alex Zhuravlev <alexey.zhuravlev@intel.com>
lustre/include/lustre/lustre_user.h
lustre/mdd/mdd_dir.c
lustre/mdd/mdd_internal.h
lustre/mdd/mdd_object.c

index f41e66b..79c678d 100644 (file)
@@ -655,6 +655,7 @@ enum changelog_rec_type {
         CL_MTIME    = 17, /* Precedence: setattr > mtime > ctime > atime */
         CL_CTIME    = 18,
         CL_ATIME    = 19,
+       CL_LAYOUT   = 20,
         CL_LAST
 };
 
@@ -662,7 +663,9 @@ static inline const char *changelog_type2str(int type) {
        static const char *changelog_str[] = {
                "MARK",  "CREAT", "MKDIR", "HLINK", "SLINK", "MKNOD", "UNLNK",
                "RMDIR", "RENME", "RNMTO", "OPEN",  "CLOSE", "IOCTL", "TRUNC",
-               "SATTR", "XATTR", "HSM",   "MTIME", "CTIME", "ATIME"  };
+               "SATTR", "XATTR", "HSM",   "MTIME", "CTIME", "ATIME", "LAYOUT"
+       };
+
        if (type >= 0 && type < CL_LAST)
                return changelog_str[type];
        return NULL;
index 82c5d1a..a587939 100644 (file)
@@ -1616,12 +1616,22 @@ static int mdd_create_data(const struct lu_env *env, struct md_object *pobj,
        if (rc)
                GOTO(stop, rc);
 
+       rc = mdd_declare_changelog_store(env, mdd, NULL, handle);
+       if (rc)
+               GOTO(stop, rc);
+
        rc = mdd_trans_start(env, mdd, handle);
        if (rc)
                GOTO(stop, rc);
 
        rc = dt_xattr_set(env, mdd_object_child(son), buf, XATTR_NAME_LOV,
                          0, handle, mdd_object_capa(env, son));
+
+       if (rc)
+               GOTO(stop, rc);
+
+       rc = mdd_changelog_data_store(env, mdd, CL_LAYOUT, 0, son, handle);
+
 stop:
        mdd_trans_stop(env, mdd, rc, handle);
 out_free:
index ee987f1..71c2c3c 100644 (file)
@@ -390,6 +390,10 @@ int mdd_declare_changelog_store(const struct lu_env *env,
                                struct thandle *handle);
 int mdd_changelog_store(const struct lu_env *env, struct mdd_device *mdd,
                        struct llog_changelog_rec *rec, struct thandle *th);
+int mdd_changelog_data_store(const struct lu_env *env, struct mdd_device *mdd,
+                            enum changelog_rec_type type, int flags,
+                            struct mdd_object *mdd_obj,
+                            struct thandle *handle);
 int mdd_changelog_ns_store(const struct lu_env *env, struct mdd_device *mdd,
                           enum changelog_rec_type type, unsigned flags,
                           struct mdd_object *target, struct mdd_object *parent,
index 311254d..c5a7da4 100644 (file)
@@ -672,11 +672,9 @@ static int mdd_fix_attr(const struct lu_env *env, struct mdd_object *obj,
  * \param mdd_obj - mdd_object of change
  * \param handle - transacion handle
  */
-static int mdd_changelog_data_store(const struct lu_env *env,
-                                   struct mdd_device *mdd,
-                                   enum changelog_rec_type type,
-                                   int flags, struct mdd_object *mdd_obj,
-                                   struct thandle *handle)
+int mdd_changelog_data_store(const struct lu_env *env, struct mdd_device *mdd,
+                            enum changelog_rec_type type, int flags,
+                            struct mdd_object *mdd_obj, struct thandle *handle)
 {
        const struct lu_fid             *tfid;
        struct llog_changelog_rec       *rec;
@@ -922,16 +920,22 @@ static int mdd_declare_xattr_set(const struct lu_env *env,
        if (rc)
                return rc;
 
-       /* Only record user xattr changes */
-       if ((strncmp("user.", name, 5) == 0)) {
+       /* Only record user and layout xattr changes */
+       if (strncmp(XATTR_USER_PREFIX, name,
+                   sizeof(XATTR_USER_PREFIX) - 1) == 0 ||
+           strncmp(XATTR_NAME_LOV, name,
+                   sizeof(XATTR_NAME_LOV) - 1) == 0) {
                rc = mdd_declare_changelog_store(env, mdd, NULL, handle);
                if (rc)
                        return rc;
        }
 
        /* If HSM data is modified, this could add a changelog */
-       if (strncmp(XATTR_NAME_HSM, name, sizeof(XATTR_NAME_HSM) - 1) == 0)
+       if (strncmp(XATTR_NAME_HSM, name, sizeof(XATTR_NAME_HSM) - 1) == 0) {
                rc = mdd_declare_changelog_store(env, mdd, NULL, handle);
+               if (rc)
+                       return rc;
+       }
 
        rc = mdd_declare_changelog_store(env, mdd, NULL, handle);
        return rc;
@@ -1056,8 +1060,10 @@ static int mdd_xattr_set(const struct lu_env *env, struct md_object *obj,
        if (rc)
                GOTO(stop, rc);
 
-       /* Only record system & user xattr changes */
-       if (strncmp(XATTR_USER_PREFIX, name,
+       if (strncmp(XATTR_NAME_LOV, name, sizeof(XATTR_NAME_LOV) - 1) == 0)
+               rc = mdd_changelog_data_store(env, mdd, CL_LAYOUT, 0, mdd_obj,
+                                             handle);
+       else if (strncmp(XATTR_USER_PREFIX, name,
                        sizeof(XATTR_USER_PREFIX) - 1) == 0 ||
            strncmp(POSIX_ACL_XATTR_ACCESS, name,
                        sizeof(POSIX_ACL_XATTR_ACCESS) - 1) == 0 ||
@@ -1424,6 +1430,15 @@ static int mdd_swap_layouts(const struct lu_env *env, struct md_object *obj1,
                }
                GOTO(stop, rc);
        }
+
+       /* Issue one changelog record per file */
+       rc = mdd_changelog_data_store(env, mdd, CL_LAYOUT, 0, fst_o, handle);
+       if (rc)
+               GOTO(stop, rc);
+
+       rc = mdd_changelog_data_store(env, mdd, CL_LAYOUT, 0, snd_o, handle);
+       if (rc)
+               GOTO(stop, rc);
        EXIT;
 
 stop: