From 9b973ad37f66a10eb7db1ced6865708497ecc02b Mon Sep 17 00:00:00 2001 From: Yang Sheng Date: Wed, 2 Mar 2022 21:25:59 +0800 Subject: [PATCH] LU-15611 osd-zfs: Cleanup while mount failed Need clean up in error out path in osd-zfs. Signed-off-by: Yang Sheng Change-Id: I47d9ee9483acb8e1d60c77e8cfc481902a1535ac Reviewed-on: https://review.whamcloud.com/46678 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Emoly Liu Tested-by: Emoly Liu Reviewed-by: Alex Zhuravlev Reviewed-by: Oleg Drokin --- lustre/obdclass/dt_object.c | 9 ++-- lustre/osd-zfs/osd_handler.c | 124 ++++++++++++++++++++++--------------------- 2 files changed, 68 insertions(+), 65 deletions(-) diff --git a/lustre/obdclass/dt_object.c b/lustre/obdclass/dt_object.c index 59cf948..95f54b8 100644 --- a/lustre/obdclass/dt_object.c +++ b/lustre/obdclass/dt_object.c @@ -1251,11 +1251,11 @@ int dt_tunables_fini(struct dt_device *dt) if (!dt) return -EINVAL; - if (dt->dd_def_attrs) + if (dt->dd_def_attrs) { sysfs_remove_files(&dt->dd_kobj, dt->dd_def_attrs); - - kobject_put(&dt->dd_kobj); - wait_for_completion(&dt->dd_kobj_unregister); + kobject_put(&dt->dd_kobj); + wait_for_completion(&dt->dd_kobj_unregister); + } return 0; } @@ -1280,6 +1280,7 @@ int dt_tunables_init(struct dt_device *dt, struct obd_type *type, rc = sysfs_create_files(&dt->dd_kobj, dt->dd_def_attrs); if (rc) { kobject_put(&dt->dd_kobj); + dt->dd_def_attrs = NULL; return rc; } diff --git a/lustre/osd-zfs/osd_handler.c b/lustre/osd-zfs/osd_handler.c index f4f3ea8..ecc043f 100644 --- a/lustre/osd-zfs/osd_handler.c +++ b/lustre/osd-zfs/osd_handler.c @@ -1243,12 +1243,10 @@ static int osd_mount(const struct lu_env *env, o->od_posix_acl = 1; osd_unlinked_drain(env, o); -err: - if (rc && o->od_os) { - osd_dmu_objset_disown(o->od_os, B_TRUE, o); - o->od_os = NULL; - } + RETURN(0); + +err: RETURN(rc); } @@ -1327,7 +1325,59 @@ out: } static struct lu_device *osd_device_fini(const struct lu_env *env, - struct lu_device *dev); + struct lu_device *d) +{ + struct osd_device *o = osd_dev(d); + int rc; + + ENTRY; + osd_index_backup(env, o, false); + if (o->od_os) { + osd_objset_unregister_callbacks(o); + if (!o->od_dt_dev.dd_rdonly) { + osd_sync(env, lu2dt_dev(d)); + txg_wait_callbacks( + spa_get_dsl(dmu_objset_spa(o->od_os))); + } + } + + /* now with all the callbacks completed we can cleanup the remainings */ + osd_shutdown(env, o); + osd_scrub_cleanup(env, o); + + rc = osd_procfs_fini(o); + if (rc) { + CERROR("proc fini error %d\n", rc); + RETURN(ERR_PTR(rc)); + } + + if (o->od_os) + osd_umount(env, o); + + RETURN(NULL); +} + + +static struct lu_device *osd_device_free(const struct lu_env *env, + struct lu_device *d) +{ + struct osd_device *o = osd_dev(d); + + ENTRY; + /* XXX: make osd top device in order to release reference */ + if (d->ld_site) { + d->ld_site->ls_top_dev = d; + lu_site_purge(env, d->ld_site, -1); + lu_site_print(env, d->ld_site, &d->ld_site->ls_obj_hash.nelems, + D_ERROR, lu_cdebug_printer); + } + if (o->od_site.ls_bottom_dev) + lu_site_fini(&o->od_site); + dt_device_fini(&o->od_dt_dev); + OBD_FREE_PTR(o); + + RETURN(NULL); +} static struct lu_device *osd_device_alloc(const struct lu_env *env, struct lu_device_type *type, @@ -1355,70 +1405,22 @@ static struct lu_device *osd_device_alloc(const struct lu_env *env, rc = osd_device_init0(env, dev, cfg); if (rc == 0) { rc = osd_mount(env, dev, cfg); - if (rc) + if (rc) { osd_device_fini(env, osd2lu_dev(dev)); - } - if (rc) + osd_device_free(env, osd2lu_dev(dev)); + dev = NULL; + } + } else { dt_device_fini(&dev->od_dt_dev); + } } - if (unlikely(rc != 0)) + if (unlikely(rc != 0) && dev) OBD_FREE_PTR(dev); return rc == 0 ? osd2lu_dev(dev) : ERR_PTR(rc); } -static struct lu_device *osd_device_free(const struct lu_env *env, - struct lu_device *d) -{ - struct osd_device *o = osd_dev(d); - ENTRY; - - /* XXX: make osd top device in order to release reference */ - d->ld_site->ls_top_dev = d; - lu_site_purge(env, d->ld_site, -1); - lu_site_print(env, d->ld_site, &d->ld_site->ls_obj_hash.nelems, - D_ERROR, lu_cdebug_printer); - lu_site_fini(&o->od_site); - dt_device_fini(&o->od_dt_dev); - OBD_FREE_PTR(o); - - RETURN (NULL); -} - -static struct lu_device *osd_device_fini(const struct lu_env *env, - struct lu_device *d) -{ - struct osd_device *o = osd_dev(d); - int rc; - ENTRY; - - osd_index_backup(env, o, false); - if (o->od_os) { - osd_objset_unregister_callbacks(o); - if (!o->od_dt_dev.dd_rdonly) { - osd_sync(env, lu2dt_dev(d)); - txg_wait_callbacks( - spa_get_dsl(dmu_objset_spa(o->od_os))); - } - } - - /* now with all the callbacks completed we can cleanup the remainings */ - osd_shutdown(env, o); - osd_scrub_cleanup(env, o); - - rc = osd_procfs_fini(o); - if (rc) { - CERROR("proc fini error %d\n", rc); - RETURN(ERR_PTR(rc)); - } - - if (o->od_os) - osd_umount(env, o); - - RETURN(NULL); -} - static int osd_device_init(const struct lu_env *env, struct lu_device *d, const char *name, struct lu_device *next) { -- 1.8.3.1