From bc962bde3b109b99c924137ed281d9400637e295 Mon Sep 17 00:00:00 2001 From: Wang Di Date: Thu, 26 Jul 2012 03:36:45 -0700 Subject: [PATCH] LU-1187 mdt: Only create remote dir on MDT0 1.Add checking for only creating remote dir on MDT0. 2.Add enable_remote_dir parameter to enalbe remote dir creation on other MDTs. Change-Id: I272d4763f07115c5aa0432eb4bbdda5349711d25 Signed-off-by: Wang Di Reviewed-on: http://review.whamcloud.com/4336 Tested-by: Hudson Tested-by: Maloo Reviewed-by: Alex Zhuravlev Reviewed-by: Mike Pershin Reviewed-by: Oleg Drokin --- lustre/mdd/mdd_dir.c | 2 +- lustre/mdt/mdt_handler.c | 1 + lustre/mdt/mdt_internal.h | 5 +++-- lustre/mdt/mdt_lproc.c | 30 ++++++++++++++++++++++++++++++ lustre/mdt/mdt_reint.c | 13 +++++++++++++ lustre/tests/sanity.sh | 8 ++++++++ 6 files changed, 56 insertions(+), 3 deletions(-) diff --git a/lustre/mdd/mdd_dir.c b/lustre/mdd/mdd_dir.c index f15e37d..0e893c9 100644 --- a/lustre/mdd/mdd_dir.c +++ b/lustre/mdd/mdd_dir.c @@ -1488,7 +1488,7 @@ static int mdd_create_sanity_check(const struct lu_env *env, if (mdd_is_dead_obj(obj)) RETURN(-ENOENT); - /* + /* * In some cases this lookup is not needed - we know before if name * exists or not because MDT performs lookup for it. * name length check is done in lookup. diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index f2fc8f0..c8d3b35 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -4526,6 +4526,7 @@ static int mdt_init0(const struct lu_env *env, struct mdt_device *m, init_rwsem(&m->mdt_squash_sem); spin_lock_init(&m->mdt_osfs_lock); m->mdt_osfs_age = cfs_time_shift_64(-1000); + m->mdt_enable_remote_dir = 0; m->mdt_md_dev.md_lu_dev.ld_ops = &mdt_lu_ops; m->mdt_md_dev.md_lu_dev.ld_obd = obd; diff --git a/lustre/mdt/mdt_internal.h b/lustre/mdt/mdt_internal.h index 37d7bc5..44a5d68 100644 --- a/lustre/mdt/mdt_internal.h +++ b/lustre/mdt/mdt_internal.h @@ -159,8 +159,9 @@ struct mdt_device { cfs_timer_t mdt_ck_timer; struct ptlrpc_thread mdt_ck_thread; struct lustre_capa_key mdt_capa_keys[2]; - unsigned int mdt_capa_conf:1, - mdt_som_conf:1; + unsigned int mdt_capa_conf:1, + mdt_som_conf:1, + mdt_enable_remote_dir:1; /* statfs optimization: we cache a bit */ struct obd_statfs mdt_osfs; diff --git a/lustre/mdt/mdt_lproc.c b/lustre/mdt/mdt_lproc.c index 1560ec11..deae5bb 100644 --- a/lustre/mdt/mdt_lproc.c +++ b/lustre/mdt/mdt_lproc.c @@ -948,6 +948,34 @@ out: return count; } +static int lprocfs_rd_enable_remote_dir(char *page, char **start, off_t off, + int count, int *eof, void *data) +{ + struct obd_device *obd = data; + struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); + + return snprintf(page, count, "%u\n", mdt->mdt_enable_remote_dir); +} + +static int lprocfs_wr_enable_remote_dir(struct file *file, const char *buffer, + unsigned long count, void *data) +{ + struct obd_device *obd = data; + struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev); + __u32 val; + int rc; + + rc = lprocfs_write_helper(buffer, count, &val); + if (rc) + return rc; + + if (val < 0 || val > 1) + return -ERANGE; + + mdt->mdt_enable_remote_dir = val; + return count; +} + static struct lprocfs_vars lprocfs_mdt_obd_vars[] = { { "uuid", lprocfs_rd_uuid, 0, 0 }, { "recovery_status", lprocfs_obd_rd_recovery_status, 0, 0 }, @@ -985,6 +1013,8 @@ static struct lprocfs_vars lprocfs_mdt_obd_vars[] = { lprocfs_obd_wr_ir_factor, 0 }, { "job_cleanup_interval", lprocfs_rd_job_interval, lprocfs_wr_job_interval, 0 }, + { "enable_remote_dir", lprocfs_rd_enable_remote_dir, + lprocfs_wr_enable_remote_dir, 0}, { 0 } }; diff --git a/lustre/mdt/mdt_reint.c b/lustre/mdt/mdt_reint.c index e342b20..4d7aebf 100644 --- a/lustre/mdt/mdt_reint.c +++ b/lustre/mdt/mdt_reint.c @@ -306,6 +306,19 @@ static int mdt_md_create(struct mdt_thread_info *info) if (likely(!IS_ERR(child))) { struct md_object *next = mdt_object_child(parent); + if (mdt_object_exists(child) < 0) { + struct seq_server_site *ss; + + ss = mdt_seq_site(mdt); + if (ss->ss_node_id != 0 && + mdt->mdt_enable_remote_dir == 0) { + CERROR("%s: remote dir is only permitted on" + " MDT0 or set_param" + " mdt.*.enable_remote_dir=1\n", + mdt2obd_dev(mdt)->obd_name); + GOTO(out_put_child, rc = -EPERM); + } + } ma->ma_need = MA_INODE; ma->ma_valid = 0; /* capa for cross-ref will be stored here */ diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index ffe70d6..8572a4e 100644 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -10519,6 +10519,7 @@ test_230b() { [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return local MDTIDX=1 local remote_dir=$DIR/$tdir/remote_dir + local rc=0 mkdir -p $DIR/$tdir $LFS mkdir -i $MDTIDX $remote_dir || @@ -10527,6 +10528,13 @@ test_230b() { $LFS mkdir -i 0 $remote_dir/new_dir && error "nested remote directory create succeed!" + do_facet mds$((MDTIDX + 1)) lctl set_param mdt.*.enable_remote_dir=1 + $LFS mkdir -i 0 $remote_dir/new_dir || rc=$? + do_facet mds$((MDTIDX + 1)) lctl set_param mdt.*.enable_remote_dir=0 + + [ $rc -ne 0 ] && + error "create remote directory failed after set enable_remote_dir" + rm -r $DIR/$tdir || error "unlink remote directory failed" } run_test 230b "nested remote directory should be failed" -- 1.8.3.1