From c4f7a77e7bf58d6aa698eca752a39a1ce02947b3 Mon Sep 17 00:00:00 2001 From: Henri Doreau Date: Thu, 4 Apr 2013 16:18:22 +0200 Subject: [PATCH] LU-3087 mdd: Record layout changes. 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 Change-Id: I5b94e9707b289e321e7d7f49a742ce3b002e2abb Reviewed-on: http://review.whamcloud.com/5966 Reviewed-by: Fan Yong Tested-by: Hudson Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Alex Zhuravlev --- lustre/include/lustre/lustre_user.h | 5 ++++- lustre/mdd/mdd_dir.c | 10 ++++++++++ lustre/mdd/mdd_internal.h | 4 ++++ lustre/mdd/mdd_object.c | 35 +++++++++++++++++++++++++---------- 4 files changed, 43 insertions(+), 11 deletions(-) diff --git a/lustre/include/lustre/lustre_user.h b/lustre/include/lustre/lustre_user.h index f41e66b..79c678d 100644 --- a/lustre/include/lustre/lustre_user.h +++ b/lustre/include/lustre/lustre_user.h @@ -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; diff --git a/lustre/mdd/mdd_dir.c b/lustre/mdd/mdd_dir.c index 82c5d1ad..a587939 100644 --- a/lustre/mdd/mdd_dir.c +++ b/lustre/mdd/mdd_dir.c @@ -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: diff --git a/lustre/mdd/mdd_internal.h b/lustre/mdd/mdd_internal.h index ee987f1..71c2c3c 100644 --- a/lustre/mdd/mdd_internal.h +++ b/lustre/mdd/mdd_internal.h @@ -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, diff --git a/lustre/mdd/mdd_object.c b/lustre/mdd/mdd_object.c index 311254d..c5a7da4 100644 --- a/lustre/mdd/mdd_object.c +++ b/lustre/mdd/mdd_object.c @@ -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: -- 1.8.3.1