X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fmgs%2Fmgs_barrier.c;h=b624f895fba774dde78dd66dbb0ea2fb7f5dba83;hb=777b04a093;hp=7d9893776b372af4b6b392b0680cc3d60bd1593d;hpb=b5baf050c9ca5bc73a77ba2089b525a8b58b57ab;p=fs%2Flustre-release.git diff --git a/lustre/mgs/mgs_barrier.c b/lustre/mgs/mgs_barrier.c index 7d98937..b624f89 100644 --- a/lustre/mgs/mgs_barrier.c +++ b/lustre/mgs/mgs_barrier.c @@ -20,7 +20,7 @@ * GPL HEADER END */ /* - * Copyright (c) 2016, Intel Corporation. + * Copyright (c) 2017, Intel Corporation. * * lustre/mgs/mgs_barrier.c * @@ -30,9 +30,9 @@ #define DEBUG_SUBSYSTEM S_MGS #define D_MGS D_CONFIG -#include +#include #include -#include +#include #include "mgs_internal.h" @@ -121,7 +121,7 @@ static int mgs_barrier_glimpse_lock(const struct lu_env *env, struct ldlm_resource *res; struct ldlm_glimpse_work *work; struct ldlm_glimpse_work *tmp; - struct list_head gl_list = LIST_HEAD_INIT(gl_list); + LIST_HEAD(gl_list); struct list_head *pos; int i; int rc; @@ -311,17 +311,36 @@ static int mgs_barrier_freeze(const struct lu_env *env, down_write(&mgs->mgs_barrier_rwsem); mutex_lock(&mgs->mgs_mutex); - fsdb = mgs_find_fsdb(mgs, name); - if (!fsdb) { + rc = mgs_find_or_make_fsdb_nolock(env, mgs, name, &fsdb); + if (rc) { mutex_unlock(&mgs->mgs_mutex); up_write(&mgs->mgs_barrier_rwsem); - - RETURN(-ENODEV); + RETURN(rc); } - if (unlikely(fsdb->fsdb_mdt_count == 0)) + if (unlikely(fsdb->fsdb_mdt_count == 0)) { mgs_barrier_bitmap_setup(mgs, fsdb, bc->bc_name); + /* fsdb was just created, ensure that fsdb_barrier_disabled is + * set correctly */ + if (fsdb->fsdb_mdt_count > 0) { + struct obd_export *exp; + struct obd_device *mgs_obd = mgs->mgs_obd; + + spin_lock(&mgs_obd->obd_dev_lock); + list_for_each_entry(exp, &mgs_obd->obd_exports, + exp_obd_chain) { + __u64 flags = exp_connect_flags(exp); + if (!!(flags & OBD_CONNECT_MDS_MDS) && + !(flags & OBD_CONNECT_BARRIER)) { + fsdb->fsdb_barrier_disabled = 1; + break; + } + } + spin_unlock(&mgs_obd->obd_dev_lock); + } + } + mutex_lock(&fsdb->fsdb_mutex); mutex_unlock(&mgs->mgs_mutex); @@ -339,6 +358,7 @@ static int mgs_barrier_freeze(const struct lu_env *env, rc = -EALREADY; break; } + /* fallthrough */ case BS_INIT: case BS_THAWED: case BS_EXPIRED: @@ -450,17 +470,36 @@ static int mgs_barrier_thaw(const struct lu_env *env, down_write(&mgs->mgs_barrier_rwsem); mutex_lock(&mgs->mgs_mutex); - fsdb = mgs_find_fsdb(mgs, name); - if (!fsdb) { + rc = mgs_find_or_make_fsdb_nolock(env, mgs, name, &fsdb); + if (rc) { mutex_unlock(&mgs->mgs_mutex); up_write(&mgs->mgs_barrier_rwsem); - - RETURN(-ENODEV); + RETURN(rc); } - if (unlikely(fsdb->fsdb_mdt_count == 0)) + if (unlikely(fsdb->fsdb_mdt_count == 0)) { mgs_barrier_bitmap_setup(mgs, fsdb, bc->bc_name); + /* fsdb was just created, ensure that fsdb_barrier_disabled is + * set correctly */ + if (fsdb->fsdb_mdt_count > 0) { + struct obd_export *exp; + struct obd_device *mgs_obd = mgs->mgs_obd; + + spin_lock(&mgs_obd->obd_dev_lock); + list_for_each_entry(exp, &mgs_obd->obd_exports, + exp_obd_chain) { + __u64 flags = exp_connect_flags(exp); + if (!!(flags & OBD_CONNECT_MDS_MDS) && + !(flags & OBD_CONNECT_BARRIER)) { + fsdb->fsdb_barrier_disabled = 1; + break; + } + } + spin_unlock(&mgs_obd->obd_dev_lock); + } + } + mutex_lock(&fsdb->fsdb_mutex); mutex_unlock(&mgs->mgs_mutex); @@ -599,13 +638,32 @@ static int mgs_barrier_rescan(const struct lu_env *env, snprintf(name, sizeof(mgs_env_info(env)->mgi_fsname) - 1, "%s-%s", bc->bc_name, BARRIER_FILENAME); - b_fsdb = mgs_find_fsdb(mgs, name); - if (!b_fsdb) { + rc = mgs_find_or_make_fsdb_nolock(env, mgs, name, &b_fsdb); + if (rc) { mutex_unlock(&mgs->mgs_mutex); up_write(&mgs->mgs_barrier_rwsem); mgs_put_fsdb(mgs, c_fsdb); + RETURN(rc); + } - RETURN(-ENODEV); + if (unlikely(b_fsdb->fsdb_mdt_count == 0 && + c_fsdb->fsdb_mdt_count > 0)) { + /* fsdb was just created, ensure that fsdb_barrier_disabled is + * set correctly */ + struct obd_export *exp; + struct obd_device *mgs_obd = mgs->mgs_obd; + + spin_lock(&mgs_obd->obd_dev_lock); + list_for_each_entry(exp, &mgs_obd->obd_exports, + exp_obd_chain) { + __u64 flags = exp_connect_flags(exp); + if (!!(flags & OBD_CONNECT_MDS_MDS) && + !(flags & OBD_CONNECT_BARRIER)) { + b_fsdb->fsdb_barrier_disabled = 1; + break; + } + } + spin_unlock(&mgs_obd->obd_dev_lock); } mutex_lock(&b_fsdb->fsdb_mutex); @@ -626,6 +684,7 @@ static int mgs_barrier_rescan(const struct lu_env *env, rc = -EBUSY; break; } + /* fallthrough */ case BS_INIT: case BS_THAWED: case BS_EXPIRED: