Whamcloud - gitweb
LU-6179 llite: remove LOCKAHEAD_OLD compatibility
[fs/lustre-release.git] / lustre / ofd / ofd_dev.c
index 531d95a..bb60e94 100644 (file)
@@ -82,7 +82,6 @@
 
 /* Slab for OFD object allocation */
 static struct kmem_cache *ofd_object_kmem;
-
 static struct lu_kmem_descr ofd_caches[] = {
        {
                .ckd_cache = &ofd_object_kmem,
@@ -162,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;
@@ -181,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);
@@ -320,13 +325,7 @@ static bool match_symlink_param(char *param)
                sval = strchr(param, '=');
                if (sval != NULL) {
                        paramlen = sval - param;
-                       if (strncmp(param, "writethrough_cache_enable",
-                                   paramlen) == 0 ||
-                           strncmp(param, "readcache_max_filesize",
-                                   paramlen) == 0 ||
-                           strncmp(param, "read_cache_enable",
-                                   paramlen) == 0 ||
-                           strncmp(param, "brw_stats", paramlen) == 0)
+                       if (strncmp(param, "brw_stats", paramlen) == 0)
                                return true;
                }
        }
@@ -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;
@@ -715,8 +725,31 @@ static struct lu_device_operations ofd_lu_ops = {
  */
 static void ofd_procfs_add_brw_stats_symlink(struct ofd_device *ofd)
 {
-       struct obd_device       *obd = ofd_obd(ofd);
-       struct obd_device       *osd_obd = ofd->ofd_osd_exp->exp_obd;
+       struct obd_device *obd = ofd_obd(ofd);
+       struct obd_device *osd_obd = ofd->ofd_osd_exp->exp_obd;
+       struct kobj_type *osd_type;
+       int i;
+
+       osd_type = get_ktype(&ofd->ofd_osd->dd_kobj);
+       for (i = 0; osd_type->default_attrs[i]; i++) {
+               if (strcmp(osd_type->default_attrs[i]->name,
+                          "read_cache_enable") == 0) {
+                       ofd->ofd_read_cache_enable =
+                               osd_type->default_attrs[i];
+               }
+
+               if (strcmp(osd_type->default_attrs[i]->name,
+                          "readcache_max_filesize") == 0) {
+                       ofd->ofd_read_cache_max_filesize =
+                               osd_type->default_attrs[i];
+               }
+
+               if (strcmp(osd_type->default_attrs[i]->name,
+                          "writethrough_cache_enable") == 0) {
+                       ofd->ofd_write_cache_enable =
+                               osd_type->default_attrs[i];
+               }
+       }
 
        if (obd->obd_proc_entry == NULL)
                return;
@@ -724,20 +757,6 @@ static void ofd_procfs_add_brw_stats_symlink(struct ofd_device *ofd)
        lprocfs_add_symlink("brw_stats", obd->obd_proc_entry,
                            "../../%s/%s/brw_stats",
                            osd_obd->obd_type->typ_name, obd->obd_name);
-
-       lprocfs_add_symlink("read_cache_enable", obd->obd_proc_entry,
-                           "../../%s/%s/read_cache_enable",
-                           osd_obd->obd_type->typ_name, obd->obd_name);
-
-       lprocfs_add_symlink("readcache_max_filesize",
-                           obd->obd_proc_entry,
-                           "../../%s/%s/readcache_max_filesize",
-                           osd_obd->obd_type->typ_name, obd->obd_name);
-
-       lprocfs_add_symlink("writethrough_cache_enable",
-                           obd->obd_proc_entry,
-                           "../../%s/%s/writethrough_cache_enable",
-                           osd_obd->obd_type->typ_name, obd->obd_name);
 }
 #endif
 
@@ -750,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);
@@ -789,18 +809,19 @@ int ofd_fid_fini(const struct lu_env *env, struct ofd_device *ofd)
  */
 int ofd_fid_init(const struct lu_env *env, struct ofd_device *ofd)
 {
-       struct seq_server_site  *ss = &ofd->ofd_seq_site;
-       struct lu_device        *lu = &ofd->ofd_dt_dev.dd_lu_dev;
-       char                    *obd_name = ofd_name(ofd);
-       char                    *name = NULL;
-       int                     rc = 0;
+       struct seq_server_site *ss = &ofd->ofd_seq_site;
+       struct lu_device *lu = &ofd->ofd_dt_dev.dd_lu_dev;
+       char *obd_name = ofd_name(ofd);
+       char *name = NULL;
+       int len = strlen(obd_name) + 7;
+       int rc = 0;
 
        ss = &ofd->ofd_seq_site;
        lu->ld_site->ld_seq_site = ss;
        ss->ss_lu = lu->ld_site;
        ss->ss_node_id = ofd->ofd_lut.lut_lsd.lsd_osd_index;
 
-       OBD_ALLOC(name, sizeof(obd_name) * 2 + 10);
+       OBD_ALLOC(name, len);
        if (name == NULL)
                return -ENOMEM;
 
@@ -811,7 +832,7 @@ int ofd_fid_init(const struct lu_env *env, struct ofd_device *ofd)
        rc = seq_server_init(env, ss->ss_server_seq, ofd->ofd_osd, obd_name,
                             LUSTRE_SEQ_SERVER, ss);
        if (rc) {
-               CERROR("%s : seq server init error %d\n", obd_name, rc);
+               CERROR("%s: seq server init error: rc = %d\n", obd_name, rc);
                GOTO(out_server, rc);
        }
        ss->ss_server_seq->lss_space.lsr_index = ss->ss_node_id;
@@ -820,15 +841,11 @@ int ofd_fid_init(const struct lu_env *env, struct ofd_device *ofd)
        if (ss->ss_client_seq == NULL)
                GOTO(out_server, rc = -ENOMEM);
 
-       /*
-        * It always printed as "%p", so that the name is unique in the kernel,
-        * even if the filesystem is mounted twice. So sizeof(.) * 2 is enough.
-        */
-       snprintf(name, sizeof(obd_name) * 2 + 7, "%p-super", obd_name);
+       snprintf(name, len, "%s-super", obd_name);
        rc = seq_client_init(ss->ss_client_seq, NULL, LUSTRE_SEQ_DATA,
                             name, NULL);
        if (rc) {
-               CERROR("%s : seq client init error %d\n", obd_name, rc);
+               CERROR("%s: seq client init error: rc = %d\n", obd_name, rc);
                GOTO(out_client, rc);
        }
 
@@ -845,7 +862,7 @@ out_server:
                ss->ss_server_seq = NULL;
        }
 out_name:
