if (req->rq_reqmsg->opc != MDS_CONNECT && req->rq_export == NULL)
GOTO(out, rc = -ENOTCONN);
- LASSERT(!strcmp(req->rq_obd->obd_type->typ_name, "mds"));
+ LASSERT(!strcmp(req->rq_obd->obd_type->typ_name, LUSTRE_MDT_NAME));
switch (req->rq_reqmsg->opc) {
case MDS_CONNECT:
return rc;
}
-#define MDS_NUM_THREADS 8
/* mount the file system (secretly) */
static int mds_setup(struct obd_device *obddev, obd_count len, void *buf)
{
- int i;
struct obd_ioctl_data* data = buf;
struct mds_obd *mds = &obddev->u.mds;
struct vfsmount *mnt;
CERROR("MDS filesystem method init failed: rc = %d\n", rc);
GOTO(err_put, rc);
}
-#warning move this to module init
- mds->mds_service = ptlrpc_init_svc(MDS_NEVENTS, MDS_NBUFS,
- MDS_BUFSIZE, MDS_MAXREQSIZE,
- MDS_REQUEST_PORTAL, MDC_REPLY_PORTAL,
- "self", mds_handle, "mds");
- if (!mds->mds_service) {
- CERROR("failed to start service\n");
- GOTO(err_fs, rc = -EINVAL);
- }
obddev->obd_namespace =
ldlm_namespace_new("mds_server", LDLM_NAMESPACE_SERVER);
if (obddev->obd_namespace == NULL) {
mds_cleanup(obddev);
- GOTO(err_svc, rc = -ENOMEM);
+ GOTO(err_fs, rc = -ENOMEM);
}
- for (i = 0; i < MDS_NUM_THREADS; i++) {
- char name[32];
- sprintf(name, "lustre_MDS_%02d", i);
- rc = ptlrpc_start_thread(obddev, mds->mds_service, name);
- if (rc) {
- CERROR("cannot start MDS thread #%d: rc %d\n", i, rc);
- GOTO(err_thread, rc);
- }
- }
rc = mds_recover(obddev);
if (rc)
- GOTO(err_thread, rc);
+ GOTO(err_fs, rc);
ptlrpc_init_client(LDLM_REQUEST_PORTAL, LDLM_REPLY_PORTAL,
"mds_ldlm_client", &obddev->obd_ldlm_client);
RETURN(0);
-err_thread:
- ptlrpc_stop_all_threads(mds->mds_service);
-err_svc:
- ptlrpc_unregister_service(mds->mds_service);
err_fs:
mds_fs_cleanup(obddev);
err_put:
struct obd_run_ctxt saved;
ENTRY;
- ptlrpc_stop_all_threads(mds->mds_service);
- ptlrpc_unregister_service(mds->mds_service);
-
sb = mds->mds_sb;
if (!mds->mds_sb)
RETURN(0);
}
+#define MDT_NUM_THREADS 8
+static int mdt_setup(struct obd_device *obddev, obd_count len, void *buf)
+{
+ int i;
+ // struct obd_ioctl_data* data = buf;
+ struct mds_obd *mds = &obddev->u.mds;
+ int rc = 0;
+ ENTRY;
+
+ MOD_INC_USE_COUNT;
+
+ mds->mds_service = ptlrpc_init_svc(MDS_NEVENTS, MDS_NBUFS,
+ MDS_BUFSIZE, MDS_MAXREQSIZE,
+ MDS_REQUEST_PORTAL, MDC_REPLY_PORTAL,
+ "self", mds_handle, "mds");
+ if (!mds->mds_service) {
+ CERROR("failed to start service\n");
+ GOTO(err_dec, rc = -EINVAL);
+ }
+
+ for (i = 0; i < MDT_NUM_THREADS; i++) {
+ char name[32];
+ sprintf(name, "lustre_MDT_%02d", i);
+ rc = ptlrpc_start_thread(obddev, mds->mds_service, name);
+ if (rc) {
+ CERROR("cannot start MDT thread #%d: rc %d\n", i, rc);
+ GOTO(err_thread, rc);
+ }
+ }
+
+ RETURN(0);
+
+err_thread:
+ ptlrpc_stop_all_threads(mds->mds_service);
+ ptlrpc_unregister_service(mds->mds_service);
+err_dec:
+ MOD_DEC_USE_COUNT;
+ RETURN(rc);
+}
+
+
+static int mdt_cleanup(struct obd_device *obddev)
+{
+ struct mds_obd *mds = &obddev->u.mds;
+ ENTRY;
+
+ ptlrpc_stop_all_threads(mds->mds_service);
+ ptlrpc_unregister_service(mds->mds_service);
+
+ MOD_DEC_USE_COUNT;
+ RETURN(0);
+}
+
extern int mds_iocontrol(long cmd, struct lustre_handle *conn,
int len, void *karg, void *uarg);
o_iocontrol: mds_iocontrol
};
+static struct obd_ops mdt_obd_ops = {
+ o_setup: mdt_setup,
+ o_cleanup: mdt_cleanup,
+};
+
+
static int __init mds_init(void)
{
mds_file_cache = kmem_cache_create("ll_mds_file_data",
return -ENOMEM;
class_register_type(&mds_obd_ops, LUSTRE_MDS_NAME);
+ class_register_type(&mdt_obd_ops, LUSTRE_MDT_NAME);
ldlm_register_intent(ldlm_intent_policy);
return 0;
}
quit""" % (dump_file)
self.run(cmds)
+ # get list of devices
+ def device_list(self):
+ cmds = """
+ device_list
+ quit"""
+ rc, out = self.run(cmds)
+ return out
+
# ============================================================
# Various system-level functions
# (ideally moved to their own module)
fixme("automatic local address for GM")
return local
-
+
+def is_prepared(uuid):
+ """Return true if a device exists for the uuid"""
+ # expect this format:
+ # 1 UP ldlm ldlm ldlm_UUID 2
+ out = lctl.device_list()
+ for s in out:
+ if uuid == string.split(s)[4]:
+ return 1
+ return 0
+
# ============================================================
# Classes to prepare and cleanup the various objects
lctl.network(self.net_type, self.nid)
- lctl.newdev(attach = "ptlrpc RPCDEV")
+ lctl.newdev(attach = "ptlrpc RPCDEV RPCDEV_UUID")
def cleanup(self):
self.info(self.net_type, self.nid, self.port)
cleanup_error(e.rc)
try:
- lctl.cleanup("RPCDEV", "")
+ lctl.cleanup("RPCDEV", "RPCDEV_UUID")
except CommandError, e:
print "cleanup failed: ", self.name
e.dump()
def prepare(self):
self.info(self.devname, self.fstype, self.format)
blkdev = block_dev(self.devname, self.size, self.fstype, self.format)
+ if not is_prepared('MDT_UUID'):
+ lctl.newdev(attach="mdt %s %s" % ('MDT', 'MDT_UUID'),
+ setup ="")
lctl.newdev(attach="mds %s %s" % (self.name, self.uuid),
setup ="%s %s" %(blkdev, self.fstype))
def cleanup(self):
+ if is_prepared('MDT_UUID'):
+ try:
+ lctl.cleanup("MDT", "MDT_UUID")
+ except CommandError, e:
+ print "cleanup failed: ", self.name
+ e.dump()
+ cleanup_error(e.rc)
Module.cleanup(self)
clean_loop(self.devname)