Whamcloud - gitweb
LU-6179 llite: remove LOCKAHEAD_OLD compatibility
[fs/lustre-release.git] / lustre / ofd / ofd_dev.c
index 8eead96..bb60e94 100644 (file)
@@ -82,8 +82,6 @@
 
 /* Slab for OFD object allocation */
 static struct kmem_cache *ofd_object_kmem;
-struct kmem_cache *tgt_fmd_kmem;
-
 static struct lu_kmem_descr ofd_caches[] = {
        {
                .ckd_cache = &ofd_object_kmem,
@@ -91,11 +89,6 @@ static struct lu_kmem_descr ofd_caches[] = {
                .ckd_size  = sizeof(struct ofd_object)
        },
        {
-               .ckd_cache = &tgt_fmd_kmem,
-               .ckd_name  = "ll_fmd_cache",
-               .ckd_size  = sizeof(struct tgt_fmd_data)
-       },
-       {
                .ckd_cache = NULL
        }
 };
@@ -168,7 +161,8 @@ out:
  * \retval             negative value on error
  */
 static int ofd_stack_init(const struct lu_env *env,
-                         struct ofd_device *m, struct lustre_cfg *cfg)
+                         struct ofd_device *m, struct lustre_cfg *cfg,
+                         u32 *lmd_flags)
 {
        const char              *dev = lustre_cfg_string(cfg, 0);
        struct lu_device        *d;
@@ -187,8 +181,13 @@ static int ofd_stack_init(const struct lu_env *env,
        }
 
        lmd = s2lsi(lmi->lmi_sb)->lsi_lmd;
-       if (lmd != NULL && lmd->lmd_flags & LMD_FLG_SKIP_LFSCK)
-               m->ofd_skip_lfsck = 1;
+       if (lmd) {
+               if (lmd->lmd_flags & LMD_FLG_SKIP_LFSCK)
+                       m->ofd_skip_lfsck = 1;
+               if (lmd->lmd_flags & LMD_FLG_NO_PRECREATE)
+                       m->ofd_no_precreate = 1;
+               *lmd_flags = lmd->lmd_flags;
+       }
 
        /* find bottom osd */
        OBD_ALLOC(osdname, MTI_NAME_MAXLEN);
@@ -456,6 +455,14 @@ static int ofd_object_init(const struct lu_env *env, struct lu_object *o,
        RETURN(rc);
 }
 
+static void ofd_object_free_rcu(struct rcu_head *head)
+{
+       struct ofd_object *of = container_of(head, struct ofd_object,
+                                            ofo_header.loh_rcu);
+
+       kmem_cache_free(ofd_object_kmem, of);
+}
+
 /**
  * Implementation of lu_object_operations::loo_object_free.
  *
@@ -477,7 +484,8 @@ static void ofd_object_free(const struct lu_env *env, struct lu_object *o)
 
        lu_object_fini(o);
        lu_object_header_fini(h);
-       OBD_SLAB_FREE_PTR(of, ofd_object_kmem);
+       OBD_FREE_PRE(of, sizeof(*of), "slab-freed");
+       call_rcu(&of->ofo_header.loh_rcu, ofd_object_free_rcu);
        EXIT;
 }
 
@@ -640,6 +648,8 @@ static int ofd_prepare(const struct lu_env *env, struct lu_device *pdev,
        LASSERTF(rc == 0, "register namespace failed: rc = %d\n", rc);
 
        target_recovery_init(&ofd->ofd_lut, tgt_request_handle);
+       OBD_FAIL_TIMEOUT_ORSET(OBD_FAIL_OST_PREPARE_DELAY, OBD_FAIL_ONCE,
+                              (OBD_TIMEOUT_DEFAULT + 1) / 4);
        LASSERT(obd->obd_no_conn);
        spin_lock(&obd->obd_dev_lock);
        obd->obd_no_conn = 0;
@@ -759,6 +769,7 @@ static void ofd_procfs_fini(struct ofd_device *ofd)
 {
        struct obd_device *obd = ofd_obd(ofd);
 
+       tgt_tunables_fini(&ofd->ofd_lut);
        lprocfs_free_per_client_stats(obd);
        lprocfs_obd_cleanup(obd);
        lprocfs_free_obd_stats(obd);
@@ -1359,7 +1370,7 @@ out:
                res = ldlm_resource_get(ofd->ofd_namespace, NULL,
                                        &tsi->tsi_resid, LDLM_EXTENT, 0);
                if (!IS_ERR(res)) {
-                       ldlm_res_lvbo_update(tsi->tsi_env, res, NULL, 0);
+                       ldlm_res_lvbo_update(res, NULL, 0);
                        ldlm_resource_putref(res);
                }
        }
@@ -1492,6 +1503,9 @@ static int ofd_create_hdl(struct tgt_session_info *tsi)
        if (OBD_FAIL_CHECK(OBD_FAIL_OST_EROFS))
                RETURN(-EROFS);
 
+       if (ofd->ofd_no_precreate)
+               return -EPERM;
+
        repbody = req_capsule_server_get(tsi->tsi_pill, &RMF_OST_BODY);
        if (repbody == NULL)
                RETURN(-ENOMEM);
@@ -1726,18 +1740,8 @@ static int ofd_create_hdl(struct tgt_session_info *tsi)
 out:
        mutex_unlock(&oseq->os_create_lock);
 out_nolock:
-       if (rc == 0) {
-#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 8, 53, 0)
-               struct ofd_thread_info  *info = ofd_info(tsi->tsi_env);
-               struct lu_fid           *fid = &info->fti_fid;
-
-               /* For compatible purpose, it needs to convert back to
-                * OST ID before put it on wire. */
-               *fid = rep_oa->o_oi.oi_fid;
-               fid_to_ostid(fid, &rep_oa->o_oi);
-#endif
+       if (rc == 0)
                rep_oa->o_valid |= OBD_MD_FLID | OBD_MD_FLGROUP;
-       }
        ofd_seq_put(tsi->tsi_env, oseq);
 
 out_sem:
