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 <di.wang@whamcloud.com>
Reviewed-on: http://review.whamcloud.com/4336
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Alex Zhuravlev <alexey.zhuravlev@intel.com>
Reviewed-by: Mike Pershin <mike.pershin@intel.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
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.
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;
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;
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 },
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 }
};
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 */
[ $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 ||
$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"