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);
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);
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);
return 0;
}
-int mgs_find_or_make_fsdb(const struct lu_env *env, struct mgs_device *mgs,
- char *name, struct fs_db **dbh)
+/* The caller must hold mgs->mgs_mutex. */
+int mgs_find_or_make_fsdb_nolock(const struct lu_env *env,
+ struct mgs_device *mgs,
+ char *name, struct fs_db **dbh)
{
struct fs_db *fsdb;
int rc = 0;
ENTRY;
- mutex_lock(&mgs->mgs_mutex);
fsdb = mgs_find_fsdb(mgs, name);
if (!fsdb) {
fsdb = mgs_new_fsdb(env, mgs, name);
CDEBUG(D_MGS, "Created new db: rc = %d\n", rc);
}
- mutex_unlock(&mgs->mgs_mutex);
if (!rc)
*dbh = fsdb;
RETURN(rc);
}
+int mgs_find_or_make_fsdb(const struct lu_env *env, struct mgs_device *mgs,
+ char *name, struct fs_db **dbh)
+{
+ int rc;
+ ENTRY;
+
+ mutex_lock(&mgs->mgs_mutex);
+ rc = mgs_find_or_make_fsdb_nolock(env, mgs, name, dbh);
+ mutex_unlock(&mgs->mgs_mutex);
+
+ RETURN(rc);
+}
+
/* 1 = index in use
0 = index unused
-1= empty client log */
}
run_test 3b "modify snapshot without original filesystem mounted"
+test_4() { # LU-10843
+ combined_mgs_mds && skip "Combined MGS/MDS" && return
+
+ local rcmd="$LCTL get_param ldlm.namespaces.MGS.resource_count"
+
+ local exports=$(do_facet mgs "$LCTL get_param -n mgs.MGS.num_exports")
+ local rcount=$(do_facet mgs $rcmd)
+
+ echo "Remount MGT"
+ stop mgs || error "stop mgs failed"
+ start mgs $(mgsdevname) $MGS_MOUNT_OPTS || error "start mgs failed"
+
+ echo "Wait for all reconnects"
+ local CMD="$LCTL get_param -n mgs.MGS.num_exports"
+ wait_update_facet mgs "$CMD" $exports ||
+ lss_err "(1) failed to export from mgs"
+
+ wait_update_facet mgs "$rcmd" $rcount ||
+ lss_err "(2) failed to reconnect mds"
+
+ echo "Create lss_4_0"
+ lsnapshot_create -n lss_4_0 -c "'It is test_4'" ||
+ lss_err "(3) Fail to create lss_4_0"
+
+ echo "List lss_4_0"
+ lsnapshot_list -n lss_4_0 ||
+ lss_err "(4) Fail to list lss_4_0"
+
+ echo "Destroy lss_4_0"
+ lsnapshot_destroy -n lss_4_0 ||
+ lss_err "(5) Fail to destroy lss_4_0"
+
+}
+run_test 4 "create/delete snapshot after MGS remount"
+
lss_cleanup
do_facet mgs $LCTL set_param debug=-snapshot
do_nodes $(comma_list $(mdts_nodes)) $LCTL set_param debug=-snapshot