char *typename,
unsigned long s_flags)
{
- struct obd_type *type;
+ struct obd_type *type = NULL;
struct lu_device_type *ldt;
struct lu_device *d = NULL;
struct dt_device *dt;
struct lu_env env;
- int rc;
+ int rc = 0;
struct lustre_cfg *lcfg;
struct lustre_cfg_bufs bufs;
rc = dt->dd_lu_dev.ld_ops->ldo_process_config(&env, d, lcfg);
lustre_cfg_free(lcfg);
+ if (rc)
+ GOTO(out, rc);
+
lu_device_get(d);
lu_ref_add(&d->ld_reference, "lu-stack", &lu_site_init);
out_type:
out_alloc:
out:
+ if (rc) {
+ if (d)
+ ldt->ldt_ops->ldto_device_free(&env, d);
+ if (type)
+ class_put_type(type);
+ d = ERR_PTR(rc);
+ }
lu_env_fini(&env);
RETURN(d);
}
if (rc == -ENOENT) {
/* no configuration found, use disk label */
stop_temp_site(sb);
- } else
+ } else {
LASSERT(rc == 0);
+ }
- RETURN(lu2dt_dev(mdev->mcf_bottom));
+ RETURN(lu2dt_dev(dev));
/* In the past, we have always used flags = 0.
Note ext3/ldiskfs can't be mounted ro. */
unsigned long page, s_flags, ldd_flags;
struct page *__page;
char *options = NULL;
+ int rc = 0;
ENTRY;
if (o->od_mnt != NULL)
RETURN(0);
+ o->od_obj_area = NULL;
+
OBD_PAGE_ALLOC(__page, CFS_ALLOC_STD);
if (__page == NULL)
- RETURN(-ENOMEM);
+ GOTO(out, rc = -ENOMEM);
s_flags = (unsigned long) lustre_cfg_buf(cfg, 1);
opts = lustre_cfg_string(cfg, 2);
o->od_mnt = ll_kern_mount("ldiskfs", s_flags, dev, (void *)options);
/* XXX: error handling */
- LASSERTF(!IS_ERR(o->od_mnt), "%ld\n", PTR_ERR(o->od_mnt));
+ if (IS_ERR(o->od_mnt))
+ GOTO(out, rc = PTR_ERR(o->od_mnt));
o->od_fsops = fsfilt_get_ops(mt_str(LDD_MT_LDISKFS));
LASSERT(o->od_fsops);
LCONSOLE_WARN("OSD: IAM mode enabled\n");
} else
o->od_iop_mode = 1;
-
+out:
OBD_PAGE_FREE(__page);
- o->od_obj_area = NULL;
- RETURN(0);
+ RETURN(rc);
}
static struct lu_device *osd_device_fini(const struct lu_env *env,