Whamcloud - gitweb
LU-8130 lu_object: convert lu_object cache to rhashtable
[fs/lustre-release.git] / lustre / ofd / ofd_dev.c
index bb60e94..8b2a720 100644 (file)
@@ -77,6 +77,7 @@
 #include <lustre_quota.h>
 #include <lustre_nodemap.h>
 #include <lustre_log.h>
+#include <linux/falloc.h>
 
 #include "ofd_internal.h"
 
@@ -256,11 +257,8 @@ static void ofd_stack_fini(const struct lu_env *env, struct ofd_device *m,
        }
 
        lu_site_purge(env, top->ld_site, ~0);
-       if (!cfs_hash_is_empty(top->ld_site->ls_obj_hash)) {
-               LIBCFS_DEBUG_MSG_DATA_DECL(msgdata, D_OTHER, NULL);
-               lu_site_print(env, top->ld_site, &msgdata, lu_cdebug_printer);
-       }
-
+       lu_site_print(env, top->ld_site, &top->ld_site->ls_obj_hash.nelems,
+                     D_OTHER, lu_cdebug_printer);
        LASSERT(m->ofd_osd_exp);
        obd_disconnect(m->ofd_osd_exp);
 
@@ -842,17 +840,12 @@ int ofd_fid_init(const struct lu_env *env, struct ofd_device *ofd)
                GOTO(out_server, rc = -ENOMEM);
 
        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: rc = %d\n", obd_name, rc);
-               GOTO(out_client, rc);
-       }
+       seq_client_init(ss->ss_client_seq, NULL, LUSTRE_SEQ_DATA,
+                       name, NULL);
 
        rc = seq_server_set_cli(env, ss->ss_server_seq, ss->ss_client_seq);
 
        if (rc) {
-out_client:
                seq_client_fini(ss->ss_client_seq);
                OBD_FREE_PTR(ss->ss_client_seq);
                ss->ss_client_seq = NULL;
@@ -884,6 +877,7 @@ static int ofd_set_info_hdl(struct tgt_session_info *tsi)
        void                    *key, *val = NULL;
        int                      keylen, vallen, rc = 0;
        bool                     is_grant_shrink;
+       ktime_t                  kstart = ktime_get();
 
        ENTRY;
 
@@ -932,7 +926,7 @@ static int ofd_set_info_hdl(struct tgt_session_info *tsi)
                rc = -EOPNOTSUPP;
        }
        ofd_counter_incr(tsi->tsi_exp, LPROC_OFD_STATS_SET_INFO,
-                        tsi->tsi_jobid, 1);
+                        tsi->tsi_jobid, ktime_us_delta(ktime_get(), kstart));
 
        RETURN(rc);
 }
@@ -1078,6 +1072,7 @@ static int ofd_get_info_hdl(struct tgt_session_info *tsi)
        void                            *key;
        int                              keylen;
        int                              replylen, rc = 0;
+       ktime_t                          kstart = ktime_get();
 
        ENTRY;
 
@@ -1192,7 +1187,7 @@ out_put:
                rc = -EOPNOTSUPP;
        }
        ofd_counter_incr(tsi->tsi_exp, LPROC_OFD_STATS_GET_INFO,
-                        tsi->tsi_jobid, 1);
+                        tsi->tsi_jobid, ktime_us_delta(ktime_get(), kstart));
 
        RETURN(rc);
 }
@@ -1217,6 +1212,7 @@ static int ofd_getattr_hdl(struct tgt_session_info *tsi)
        struct ofd_object       *fo;
        __u64                    flags = 0;
        enum ldlm_mode           lock_mode = LCK_PR;
+       ktime_t                  kstart = ktime_get();
        bool                     srvlock;
        int                      rc;
        ENTRY;
@@ -1281,7 +1277,7 @@ out:
                tgt_extent_unlock(&lh, lock_mode);
 
        ofd_counter_incr(tsi->tsi_exp, LPROC_OFD_STATS_GETATTR,
-                        tsi->tsi_jobid, 1);
+                        tsi->tsi_jobid, ktime_us_delta(ktime_get(), kstart));
 
        repbody->oa.o_valid |= OBD_MD_FLFLAGS;
        repbody->oa.o_flags = OBD_FL_FLUSH;
@@ -1308,6 +1304,7 @@ static int ofd_setattr_hdl(struct tgt_session_info *tsi)
        struct ost_body         *repbody;
        struct ldlm_resource    *res;
        struct ofd_object       *fo;
+       ktime_t                  kstart = ktime_get();
        int                      rc = 0;
 
        ENTRY;