@@ -1959,7 +1963,7 @@ static int ofd_punch_hdl(struct tgt_session_info *tsi)
        OBD_FAIL_TIMEOUT(OBD_FAIL_OST_PAUSE_PUNCH, cfs_fail_val);
 
        /* check that we do support OBD_CONNECT_TRUNCLOCK. */
-       CLASSERT(OST_CONNECT_SUPPORTED & OBD_CONNECT_TRUNCLOCK);
+       BUILD_BUG_ON(!(OST_CONNECT_SUPPORTED & OBD_CONNECT_TRUNCLOCK));
 
        if ((oa->o_valid & (OBD_MD_FLSIZE | OBD_MD_FLBLOCKS)) !=
            (OBD_MD_FLSIZE | OBD_MD_FLBLOCKS))
@@ -2032,7 +2036,7 @@ out:
                if (!IS_ERR(res)) {
                        struct ost_lvb *res_lvb;
 
-                       ldlm_res_lvbo_update(tsi->tsi_env, res, NULL, 0);
+                       ldlm_res_lvbo_update(res, NULL, 0);
                        res_lvb = res->lr_lvb_data;
                        repbody->oa.o_valid |= OBD_MD_FLBLOCKS;
                        repbody->oa.o_blocks = res_lvb->lvb_blocks;
@@ -2079,7 +2083,8 @@ static int ofd_ladvise_prefetch(const struct lu_env *env,
                        PTLRPC_MAX_BRW_PAGES;
                rnb.rnb_offset = start_index << PAGE_SHIFT;
                rnb.rnb_len = nr_local << PAGE_SHIFT;
-               rc = dt_bufs_get(env, ofd_object_child(fo), &rnb, lnb, dbt);
+               rc = dt_bufs_get(env, ofd_object_child(fo), &rnb, lnb,
+                                PTLRPC_MAX_BRW_PAGES, dbt);
                if (unlikely(rc < 0))
                        break;
                nr_local = rc;
@@ -2483,14 +2488,14 @@ static int ofd_rw_hpreq_check(struct ptlrpc_request *req)
        rnb += ioo->ioo_bufcnt - 1;
        pa.lpa_extent.end = rnb->rnb_offset + rnb->rnb_len - 1;
 
-       DEBUG_REQ(D_RPCTRACE, req, "%s %s: refresh rw locks: "DFID
-                 " (%llu->%llu)\n", tgt_name(tsi->tsi_tgt),
-                 current->comm, PFID(&tsi->tsi_fid), pa.lpa_extent.start,
-                 pa.lpa_extent.end);
+       DEBUG_REQ(D_RPCTRACE, req,
+                 "%s %s: refresh rw locks for "DFID" (%llu->%llu)",
+                 tgt_name(tsi->tsi_tgt), current->comm, PFID(&tsi->tsi_fid),
+                 pa.lpa_extent.start, pa.lpa_extent.end);
 
        ofd_prolong_extent_locks(tsi, &pa);
 
-       CDEBUG(D_DLMTRACE, "%s: refreshed %u locks timeout for req %p.\n",
+       CDEBUG(D_DLMTRACE, "%s: refreshed %u locks timeout for req %p\n",
               tgt_name(tsi->tsi_tgt), pa.lpa_blocks_cnt, req);
 
        if (pa.lpa_blocks_cnt > 0)
@@ -2715,26 +2720,25 @@ TGT_RPC_HANDLER(OST_FIRST_OPC,
                0,                      OST_SET_INFO,   ofd_set_info_hdl,
                &RQF_OBD_SET_INFO, LUSTRE_OST_VERSION),
 TGT_OST_HDL(0,                         OST_GET_INFO,   ofd_get_info_hdl),
-TGT_OST_HDL(HABEO_CORPUS| HABEO_REFERO,        OST_GETATTR,    ofd_getattr_hdl),
-TGT_OST_HDL(HABEO_CORPUS| HABEO_REFERO | MUTABOR,
+TGT_OST_HDL(HAS_BODY | HAS_REPLY,      OST_GETATTR,    ofd_getattr_hdl),
+TGT_OST_HDL(HAS_BODY | HAS_REPLY | IS_MUTABLE,
                                        OST_SETATTR,    ofd_setattr_hdl),
-TGT_OST_HDL(0          | HABEO_REFERO | MUTABOR,
+TGT_OST_HDL(HAS_REPLY | IS_MUTABLE,
                                        OST_CREATE,     ofd_create_hdl),
-TGT_OST_HDL(0          | HABEO_REFERO | MUTABOR,
+TGT_OST_HDL(HAS_REPLY | IS_MUTABLE,
                                        OST_DESTROY,    ofd_destroy_hdl),
-TGT_OST_HDL(0          | HABEO_REFERO, OST_STATFS,     ofd_statfs_hdl),
-TGT_OST_HDL_HP(HABEO_CORPUS| HABEO_REFERO,
-                                       OST_BRW_READ,   tgt_brw_read,
+TGT_OST_HDL(HAS_REPLY, OST_STATFS,     ofd_statfs_hdl),
+TGT_OST_HDL_HP(HAS_BODY | HAS_REPLY,   OST_BRW_READ,   tgt_brw_read,
                                                        ofd_hp_brw),
 /* don't set CORPUS flag for brw_write because -ENOENT may be valid case */
-TGT_OST_HDL_HP(HABEO_CORPUS| MUTABOR,  OST_BRW_WRITE,  tgt_brw_write,
+TGT_OST_HDL_HP(HAS_BODY | IS_MUTABLE,  OST_BRW_WRITE,  tgt_brw_write,
                                                        ofd_hp_brw),
-TGT_OST_HDL_HP(HABEO_CORPUS| HABEO_REFERO | MUTABOR,
+TGT_OST_HDL_HP(HAS_BODY | HAS_REPLY | IS_MUTABLE,
                                        OST_PUNCH,      ofd_punch_hdl,
                                                        ofd_hp_punch),
-TGT_OST_HDL(HABEO_CORPUS| HABEO_REFERO,        OST_SYNC,       ofd_sync_hdl),
-TGT_OST_HDL(0          | HABEO_REFERO, OST_QUOTACTL,   ofd_quotactl),
-TGT_OST_HDL(HABEO_CORPUS | HABEO_REFERO, OST_LADVISE,  ofd_ladvise_hdl),
+TGT_OST_HDL(HAS_BODY | HAS_REPLY,      OST_SYNC,       ofd_sync_hdl),
+TGT_OST_HDL(HAS_REPLY, OST_QUOTACTL,   ofd_quotactl),
+TGT_OST_HDL(HAS_BODY | HAS_REPLY, OST_LADVISE, ofd_ladvise_hdl),
 };
 
 static struct tgt_opc_slice ofd_common_slice[] = {
@@ -2839,6 +2843,7 @@ static int ofd_init0(const struct lu_env *env, struct ofd_device *m,
        struct lu_fid fid;
        struct nm_config_file *nodemap_config;
        struct obd_device_target *obt;
+       u32 lmd_flags = 0;
        int rc;
 
        ENTRY;
@@ -2876,12 +2881,6 @@ static int ofd_init0(const struct lu_env *env, struct ofd_device *m,
        /* set this lu_device to obd, because error handling need it */
        obd->obd_lu_dev = &m->ofd_dt_dev.dd_lu_dev;
 
-       rc = ofd_tunables_init(m);
-       if (rc) {
-               CERROR("Can't init ofd lprocfs, rc %d\n", rc);
-               RETURN(rc);
-       }
-
        /* No connection accepted until configurations will finish */
        spin_lock(&obd->obd_dev_lock);
        obd->obd_no_conn = 1;
@@ -2898,12 +2897,13 @@ static int ofd_init0(const struct lu_env *env, struct ofd_device *m,
 
        info = ofd_info_init(env, NULL);
        if (info == NULL)
-               GOTO(err_fini_proc, rc = -EFAULT);
+               RETURN(-EFAULT);
 
-       rc = ofd_stack_init(env, m, cfg);
+       rc = ofd_stack_init(env, m, cfg, &lmd_flags);
        if (rc) {
-               CERROR("Can't init device stack, rc %d\n", rc);
-               GOTO(err_fini_proc, rc);
+               CERROR("%s: can't init device stack, rc %d\n",
+                      obd->obd_name, rc);
+               RETURN(rc);
        }
 
 #if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 14, 53, 0)
@@ -2933,6 +2933,15 @@ static int ofd_init0(const struct lu_env *env, struct ofd_device *m,
        if (rc)
                GOTO(err_free_ns, rc);
 
+       if (lmd_flags & LMD_FLG_SKIP_LFSCK)
+               m->ofd_skip_lfsck = 1;
+       if (lmd_flags & LMD_FLG_LOCAL_RECOV)
+               m->ofd_lut.lut_local_recovery = 1;
+
+       rc = ofd_tunables_init(m);
+       if (rc)
+               GOTO(err_fini_lut, rc);
+
        tgd->tgd_reserved_pcnt = 0;
 
        m->ofd_brw_size = m->ofd_lut.lut_dt_conf.ddp_brw_size;
@@ -2945,7 +2954,7 @@ static int ofd_init0(const struct lu_env *env, struct ofd_device *m,
 
        rc = ofd_fs_setup(env, m, obd);
        if (rc)
-               GOTO(err_fini_lut, rc);
+               GOTO(err_fini_proc, rc);
 
        fid.f_seq = FID_SEQ_LOCAL_NAME;
        fid.f_oid = 1;
@@ -2981,6 +2990,8 @@ err_fini_los:
        m->ofd_los = NULL;
 err_fini_fs:
        ofd_fs_cleanup(env, m);
+err_fini_proc:
+       ofd_procfs_fini(m);
 err_fini_lut:
        tgt_fini(env, &m->ofd_lut);
 err_free_ns:
@@ -2988,8 +2999,6 @@ err_free_ns:
        obd->obd_namespace = m->ofd_namespace = NULL;
 err_fini_stack:
        ofd_stack_fini(env, m, &m->ofd_osd->dd_lu_dev);
-err_fini_proc:
-       ofd_procfs_fini(m);
        return rc;
 }
 
@@ -3020,6 +3029,7 @@ static void ofd_fini(const struct lu_env *env, struct ofd_device *m)
        obd_exports_barrier(obd);
        obd_zombie_barrier();
 
+       ofd_procfs_fini(m);
        tgt_fini(env, &m->ofd_lut);
        ofd_stop_inconsistency_verification_thread(m);
        lfsck_degister(env, m->ofd_osd);
@@ -3033,7 +3043,7 @@ static void ofd_fini(const struct lu_env *env, struct ofd_device *m)
        }
 
        ofd_stack_fini(env, m, &m->ofd_dt_dev.dd_lu_dev);
-       ofd_procfs_fini(m);
+
        LASSERT(atomic_read(&d->ld_ref) == 0);
        server_put_mount(obd->obd_name, true);
        EXIT;