X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fosp%2Fosp_dev.c;h=5828d883f191e2e326f829f63c62e2990f36aee9;hp=cc4a1ae371da2a5011320e16b434017278c642b5;hb=de73bdafb0e0ab187865dcdcc76c0f48e1b5239e;hpb=d46a76cd7bb2b657a6daabbe18b993abeedb2d94 diff --git a/lustre/osp/osp_dev.c b/lustre/osp/osp_dev.c index cc4a1ae..5828d88 100644 --- a/lustre/osp/osp_dev.c +++ b/lustre/osp/osp_dev.c @@ -42,9 +42,6 @@ * Author: Di Wang */ -#ifndef EXPORT_SYMTAB -# define EXPORT_SYMTAB -#endif #define DEBUG_SUBSYSTEM S_MDS #include @@ -55,7 +52,7 @@ #include "osp_internal.h" /* Slab for OSP object allocation */ -cfs_mem_cache_t *osp_object_kmem; +struct kmem_cache *osp_object_kmem; static struct lu_kmem_descr osp_caches[] = { { @@ -76,7 +73,7 @@ struct lu_object *osp_object_alloc(const struct lu_env *env, struct osp_object *o; struct lu_object *l; - OBD_SLAB_ALLOC_PTR_GFP(o, osp_object_kmem, CFS_ALLOC_IO); + OBD_SLAB_ALLOC_PTR_GFP(o, osp_object_kmem, __GFP_IO); if (o != NULL) { l = &o->opo_obj.do_lu; @@ -355,12 +352,12 @@ static int osp_shutdown(const struct lu_env *env, struct osp_device *d) rc = osp_disconnect(d); if (!d->opd_connect_mdt) { - /* stop precreate thread */ - osp_precreate_fini(d); - /* stop sync thread */ osp_sync_fini(d); + /* stop precreate thread */ + osp_precreate_fini(d); + /* release last_used file */ osp_last_used_fini(env, d); } @@ -424,8 +421,9 @@ static int osp_recovery_complete(const struct lu_env *env, ENTRY; osp->opd_recovery_completed = 1; - if (!osp->opd_connect_mdt) - cfs_waitq_signal(&osp->opd_pre_waitq); + + if (!osp->opd_connect_mdt && osp->opd_pre != NULL) + wake_up(&osp->opd_pre_waitq); RETURN(rc); } @@ -449,6 +447,9 @@ static int osp_statfs(const struct lu_env *env, struct dt_device *dev, if (unlikely(d->opd_imp_active == 0)) RETURN(-ENOTCONN); + if (d->opd_pre == NULL) + RETURN(0); + /* return recently updated data */ *sfs = d->opd_statfs; @@ -456,7 +457,6 @@ static int osp_statfs(const struct lu_env *env, struct dt_device *dev, * layer above osp (usually lod) can use ffree to estimate * how many objects are available for immediate creation */ - spin_lock(&d->opd_pre_lock); LASSERTF(fid_seq(&d->opd_pre_last_created_fid) == fid_seq(&d->opd_pre_used_fid), @@ -542,7 +542,8 @@ static int osp_init0(const struct lu_env *env, struct osp_device *m, struct obd_import *imp; class_uuid_t uuid; char *src, *tgt, *mdt, *osdname = NULL; - int rc, idx; + int rc; + long idx; ENTRY; @@ -603,7 +604,7 @@ static int osp_init0(const struct lu_env *env, struct osp_device *m, } else { /* New OSC name fsname-OSTXXXX-osc-MDTXXXX */ if (strncmp(tgt, "-MDT", 4) != 0 && - strncmp(tgt, "-OST", 4) != 0) { + strncmp(tgt, "-OST", 4) != 0) { CERROR("%s: invalid target name %s\n", m->opd_obd->obd_name, lustre_cfg_string(cfg, 0)); RETURN(-EINVAL); @@ -689,6 +690,14 @@ static int osp_init0(const struct lu_env *env, struct osp_device *m, osp_lprocfs_init(m); + rc = obd_fid_init(m->opd_obd, NULL, m->opd_connect_mdt ? + LUSTRE_SEQ_METADATA : LUSTRE_SEQ_DATA); + if (rc) { + CERROR("%s: fid init error: rc = %d\n", + m->opd_obd->obd_name, rc); + GOTO(out_proc, rc); + } + if (!m->opd_connect_mdt) { /* Initialize last id from the storage - will be * used in orphan cleanup. */ @@ -696,12 +705,6 @@ static int osp_init0(const struct lu_env *env, struct osp_device *m, if (rc) GOTO(out_proc, rc); - rc = obd_fid_init(m->opd_obd, NULL, LUSTRE_SEQ_DATA); - if (rc) { - CERROR("%s: fid init error: rc = %d\n", - m->opd_obd->obd_name, rc); - GOTO(out_last_used, rc); - } /* Initialize precreation thread, it handles new * connections as well. */ @@ -716,8 +719,8 @@ static int osp_init0(const struct lu_env *env, struct osp_device *m, rc = osp_sync_init(env, m); if (rc) GOTO(out_precreat, rc); - } + /* * Initiate connect to OST */ @@ -747,7 +750,6 @@ out_last_used: out_proc: ptlrpc_lprocfs_unregister_obd(obd); lprocfs_obd_cleanup(obd); - obd_cleanup_client_import(obd); if (m->opd_symlink) lprocfs_remove(&m->opd_symlink); client_obd_cleanup(obd); @@ -827,8 +829,6 @@ static struct lu_device *osp_device_fini(const struct lu_env *env, imp->imp_rq_pool = NULL; } - obd_cleanup_client_import(m->opd_obd); - if (m->opd_symlink) lprocfs_remove(&m->opd_symlink); @@ -861,6 +861,18 @@ static int osp_reconnect(const struct lu_env *env, return 0; } +static int osp_prepare_fid_client(struct osp_device *osp) +{ + LASSERT(osp->opd_obd->u.cli.cl_seq != NULL); + if (osp->opd_obd->u.cli.cl_seq->lcs_exp != NULL) + return 0; + + LASSERT(osp->opd_exp != NULL); + osp->opd_obd->u.cli.cl_seq->lcs_exp = + class_export_get(osp->opd_exp); + return 0; +} + /* * we use exports to track all LOD users */ @@ -910,15 +922,6 @@ static int osp_obd_connect(const struct lu_env *env, struct obd_export **exp, } ptlrpc_pinger_add_import(imp); - - if (osp->opd_connect_mdt && data->ocd_index == 0) { - /* set seq controller export for MDC0 if exists */ - struct seq_server_site *ss; - - ss = lu_site2seq(osp2lu_dev(osp)->ld_site); - ss->ss_control_exp = class_export_get(*exp); - ss->ss_server_fld->lsf_control_exp = *exp; - } out: RETURN(rc); } @@ -1028,27 +1031,42 @@ static int osp_import_event(struct obd_device *obd, struct obd_import *imp, d->opd_imp_connected = 0; if (d->opd_connect_mdt) break; - osp_pre_update_status(d, -ENODEV); - cfs_waitq_signal(&d->opd_pre_waitq); + + if (d->opd_pre != NULL) { + osp_pre_update_status(d, -ENODEV); + wake_up(&d->opd_pre_waitq); + } + CDEBUG(D_HA, "got disconnected\n"); break; case IMP_EVENT_INACTIVE: d->opd_imp_active = 0; if (d->opd_connect_mdt) break; - osp_pre_update_status(d, -ENODEV); - cfs_waitq_signal(&d->opd_pre_waitq); + + if (d->opd_pre != NULL) { + osp_pre_update_status(d, -ENODEV); + wake_up(&d->opd_pre_waitq); + } + CDEBUG(D_HA, "got inactive\n"); break; case IMP_EVENT_ACTIVE: d->opd_imp_active = 1; + + if (osp_prepare_fid_client(d) != 0) + break; + if (d->opd_got_disconnected) d->opd_new_connection = 1; d->opd_imp_connected = 1; d->opd_imp_seen_connected = 1; if (d->opd_connect_mdt) break; - cfs_waitq_signal(&d->opd_pre_waitq); + + if (d->opd_pre != NULL) + wake_up(&d->opd_pre_waitq); + __osp_sync_check_for_work(d); CDEBUG(D_HA, "got connected\n"); break; @@ -1082,7 +1100,7 @@ static int osp_iocontrol(unsigned int cmd, struct obd_export *exp, int len, d = lu2osp_dev(obd->obd_lu_dev); LASSERT(d->opd_dt_dev.dd_ops == &osp_dt_ops); - if (!cfs_try_module_get(THIS_MODULE)) { + if (!try_module_get(THIS_MODULE)) { CERROR("%s: can't get module. Is it alive?", obd->obd_name); return -EINVAL; } @@ -1103,27 +1121,37 @@ static int osp_iocontrol(unsigned int cmd, struct obd_export *exp, int len, break; default: CERROR("%s: unrecognized ioctl %#x by %s\n", obd->obd_name, - cmd, cfs_curproc_comm()); + cmd, current_comm()); rc = -ENOTTY; } - cfs_module_put(THIS_MODULE); + module_put(THIS_MODULE); return rc; } -static int osp_obd_health_check(const struct lu_env *env, - struct obd_device *obd) +static int osp_obd_get_info(const struct lu_env *env, struct obd_export *exp, + __u32 keylen, void *key, __u32 *vallen, void *val, + struct lov_stripe_md *lsm) { - struct osp_device *d = lu2osp_dev(obd->obd_lu_dev); + int rc = -EINVAL; - ENTRY; + if (KEY_IS(KEY_OSP_CONNECTED)) { + struct obd_device *obd = exp->exp_obd; + struct osp_device *osp; - /* - * 1.8/2.0 behaviour is that OST being connected once at least - * is considired "healthy". and one "healty" OST is enough to - * allow lustre clients to connect to MDS - */ - LASSERT(d); - RETURN(!d->opd_imp_seen_connected); + if (!obd->obd_set_up || obd->obd_stopping) + RETURN(-EAGAIN); + + osp = lu2osp_dev(obd->obd_lu_dev); + LASSERT(osp); + /* + * 1.8/2.0 behaviour is that OST being connected once at least + * is considered "healthy". and one "healthy" OST is enough to + * allow lustre clients to connect to MDS + */ + RETURN(!osp->opd_imp_seen_connected); + } + + RETURN(rc); } /* context key constructor/destructor: mdt_key_init, mdt_key_fini */ @@ -1180,7 +1208,7 @@ static struct obd_ops osp_obd_device_ops = { .o_reconnect = osp_reconnect, .o_connect = osp_obd_connect, .o_disconnect = osp_obd_disconnect, - .o_health_check = osp_obd_health_check, + .o_get_info = osp_obd_get_info, .o_import_event = osp_import_event, .o_iocontrol = osp_iocontrol, .o_statfs = osp_obd_statfs, @@ -1202,8 +1230,11 @@ static int __init osp_mod_init(void) lprocfs_osp_init_vars(&lvars); - rc = class_register_type(&osp_obd_device_ops, NULL, lvars.module_vars, - LUSTRE_OSP_NAME, &osp_device_type); + rc = class_register_type(&osp_obd_device_ops, NULL, NULL, +#ifndef HAVE_ONLY_PROCFS_SEQ + lvars.module_vars, +#endif + LUSTRE_OSP_NAME, &osp_device_type); /* create "osc" entry in procfs for compatibility purposes */ if (rc != 0) { @@ -1213,8 +1244,11 @@ static int __init osp_mod_init(void) lprocfs_lwp_init_vars(&lvars); - rc = class_register_type(&lwp_obd_device_ops, NULL, lvars.module_vars, - LUSTRE_LWP_NAME, &lwp_device_type); + rc = class_register_type(&lwp_obd_device_ops, NULL, NULL, +#ifndef HAVE_ONLY_PROCFS_SEQ + lvars.module_vars, +#endif + LUSTRE_LWP_NAME, &lwp_device_type); if (rc != 0) { class_unregister_type(LUSTRE_OSP_NAME); lu_kmem_fini(osp_caches);