@@ -1356,7 +1353,7 @@ static int ofd_setattr_hdl(struct tgt_session_info *tsi)
                     OFD_VALID_FLAGS | LA_UID | LA_GID | LA_PROJID);
 
        ofd_counter_incr(tsi->tsi_exp, LPROC_OFD_STATS_SETATTR,
-                        tsi->tsi_jobid, 1);
+                        tsi->tsi_jobid, ktime_us_delta(ktime_get(), kstart));
        EXIT;
 out_put:
        ofd_object_put(tsi->tsi_env, fo);
@@ -1493,10 +1490,11 @@ static int ofd_create_hdl(struct tgt_session_info *tsi)
        u64                      seq = ostid_seq(&oa->o_oi);
        u64                      oid = ostid_id(&oa->o_oi);
        struct ofd_seq          *oseq;
-       s64 diff;
-       int rc = 0;
        int                      sync_trans = 0;
        long                     granted = 0;
+       ktime_t                  kstart = ktime_get();
+       s64                      diff;
+       int                      rc = 0;
 
        ENTRY;
 
@@ -1734,7 +1732,7 @@ static int ofd_create_hdl(struct tgt_session_info *tsi)
        }
        EXIT;
        ofd_counter_incr(exp, LPROC_OFD_STATS_CREATE,
-                        tsi->tsi_jobid, 1);
+                        tsi->tsi_jobid, ktime_us_delta(ktime_get(), kstart));
        if (unlikely(!oseq->os_last_id_synced))
                oseq->os_last_id_synced = 1;
 out:
@@ -1767,6 +1765,7 @@ static int ofd_destroy_hdl(struct tgt_session_info *tsi)
        struct ofd_device       *ofd = ofd_exp(tsi->tsi_exp);
        struct ofd_thread_info  *fti = tsi2ofd_info(tsi);
        struct lu_fid           *fid = &fti->fti_fid;
+       ktime_t                  kstart = ktime_get();
        u64                      oid;
        u32                      count;
        int                      rc = 0;
@@ -1828,7 +1827,7 @@ static int ofd_destroy_hdl(struct tgt_session_info *tsi)
        }
 
        ofd_counter_incr(tsi->tsi_exp, LPROC_OFD_STATS_DESTROY,
-                        tsi->tsi_jobid, 1);
+                        tsi->tsi_jobid, ktime_us_delta(ktime_get(), kstart));
 
        GOTO(out, rc);
 
@@ -1850,6 +1849,7 @@ out:
  */
 static int ofd_statfs_hdl(struct tgt_session_info *tsi)
 {
+       ktime_t                  kstart = ktime_get();
        struct obd_statfs       *osfs;
        int                      rc;
 
@@ -1869,7 +1869,7 @@ static int ofd_statfs_hdl(struct tgt_session_info *tsi)
                rc = -EINPROGRESS;
 
        ofd_counter_incr(tsi->tsi_exp, LPROC_OFD_STATS_STATFS,
-                        tsi->tsi_jobid, 1);
+                        tsi->tsi_jobid, ktime_us_delta(ktime_get(), kstart));
 
        RETURN(rc);
 }
@@ -1892,6 +1892,7 @@ static int ofd_sync_hdl(struct tgt_session_info *tsi)
        struct ofd_thread_info  *fti = tsi2ofd_info(tsi);
        struct ofd_device       *ofd = ofd_exp(tsi->tsi_exp);
        struct ofd_object       *fo = NULL;
+       ktime_t                  kstart = ktime_get();
        int                      rc = 0;
 
        ENTRY;
@@ -1912,7 +1913,7 @@ static int ofd_sync_hdl(struct tgt_session_info *tsi)
                GOTO(put, rc);
 
        ofd_counter_incr(tsi->tsi_exp, LPROC_OFD_STATS_SYNC,
-                        tsi->tsi_jobid, 1);
+                        tsi->tsi_jobid, ktime_us_delta(ktime_get(), kstart));
        if (fo == NULL)
                RETURN(0);
 
