Whamcloud - gitweb
Add lu_ref tracking to obd_device.
[fs/lustre-release.git] / lustre / mdt / mdt_handler.c
index b108250..74b2f11 100644 (file)
@@ -162,7 +162,7 @@ static struct mdt_device *mdt_dev(struct lu_device *d);
 static int mdt_regular_handle(struct ptlrpc_request *req);
 static int mdt_unpack_req_pack_rep(struct mdt_thread_info *info, __u32 flags);
 
-static struct lu_object_operations mdt_obj_ops;
+static const struct lu_object_operations mdt_obj_ops;
 
 int mdt_get_disposition(struct ldlm_reply *rep, int flag)
 {
@@ -1056,7 +1056,7 @@ out_shrink:
         return rc;
 }
 
-static struct lu_device_operations mdt_lu_ops;
+static const struct lu_device_operations mdt_lu_ops;
 
 static int lu_device_is_mdt(struct lu_device *d)
 {
@@ -1768,7 +1768,7 @@ struct mdt_object *mdt_object_find(const struct lu_env *env,
         ENTRY;
 
         CDEBUG(D_INFO, "Find object for "DFID"\n", PFID(f));
-        o = lu_object_find(env, d->mdt_md_dev.md_lu_dev.ld_site, f);
+        o = lu_object_find(env, &d->mdt_md_dev.md_lu_dev, f, NULL);
         if (unlikely(IS_ERR(o)))
                 m = (struct mdt_object *)o;
         else
@@ -1838,7 +1838,7 @@ int mdt_object_lock(struct mdt_thread_info *info, struct mdt_object *o,
                 }
 
                 /*
-                 * Finish res_id initializing by name hash marking patr of
+                 * Finish res_id initializing by name hash marking part of
                  * directory which is taking modification.
                  */
                 res_id->name[LUSTRE_RES_ID_HSH_OFF] = lh->mlh_pdo_hash;
@@ -2680,7 +2680,7 @@ int mdt_intent_lock_replace(struct mdt_thread_info *info,
          * lock.
          */
         if (new_lock == NULL)
-                new_lock = ldlm_handle2lock(&lh->mlh_reg_lh);
+                new_lock = ldlm_handle2lock_long(&lh->mlh_reg_lh, 0);
 
         if (new_lock == NULL && (flags & LDLM_FL_INTENT_ONLY)) {
                 lh->mlh_reg_lh.cookie = 0;
@@ -2720,8 +2720,18 @@ int mdt_intent_lock_replace(struct mdt_thread_info *info,
          * Fixup the lock to be given to the client.
          */
         lock_res_and_lock(new_lock);
-        new_lock->l_readers = 0;
-        new_lock->l_writers = 0;
+        /* Zero new_lock->l_readers and new_lock->l_writers without triggering
+         * possible blocking AST. */
+        while (new_lock->l_readers > 0) {
+                lu_ref_del(&new_lock->l_reference, "reader", new_lock);
+                lu_ref_del(&new_lock->l_reference, "user", new_lock);
+                new_lock->l_readers--;
+        }
+        while (new_lock->l_writers > 0) {
+                lu_ref_del(&new_lock->l_reference, "writer", new_lock);
+                lu_ref_del(&new_lock->l_reference, "user", new_lock);
+                new_lock->l_writers--;
+        }
 
         new_lock->l_export = class_export_get(req->rq_export);
         new_lock->l_blocking_ast = lock->l_blocking_ast;
@@ -2734,7 +2744,7 @@ int mdt_intent_lock_replace(struct mdt_thread_info *info,
                         &new_lock->l_exp_hash);
 
         unlock_res_and_lock(new_lock);
-        LDLM_LOCK_PUT(new_lock);
+        LDLM_LOCK_RELEASE(new_lock);
         lh->mlh_reg_lh.cookie = 0;
 
         RETURN(ELDLM_LOCK_REPLACED);
@@ -3070,15 +3080,15 @@ static int mdt_intent_policy(struct ldlm_namespace *ns,
 static void mdt_seq_adjust(const struct lu_env *env,
                           struct mdt_device *m, int lost)
 {
-        struct lu_site *ls = m->mdt_md_dev.md_lu_dev.ld_site;
+        struct md_site *ms = mdt_md_site(m);
         struct lu_range out;
         ENTRY;
 
-        LASSERT(ls && ls->ls_server_seq);
+        LASSERT(ms && ms->ms_server_seq);
         LASSERT(lost >= 0);
         /* get extra seq from seq_server, moving it's range up */
         while (lost-- > 0) {
-                seq_server_alloc_meta(ls->ls_server_seq, NULL, &out, env);
+                seq_server_alloc_meta(ms->ms_server_seq, NULL, &out, env);
         }
         EXIT;
 }
@@ -3086,25 +3096,27 @@ static void mdt_seq_adjust(const struct lu_env *env,
 static int mdt_seq_fini(const struct lu_env *env,
                         struct mdt_device *m)
 {
-        struct lu_site *ls = m->mdt_md_dev.md_lu_dev.ld_site;
+        struct md_site *ms = mdt_md_site(m);
         ENTRY;
 
-        if (ls && ls->ls_server_seq) {
-                seq_server_fini(ls->ls_server_seq, env);
-                OBD_FREE_PTR(ls->ls_server_seq);
-                ls->ls_server_seq = NULL;
+        if (ms != NULL) {
+                if (ms->ms_server_seq) {
+                        seq_server_fini(ms->ms_server_seq, env);
+                        OBD_FREE_PTR(ms->ms_server_seq);
+                        ms->ms_server_seq = NULL;
         }
 
-        if (ls && ls->ls_control_seq) {
-                seq_server_fini(ls->ls_control_seq, env);
-                OBD_FREE_PTR(ls->ls_control_seq);
-                ls->ls_control_seq = NULL;
+                if (ms->ms_control_seq) {
+                        seq_server_fini(ms->ms_control_seq, env);
+                        OBD_FREE_PTR(ms->ms_control_seq);
+                        ms->ms_control_seq = NULL;
         }
 
-        if (ls && ls->ls_client_seq) {
-                seq_client_fini(ls->ls_client_seq);
-                OBD_FREE_PTR(ls->ls_client_seq);
-                ls->ls_client_seq = NULL;
+                if (ms->ms_client_seq) {
+                        seq_client_fini(ms->ms_client_seq);
+                        OBD_FREE_PTR(ms->ms_client_seq);
+                        ms->ms_client_seq = NULL;
+                }
         }
 
         RETURN(0);
@@ -3114,25 +3126,25 @@ static int mdt_seq_init(const struct lu_env *env,
                         const char *uuid,
                         struct mdt_device *m)
 {
-        struct lu_site *ls;
+        struct md_site *ms;
         char *prefix;
         int rc;
         ENTRY;
 
-        ls = m->mdt_md_dev.md_lu_dev.ld_site;
+        ms = mdt_md_site(m);
 
         /*
          * This is sequence-controller node. Init seq-controller server on local
          * MDT.
          */
-        if (ls->ls_node_id == 0) {
-                LASSERT(ls->ls_control_seq == NULL);
+        if (ms->ms_node_id == 0) {
+                LASSERT(ms->ms_control_seq == NULL);
 
-                OBD_ALLOC_PTR(ls->ls_control_seq);
-                if (ls->ls_control_seq == NULL)
+                OBD_ALLOC_PTR(ms->ms_control_seq);
+                if (ms->ms_control_seq == NULL)
                         RETURN(-ENOMEM);
 
-                rc = seq_server_init(ls->ls_control_seq,
+                rc = seq_server_init(ms->ms_control_seq,
                                      m->mdt_bottom, uuid,
                                      LUSTRE_SEQ_CONTROLLER,
                                      env);
@@ -3140,13 +3152,13 @@ static int mdt_seq_init(const struct lu_env *env,
                 if (rc)
                         GOTO(out_seq_fini, rc);
 
-                OBD_ALLOC_PTR(ls->ls_client_seq);
-                if (ls->ls_client_seq == NULL)
+                OBD_ALLOC_PTR(ms->ms_client_seq);
+                if (ms->ms_client_seq == NULL)
                         GOTO(out_seq_fini, rc = -ENOMEM);
 
                 OBD_ALLOC(prefix, MAX_OBD_NAME + 5);
                 if (prefix == NULL) {
-                        OBD_FREE_PTR(ls->ls_client_seq);
+                        OBD_FREE_PTR(ms->ms_client_seq);
                         GOTO(out_seq_fini, rc = -ENOMEM);
                 }
 
@@ -3155,11 +3167,11 @@ static int mdt_seq_init(const struct lu_env *env,
 
                 /*
                  * Init seq-controller client after seq-controller server is
-                 * ready. Pass ls->ls_control_seq to it for direct talking.
+                 * ready. Pass ms->ms_control_seq to it for direct talking.
                  */
-                rc = seq_client_init(ls->ls_client_seq, NULL,
+                rc = seq_client_init(ms->ms_client_seq, NULL,
                                      LUSTRE_SEQ_METADATA, prefix,
-                                     ls->ls_control_seq);
+                                     ms->ms_control_seq);
                 OBD_FREE(prefix, MAX_OBD_NAME + 5);
 
                 if (rc)
@@ -3167,13 +3179,13 @@ static int mdt_seq_init(const struct lu_env *env,
         }
 
         /* Init seq-server on local MDT */
-        LASSERT(ls->ls_server_seq == NULL);
+        LASSERT(ms->ms_server_seq == NULL);
 
-        OBD_ALLOC_PTR(ls->ls_server_seq);
-        if (ls->ls_server_seq == NULL)
+        OBD_ALLOC_PTR(ms->ms_server_seq);
+        if (ms->ms_server_seq == NULL)
                 GOTO(out_seq_fini, rc = -ENOMEM);
 
-        rc = seq_server_init(ls->ls_server_seq,
+        rc = seq_server_init(ms->ms_server_seq,
                              m->mdt_bottom, uuid,
                              LUSTRE_SEQ_SERVER,
                              env);
@@ -3181,11 +3193,11 @@ static int mdt_seq_init(const struct lu_env *env,
                 GOTO(out_seq_fini, rc = -ENOMEM);
 
         /* Assign seq-controller client to local seq-server. */
-        if (ls->ls_node_id == 0) {
-                LASSERT(ls->ls_client_seq != NULL);
+        if (ms->ms_node_id == 0) {
+                LASSERT(ms->ms_client_seq != NULL);
 
-                rc = seq_server_set_cli(ls->ls_server_seq,
-                                        ls->ls_client_seq,
+                rc = seq_server_set_cli(ms->ms_server_seq,
+                                        ms->ms_client_seq,
                                         env);
         }
 
@@ -3204,7 +3216,7 @@ static int mdt_seq_init_cli(const struct lu_env *env,
                             struct mdt_device *m,
                             struct lustre_cfg *cfg)
 {
-        struct lu_site    *ls = m->mdt_md_dev.md_lu_dev.ld_site;
+        struct md_site    *ms = mdt_md_site(m);
         struct obd_device *mdc;
         struct obd_uuid   *uuidp, *mdcuuidp;
         char              *uuid_str, *mdc_uuid_str;
@@ -3228,7 +3240,7 @@ static int mdt_seq_init_cli(const struct lu_env *env,
 
         /* check if this is adding the first MDC and controller is not yet
          * initialized. */
-        if (index != 0 || ls->ls_client_seq)
+        if (index != 0 || ms->ms_client_seq)
                 RETURN(0);
 
         uuid_str = lustre_cfg_string(cfg, 1);
@@ -3245,9 +3257,9 @@ static int mdt_seq_init_cli(const struct lu_env *env,
                 CERROR("target %s not set up\n", mdc->obd_name);
                 rc = -EINVAL;
         } else {
-                LASSERT(ls->ls_control_exp);
-                OBD_ALLOC_PTR(ls->ls_client_seq);
-                if (ls->ls_client_seq != NULL) {
+                LASSERT(ms->ms_control_exp);
+                OBD_ALLOC_PTR(ms->ms_client_seq);
+                if (ms->ms_client_seq != NULL) {
                         char *prefix;
 
                         OBD_ALLOC(prefix, MAX_OBD_NAME + 5);
@@ -3257,8 +3269,8 @@ static int mdt_seq_init_cli(const struct lu_env *env,
                         snprintf(prefix, MAX_OBD_NAME + 5, "ctl-%s",
                                  mdc->obd_name);
 
-                        rc = seq_client_init(ls->ls_client_seq,
-                                             ls->ls_control_exp,
+                        rc = seq_client_init(ms->ms_client_seq,
+                                             ms->ms_control_exp,
                                              LUSTRE_SEQ_METADATA,
                                              prefix, NULL);
                         OBD_FREE(prefix, MAX_OBD_NAME + 5);
@@ -3268,8 +3280,8 @@ static int mdt_seq_init_cli(const struct lu_env *env,
                 if (rc)
                         RETURN(rc);
 
-                LASSERT(ls->ls_server_seq != NULL);
-                rc = seq_server_set_cli(ls->ls_server_seq, ls->ls_client_seq,
+                LASSERT(ms->ms_server_seq != NULL);
+                rc = seq_server_set_cli(ms->ms_server_seq, ms->ms_client_seq,
                                         env);
         }
 
@@ -3278,19 +3290,21 @@ static int mdt_seq_init_cli(const struct lu_env *env,
 
 static void mdt_seq_fini_cli(struct mdt_device *m)
 {
-        struct lu_site *ls;
+        struct md_site *ms;
 
         ENTRY;
 
-        ls = m->mdt_md_dev.md_lu_dev.ld_site;
+        ms = mdt_md_site(m);
 
-        if (ls && ls->ls_server_seq)
-                seq_server_set_cli(ls->ls_server_seq,
+        if (ms != NULL) {
+                if (ms->ms_server_seq)
+                        seq_server_set_cli(ms->ms_server_seq,
                                    NULL, NULL);
 
-        if (ls && ls->ls_control_exp) {
-                class_export_put(ls->ls_control_exp);
-                ls->ls_control_exp = NULL;
+                if (ms->ms_control_exp) {
+                        class_export_put(ms->ms_control_exp);
+                        ms->ms_control_exp = NULL;
+                }
         }
         EXIT;
 }
@@ -3301,13 +3315,13 @@ static void mdt_seq_fini_cli(struct mdt_device *m)
 static int mdt_fld_fini(const struct lu_env *env,
                         struct mdt_device *m)
 {
-        struct lu_site *ls = m->mdt_md_dev.md_lu_dev.ld_site;
+        struct md_site *ms = mdt_md_site(m);
         ENTRY;
 
-        if (ls && ls->ls_server_fld) {
-                fld_server_fini(ls->ls_server_fld, env);
-                OBD_FREE_PTR(ls->ls_server_fld);
-                ls->ls_server_fld = NULL;
+        if (ms && ms->ms_server_fld) {
+                fld_server_fini(ms->ms_server_fld, env);
+                OBD_FREE_PTR(ms->ms_server_fld);
+                ms->ms_server_fld = NULL;
         }
 
         RETURN(0);
@@ -3317,21 +3331,21 @@ static int mdt_fld_init(const struct lu_env *env,
                         const char *uuid,
                         struct mdt_device *m)
 {
-        struct lu_site *ls;
+        struct md_site *ms;
         int rc;
         ENTRY;
 
-        ls = m->mdt_md_dev.md_lu_dev.ld_site;
+        ms = mdt_md_site(m);
 
-        OBD_ALLOC_PTR(ls->ls_server_fld);
-        if (ls->ls_server_fld == NULL)
+        OBD_ALLOC_PTR(ms->ms_server_fld);
+        if (ms->ms_server_fld == NULL)
                 RETURN(rc = -ENOMEM);
 
-        rc = fld_server_init(ls->ls_server_fld,
+        rc = fld_server_init(ms->ms_server_fld,
                              m->mdt_bottom, uuid, env);
         if (rc) {
-                OBD_FREE_PTR(ls->ls_server_fld);
-                ls->ls_server_fld = NULL;
+                OBD_FREE_PTR(ms->ms_server_fld);
+                ms->ms_server_fld = NULL;
                 RETURN(rc);
         }
 
@@ -3671,7 +3685,7 @@ static void mdt_stack_fini(const struct lu_env *env,
         m->mdt_bottom = NULL;
 }
 
-static struct lu_device *mdt_layer_setup(const struct lu_env *env,
+static struct lu_device *mdt_layer_setup(struct lu_env *env,
                                          const char *typename,
                                          struct lu_device *child,
                                          struct lustre_cfg *cfg)
@@ -3727,6 +3741,7 @@ static struct lu_device *mdt_layer_setup(const struct lu_env *env,
                 GOTO(out_alloc, rc);
         }
         lu_device_get(d);
+        lu_ref_add(&d->ld_reference, "lu-stack", &lu_site_init);
 
         RETURN(d);
 
@@ -3739,7 +3754,7 @@ out:
         return ERR_PTR(rc);
 }
 
-static int mdt_stack_init(const struct lu_env *env,
+static int mdt_stack_init(struct lu_env *env,
                           struct mdt_device *m, struct lustre_cfg *cfg)
 {
         struct lu_device  *d = &m->mdt_md_dev.md_lu_dev;
@@ -3828,8 +3843,11 @@ static void mdt_fini(const struct lu_env *env, struct mdt_device *m)
         mdt_stack_fini(env, m, md2lu_dev(m->mdt_child));
 
         if (ls) {
+                struct md_site *mite;
+
                 lu_site_fini(ls);
-                OBD_FREE_PTR(ls);
+                mite = lu_site2md(ls);
+                OBD_FREE_PTR(mite);
                 d->ld_site = NULL;
         }
         LASSERT(atomic_read(&d->ld_ref) == 0);
@@ -3892,6 +3910,7 @@ static int mdt_init0(const struct lu_env *env, struct mdt_device *m,
         struct lustre_mount_info  *lmi;
         struct lustre_sb_info     *lsi;
         struct lu_site            *s;
+        struct md_site            *mite;
         const char                *identity_upcall = "NONE";
         int                        rc;
         ENTRY;
@@ -3930,11 +3949,13 @@ static int mdt_init0(const struct lu_env *env, struct mdt_device *m,
 
         spin_lock_init(&m->mdt_client_bitmap_lock);
 
-        OBD_ALLOC_PTR(s);
-        if (s == NULL)
+        OBD_ALLOC_PTR(mite);
+        if (mite == NULL)
                 RETURN(-ENOMEM);
 
         md_device_init(&m->mdt_md_dev, ldt);
+        s = &mite->ms_lu;
+
         m->mdt_md_dev.md_lu_dev.ld_ops = &mdt_lu_ops;
         m->mdt_md_dev.md_lu_dev.ld_obd = obd;
         /* set this lu_device to obd, because error handling need it */
@@ -3962,7 +3983,7 @@ static int mdt_init0(const struct lu_env *env, struct mdt_device *m,
 
         /* set server index */
         LASSERT(num);
-        s->ls_node_id = simple_strtol(num, NULL, 10);
+        lu_site2md(s)->ms_node_id = simple_strtol(num, NULL, 10);
 
         /* failover is the default
          * FIXME: we do not failout mds0/mgs, which may cause some problems.
@@ -3981,7 +4002,7 @@ static int mdt_init0(const struct lu_env *env, struct mdt_device *m,
         }
 
         /* init the stack */
-        rc = mdt_stack_init(env, m, cfg);
+        rc = mdt_stack_init((struct lu_env *)env, m, cfg);
         if (rc) {
                 CERROR("Can't init device stack, rc %d\n", rc);
                 GOTO(err_fini_proc, rc);
@@ -4182,7 +4203,8 @@ static struct lu_object *mdt_object_alloc(const struct lu_env *env,
                 RETURN(NULL);
 }
 
-static int mdt_object_init(const struct lu_env *env, struct lu_object *o)
+static int mdt_object_init(const struct lu_env *env, struct lu_object *o,
+                           const struct lu_object_conf *_)
 {
         struct mdt_device *d = mdt_dev(o->lo_dev);
         struct lu_device  *under;
@@ -4219,21 +4241,14 @@ static void mdt_object_free(const struct lu_env *env, struct lu_object *o)
         EXIT;
 }
 
-static int mdt_object_print(const struct lu_env *env, void *cookie,
-                            lu_printer_t p, const struct lu_object *o)
-{
-        return (*p)(env, cookie, LUSTRE_MDT_NAME"-object@%p", o);
-}
-
-static struct lu_device_operations mdt_lu_ops = {
+static const struct lu_device_operations mdt_lu_ops = {
         .ldo_object_alloc   = mdt_object_alloc,
         .ldo_process_config = mdt_process_config
 };
 
-static struct lu_object_operations mdt_obj_ops = {
+static const struct lu_object_operations mdt_obj_ops = {
         .loo_object_init    = mdt_object_init,
-        .loo_object_free    = mdt_object_free,
-        .loo_object_print   = mdt_object_print
+        .loo_object_free    = mdt_object_free
 };
 
 /* mds_connect_internal */
@@ -4793,6 +4808,9 @@ static struct lu_device_type_operations mdt_device_type_ops = {
         .ldto_init = mdt_type_init,
         .ldto_fini = mdt_type_fini,
 
+        .ldto_start = mdt_type_start,
+        .ldto_stop  = mdt_type_stop,
+
         .ldto_device_alloc = mdt_device_alloc,
         .ldto_device_free  = mdt_device_free,
         .ldto_device_fini  = mdt_device_fini