-       OBD_FREE(name, sizeof(obd_name) * 2 + 10);
+       OBD_FREE(name, len);
 
        return rc;
 }
@@ -1353,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);
                }
        }
@@ -1486,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);
@@ -1715,21 +1735,13 @@ static int ofd_create_hdl(struct tgt_session_info *tsi)
        EXIT;
        ofd_counter_incr(exp, LPROC_OFD_STATS_CREATE,
                         tsi->tsi_jobid, 1);
+       if (unlikely(!oseq->os_last_id_synced))
+               oseq->os_last_id_synced = 1;
 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:
@@ -1951,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))
@@ -2024,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;
@@ -2071,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;
@@ -2475,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)
@@ -2707,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[] = {
@@ -2831,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;
@@ -2848,9 +2861,6 @@ static int ofd_init0(const struct lu_env *env, struct ofd_device *m,
        obt = &obd->u.obt;
        obt->obt_magic = OBT_MAGIC;
 
-       m->ofd_fmd_max_num = OFD_FMD_MAX_NUM_DEFAULT;
-       m->ofd_fmd_max_age = OFD_FMD_MAX_AGE_DEFAULT;
-
        spin_lock_init(&m->ofd_flags_lock);
        m->ofd_raid_degraded = 0;
        m->ofd_checksum_t10pi_enforce = 0;
@@ -2871,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;
@@ -2893,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)
@@ -2928,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;
@@ -2940,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;
@@ -2976,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:
@@ -2983,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;
 }
 
@@ -3015,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);
@@ -3028,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;
@@ -3147,13 +3162,6 @@ static int __init ofd_init(void)
        rc = lu_kmem_init(ofd_caches);
        if (rc)
                return rc;
-
-       rc = ofd_fmd_init();
-       if (rc) {
-               lu_kmem_fini(ofd_caches);
-               return(rc);
-       }
-
        rc = class_register_type(&ofd_obd_ops, NULL, true, NULL,
                                 LUSTRE_OST_NAME, &ofd_device_type);
        return rc;
@@ -3167,7 +3175,6 @@ static int __init ofd_init(void)
  */
 static void __exit ofd_exit(void)
 {
-       ofd_fmd_exit();
        lu_kmem_fini(ofd_caches);
        class_unregister_type(LUSTRE_OST_NAME);
 }