@@ -1934,6 +1935,115 @@ put:
 }
 
 /**
+ * OFD request handler for OST_FALLOCATE RPC.
+ *
+ * This is part of request processing. Validate request fields,
+ * preallocate the given OFD object and pack reply.
+ *
+ * \param[in] tsi      target session environment for this request
+ *
+ * \retval             0 if successful
+ * \retval             negative value on error
+ */
+static int ofd_fallocate_hdl(struct tgt_session_info *tsi)
+{
+       struct obdo *oa = &tsi->tsi_ost_body->oa;
+       struct ost_body *repbody;
+       struct ofd_thread_info *info = tsi2ofd_info(tsi);
+       struct ldlm_namespace *ns = tsi->tsi_tgt->lut_obd->obd_namespace;
+       struct ldlm_resource *res;
+       struct ofd_object *fo;
+       __u64 flags = 0;
+       struct lustre_handle lh = { 0, };
+       int rc, mode;
+       __u64 start, end;
+       bool srvlock;
+       ktime_t kstart = ktime_get();
+
+       repbody = req_capsule_server_get(tsi->tsi_pill, &RMF_OST_BODY);
+       if (repbody == NULL)
+               RETURN(err_serious(-ENOMEM));
+
+       /*
+        * fallocate start and end are passed in o_size, o_blocks
+        * on the wire.
+        */
+       start = oa->o_size;
+       end = oa->o_blocks;
+       mode = oa->o_falloc_mode;
+       /*
+        * Only mode == 0 (which is standard prealloc) is supported now.
+        * Punch is not supported yet.
+        */
+       if (mode & ~FALLOC_FL_KEEP_SIZE)
+               RETURN(-EOPNOTSUPP);
+
+       repbody->oa.o_oi = oa->o_oi;
+       repbody->oa.o_valid = OBD_MD_FLID;
+
+       srvlock = oa->o_valid & OBD_MD_FLFLAGS &&
+                 oa->o_flags & OBD_FL_SRVLOCK;
+
+       if (srvlock) {
+               rc = tgt_extent_lock(tsi->tsi_env, ns, &tsi->tsi_resid,
+                                    start, end, &lh, LCK_PW, &flags);
+               if (rc != 0)
+                       RETURN(rc);
+       }
+
+       fo = ofd_object_find_exists(tsi->tsi_env, ofd_exp(tsi->tsi_exp),
+                                   &tsi->tsi_fid);
+       if (IS_ERR(fo))
+               GOTO(out, rc = PTR_ERR(fo));
+
+       la_from_obdo(&info->fti_attr, oa,
+                    OBD_MD_FLMTIME | OBD_MD_FLATIME | OBD_MD_FLCTIME);
+
+       rc = ofd_object_fallocate(tsi->tsi_env, fo, start, end, mode,
+                                &info->fti_attr, oa);
+       if (rc)
+               GOTO(out_put, rc);
+
+       rc = ofd_attr_get(tsi->tsi_env, fo, &info->fti_attr);
+       if (rc == 0)
+               obdo_from_la(&repbody->oa, &info->fti_attr,
+                            OFD_VALID_FLAGS);
+       else
+               rc = 0;
+
+       ofd_counter_incr(tsi->tsi_exp, LPROC_OFD_STATS_PREALLOC,
+                        tsi->tsi_jobid, ktime_us_delta(ktime_get(), kstart));
+
+       EXIT;
+out_put:
+       ofd_object_put(tsi->tsi_env, fo);
+out:
+       if (srvlock)
+               tgt_extent_unlock(&lh, LCK_PW);
+       if (rc == 0) {
+               res = ldlm_resource_get(ns, NULL, &tsi->tsi_resid,
+                                       LDLM_EXTENT, 0);
+               if (!IS_ERR(res)) {
+                       struct ost_lvb *res_lvb;
+
+                       ldlm_res_lvbo_update(res, NULL, 0);
+                       res_lvb = res->lr_lvb_data;
+                       /* Blocks */
+                       repbody->oa.o_valid |= OBD_MD_FLBLOCKS;
+                       repbody->oa.o_blocks = res_lvb->lvb_blocks;
+                       /* Size */
+                       repbody->oa.o_valid |= OBD_MD_FLSIZE;
+                       repbody->oa.o_size = res_lvb->lvb_size;
+
+                       ldlm_resource_putref(res);
+               }
+       }
+
+       RETURN(rc);
+}
+
+
+/**
  * OFD request handler for OST_PUNCH RPC.
  *
  * This is part of request processing. Validate request fields,
@@ -1954,9 +2064,10 @@ static int ofd_punch_hdl(struct tgt_session_info *tsi)
        struct ofd_object       *fo;
        __u64                    flags = 0;
        struct lustre_handle     lh = { 0, };
-       int                      rc;
        __u64                    start, end;
        bool                     srvlock;
+       ktime_t                  kstart = ktime_get();
+       int                      rc;
 
        ENTRY;
 
@@ -2018,7 +2129,7 @@ static int ofd_punch_hdl(struct tgt_session_info *tsi)
                GOTO(out_put, rc);
 
        ofd_counter_incr(tsi->tsi_exp, LPROC_OFD_STATS_PUNCH,
-                        tsi->tsi_jobid, 1);
+                        tsi->tsi_jobid, ktime_us_delta(ktime_get(), kstart));
        EXIT;
 out_put:
        ofd_object_put(tsi->tsi_env, fo);
@@ -2244,6 +2355,7 @@ static int ofd_quotactl(struct tgt_session_info *tsi)
 {
        struct obd_quotactl *oqctl, *repoqc;
        struct lu_nodemap *nodemap;
+       ktime_t kstart = ktime_get();
        int id;
        int rc;
 
@@ -2281,7 +2393,7 @@ static int ofd_quotactl(struct tgt_session_info *tsi)
        rc = lquotactl_slv(tsi->tsi_env, tsi->tsi_tgt->lut_bottom, repoqc);
 
        ofd_counter_incr(tsi->tsi_exp, LPROC_OFD_STATS_QUOTACTL,
-                        tsi->tsi_jobid, 1);
+                        tsi->tsi_jobid, ktime_us_delta(ktime_get(), kstart));
 
        if (repoqc->qc_id != id)
                swap(repoqc->qc_id, id);
@@ -2290,29 +2402,6 @@ static int ofd_quotactl(struct tgt_session_info *tsi)
 }
 
 /**
- * Calculate the amount of time for lock prolongation.
- *
- * This is helper for ofd_prolong_extent_locks() function to get
- * the timeout extra time.
- *
- * \param[in] req      current request
- *
- * \retval             amount of time to extend the timeout with
- */
-static inline time64_t prolong_timeout(struct ptlrpc_request *req)
-{
-       struct ptlrpc_service_part *svcpt = req->rq_rqbd->rqbd_svcpt;
-       time64_t req_timeout;
-
-       if (AT_OFF)
-               return obd_timeout / 2;
-
-       req_timeout = req->rq_deadline - req->rq_arrival_time.tv_sec;
-       return max_t(time64_t, at_est2timeout(at_get(&svcpt->scp_at_estimate)),
-                    req_timeout);
-}
-
-/**
  * Prolong lock timeout for the given extent.
  *
  * This function finds all locks related with incoming request and
@@ -2739,6 +2828,7 @@ TGT_OST_HDL_HP(HAS_BODY | HAS_REPLY | IS_MUTABLE,
 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),
+TGT_OST_HDL(HAS_BODY | HAS_REPLY | IS_MUTABLE, OST_FALLOCATE, ofd_fallocate_hdl)
 };
 
 static struct tgt_opc_slice ofd_common_slice[] = {
@@ -2873,6 +2963,8 @@ static int ofd_init0(const struct lu_env *env, struct ofd_device *m,
        INIT_LIST_HEAD(&m->ofd_inconsistency_list);
        spin_lock_init(&m->ofd_inconsistency_lock);
 
+       m->ofd_access_log_mask = -1; /* Log all accesses if enabled. */
+
        spin_lock_init(&m->ofd_batch_lock);
        init_rwsem(&m->ofd_lastid_rwsem);
 
@@ -2951,6 +3043,7 @@ static int ofd_init0(const struct lu_env *env, struct ofd_device *m,
        if (tgd->tgd_osfs.os_bsize * tgd->tgd_osfs.os_blocks <
            OFD_PRECREATE_SMALL_FS)
                m->ofd_precreate_batch = OFD_PRECREATE_BATCH_SMALL;
+       m->ofd_atime_diff = OFD_DEF_ATIME_DIFF;
 
        rc = ofd_fs_setup(env, m, obd);
        if (rc)
@@ -3042,6 +3135,9 @@ static void ofd_fini(const struct lu_env *env, struct ofd_device *m)
                d->ld_obd->obd_namespace = m->ofd_namespace = NULL;
        }
 
+       ofd_access_log_delete(m->ofd_access_log);
+       m->ofd_access_log = NULL;
+
        ofd_stack_fini(env, m, &m->ofd_dt_dev.dd_lu_dev);
 
        LASSERT(atomic_read(&d->ld_ref) == 0);
@@ -3157,13 +3253,28 @@ static struct lu_device_type ofd_device_type = {
  */
 static int __init ofd_init(void)
 {
-       int                             rc;
+       int rc;
 
        rc = lu_kmem_init(ofd_caches);
        if (rc)
                return rc;
+
+       rc = ofd_access_log_module_init();
+       if (rc)
+               goto out_caches;
+
        rc = class_register_type(&ofd_obd_ops, NULL, true, NULL,
                                 LUSTRE_OST_NAME, &ofd_device_type);
+       if (rc)
+               goto out_ofd_access_log;
+
+       return 0;
+
+out_ofd_access_log:
+       ofd_access_log_module_exit();
+out_caches:
+       lu_kmem_fini(ofd_caches);
+
        return rc;
 }
 
@@ -3175,8 +3286,9 @@ static int __init ofd_init(void)
  */
 static void __exit ofd_exit(void)
 {
-       lu_kmem_fini(ofd_caches);
        class_unregister_type(LUSTRE_OST_NAME);
+       ofd_access_log_module_exit();
+       lu_kmem_fini(ofd_caches);
 }
 
 MODULE_AUTHOR("OpenSFS, Inc. <http://www.lustre.org/>");