Whamcloud - gitweb
LU-6401 headers: Move functions out of lustre_idl.h
[fs/lustre-release.git] / lustre / mdt / mdt_coordinator.c
index ac5518f..5f5c20a 100644 (file)
  * GPL HEADER END
  */
 /*
- * Copyright (c) 2012, 2013, Intel Corporation.
- * Use is subject to license terms.
  * Copyright (c) 2011, 2012 Commissariat a l'energie atomique et aux energies
  *                          alternatives
+ *
+ * Copyright (c) 2013, 2014, Intel Corporation.
+ * Use is subject to license terms.
  */
 /*
  * lustre/mdt/mdt_coordinator.c
 
 #define DEBUG_SUBSYSTEM S_MDS
 
+#include <linux/kthread.h>
 #include <obd_support.h>
 #include <lustre_net.h>
 #include <lustre_export.h>
 #include <obd.h>
 #include <lprocfs_status.h>
 #include <lustre_log.h>
+#include <lustre_kernelcomm.h>
 #include "mdt_internal.h"
 
-static struct lprocfs_seq_vars lprocfs_mdt_hsm_vars[];
+static struct lprocfs_vars lprocfs_mdt_hsm_vars[];
 
 /**
  * get obj and HSM attributes on a fid
@@ -127,22 +130,19 @@ void mdt_hsm_dump_hal(int level, const char *prefix,
  * data passed to llog_cat_process() callback
  * to scan requests and take actions
  */
+struct hsm_scan_request {
+       int                      hal_sz;
+       int                      hal_used_sz;
+       struct hsm_action_list  *hal;
+};
+
 struct hsm_scan_data {
        struct mdt_thread_info          *mti;
        char                             fs_name[MTI_NAME_MAXLEN+1];
        /* request to be send to agents */
-       int                              request_sz;    /** allocated size */
        int                              max_requests;  /** vector size */
        int                              request_cnt;   /** used count */
-       struct {
-               int                      hal_sz;
-               int                      hal_used_sz;
-               struct hsm_action_list  *hal;
-       } *request;
-       /* records to be canceled */
-       int                              max_cookie;    /** vector size */
-       int                              cookie_cnt;    /** used count */
-       __u64                           *cookies;
+       struct hsm_scan_request         *request;
 };
 
 /**
@@ -161,7 +161,7 @@ static int mdt_coordinator_cb(const struct lu_env *env,
                              struct llog_rec_hdr *hdr,
                              void *data)
 {
-       const struct llog_agent_req_rec *larr;
+       struct llog_agent_req_rec       *larr;
        struct hsm_scan_data            *hsd;
        struct hsm_action_item          *hai;
        struct mdt_device               *mdt;
@@ -177,52 +177,50 @@ static int mdt_coordinator_cb(const struct lu_env *env,
        dump_llog_agent_req_rec("mdt_coordinator_cb(): ", larr);
        switch (larr->arr_status) {
        case ARS_WAITING: {
-               int i, empty_slot, found;
+               int i;
+               struct hsm_scan_request *request;
 
                /* Are agents full? */
-               if (atomic_read(&cdt->cdt_request_count) ==
+               if (atomic_read(&cdt->cdt_request_count) >=
                    cdt->cdt_max_requests)
                        break;
 
-               /* first search if the request if known in the list we have
-                * build and if there is room in the request vector */
-               empty_slot = -1;
-               found = -1;
-               for (i = 0; i < hsd->max_requests &&
-                           (empty_slot == -1 || found == -1); i++) {
-                       if (hsd->request[i].hal == NULL) {
-                               empty_slot = i;
-                               continue;
-                       }
+               /* first search whether the request is found in the
+                * list we have built. */
+               request = NULL;
+               for (i = 0; i < hsd->request_cnt; i++) {
                        if (hsd->request[i].hal->hal_compound_id ==
-                               larr->arr_compound_id) {
-                               found = i;
-                               continue;
+                           larr->arr_compound_id) {
+                               request = &hsd->request[i];
+                               break;
                        }
                }
-               if (found == -1 && empty_slot == -1)
-                       /* unknown request and no more room for new request,
-                        * continue scan for to find other entries for
-                        * already found request
-                        */
-                       RETURN(0);
 
-               if (found == -1) {
+               if (!request) {
                        struct hsm_action_list *hal;
 
-                       /* request is not already known */
+                       if (hsd->request_cnt == hsd->max_requests)
+                               /* Unknown request and no more room
+                                * for a new request. Continue to scan
+                                * to find other entries for already
+                                * existing requests.
+                                */
+                               RETURN(0);
+
+                       request = &hsd->request[hsd->request_cnt];
+
                        /* allocates hai vector size just needs to be large
                         * enough */
-                       hsd->request[empty_slot].hal_sz =
-                                    sizeof(*hsd->request[empty_slot].hal) +
-                                    cfs_size_round(MTI_NAME_MAXLEN+1) +
-                                    2 * cfs_size_round(larr->arr_hai.hai_len);
-                       OBD_ALLOC(hal, hsd->request[empty_slot].hal_sz);
+                       request->hal_sz =
+                               sizeof(*request->hal) +
+                               cfs_size_round(MTI_NAME_MAXLEN+1) +
+                               2 * cfs_size_round(larr->arr_hai.hai_len);
+                       OBD_ALLOC(hal, request->hal_sz);
                        if (!hal) {
                                CERROR("%s: Cannot allocate memory (%d o)"
                                       "for compound "LPX64"\n",
                                       mdt_obd_name(mdt),
-                                      hsd->request[i].hal_sz,
+                                      request->hal_sz,
                                       larr->arr_compound_id);
                                RETURN(-ENOMEM);
                        }
@@ -233,10 +231,9 @@ static int mdt_coordinator_cb(const struct lu_env *env,
                        hal->hal_archive_id = larr->arr_archive_id;
                        hal->hal_flags = larr->arr_flags;
                        hal->hal_count = 0;
-                       hsd->request[empty_slot].hal_used_sz = hal_size(hal);
-                       hsd->request[empty_slot].hal = hal;
+                       request->hal_used_sz = hal_size(hal);
+                       request->hal = hal;
                        hsd->request_cnt++;
-                       found = empty_slot;
                        hai = hai_first(hal);
                } else {
                        /* request is known */
@@ -248,17 +245,17 @@ static int mdt_coordinator_cb(const struct lu_env *env,
                         * where the files are not archived in the same backend
                         */
                        if (larr->arr_archive_id !=
-                           hsd->request[found].hal->hal_archive_id)
+                           request->hal->hal_archive_id)
                                RETURN(0);
 
-                       if (hsd->request[found].hal_sz <
-                           hsd->request[found].hal_used_sz +
-                            cfs_size_round(larr->arr_hai.hai_len)) {
+                       if (request->hal_sz <
+                           request->hal_used_sz +
+                           cfs_size_round(larr->arr_hai.hai_len)) {
                                /* Not enough room, need an extension */
                                void *hal_buffer;
                                int sz;
 
-                               sz = 2 * hsd->request[found].hal_sz;
+                               sz = 2 * request->hal_sz;
                                OBD_ALLOC(hal_buffer, sz);
                                if (!hal_buffer) {
                                        CERROR("%s: Cannot allocate memory "
@@ -267,29 +264,29 @@ static int mdt_coordinator_cb(const struct lu_env *env,
                                               larr->arr_compound_id);
                                        RETURN(-ENOMEM);
                                }
-                               memcpy(hal_buffer, hsd->request[found].hal,
-                                      hsd->request[found].hal_used_sz);
-                               OBD_FREE(hsd->request[found].hal,
-                                        hsd->request[found].hal_sz);
-                               hsd->request[found].hal = hal_buffer;
-                               hsd->request[found].hal_sz = sz;
+                               memcpy(hal_buffer, request->hal,
+                                      request->hal_used_sz);
+                               OBD_FREE(request->hal,
+                                        request->hal_sz);
+                               request->hal = hal_buffer;
+                               request->hal_sz = sz;
                        }
-                       hai = hai_first(hsd->request[found].hal);
-                       for (i = 0; i < hsd->request[found].hal->hal_count;
-                            i++)
+                       hai = hai_first(request->hal);
+                       for (i = 0; i < request->hal->hal_count; i++)
                                hai = hai_next(hai);
                }
                memcpy(hai, &larr->arr_hai, larr->arr_hai.hai_len);
                hai->hai_cookie = larr->arr_hai.hai_cookie;
                hai->hai_gid = larr->arr_hai.hai_gid;
 
-               hsd->request[found].hal_used_sz +=
-                                                  cfs_size_round(hai->hai_len);
-               hsd->request[found].hal->hal_count++;
+               request->hal_used_sz += cfs_size_round(hai->hai_len);
+               request->hal->hal_count++;
                break;
        }
        case ARS_STARTED: {
+               struct hsm_progress_kernel pgs;
                struct cdt_agent_req *car;
+               cfs_time_t now = cfs_time_current_sec();
                cfs_time_t last;
 
                /* we search for a running request
@@ -306,74 +303,52 @@ static int mdt_coordinator_cb(const struct lu_env *env,
 
                /* test if request too long, if yes cancel it
                 * the same way the copy tool acknowledge a cancel request */
-               if ((last + cdt->cdt_active_req_timeout)
-                    < cfs_time_current_sec()) {
-                       struct hsm_progress_kernel pgs;
-
-                       dump_llog_agent_req_rec("mdt_coordinator_cb(): "
-                                               "request timeouted, start "
-                                               "cleaning", larr);
-                       /* a too old cancel request just needs to be removed
-                        * this can happen, if copy tool does not support cancel
-                        * for other requests, we have to remove the running
-                        * request and notify the copytool
-                        */
-                       pgs.hpk_fid = larr->arr_hai.hai_fid;
-                       pgs.hpk_cookie = larr->arr_hai.hai_cookie;
-                       pgs.hpk_extent = larr->arr_hai.hai_extent;
-                       pgs.hpk_flags = HP_FLAG_COMPLETED;
-                       pgs.hpk_errval = ENOSYS;
-                       pgs.hpk_data_version = 0;
-                       /* update request state, but do not record in llog, to
-                        * avoid deadlock on cdt_llog_lock
-                        */
-                       rc = mdt_hsm_update_request_state(hsd->mti, &pgs, 0);
-                       if (rc)
-                               CERROR("%s: Cannot cleanup timeouted request: "
-                                      DFID" for cookie "LPX64" action=%s\n",
-                                      mdt_obd_name(mdt),
-                                      PFID(&pgs.hpk_fid), pgs.hpk_cookie,
-                                      hsm_copytool_action2name(
-                                                    larr->arr_hai.hai_action));
-
-                       if (rc == -ENOENT) {
-                               /* The request no longer exists, forget
-                                * about it, and do not send a cancel request
-                                * to the client, for which an error will be
-                                * sent back, leading to an endless cycle of
-                                * cancellation. */
-                               RETURN(LLOG_DEL_RECORD);
-                       }
-
-                       /* add the cookie to the list of record to be
-                        * canceled by caller */
-                       if (hsd->max_cookie == (hsd->cookie_cnt - 1)) {
-                               __u64 *ptr, *old_ptr;
-                               int old_sz, new_sz, new_cnt;
+               if (now <= last + cdt->cdt_active_req_timeout)
+                       RETURN(0);
 
-                               /* need to increase vector size */
-                               old_sz = sizeof(__u64) * hsd->max_cookie;
-                               old_ptr = hsd->cookies;
+               dump_llog_agent_req_rec("request timed out, start cleaning",
+                                       larr);
+               /* a too old cancel request just needs to be removed
+                * this can happen, if copy tool does not support
+                * cancel for other requests, we have to remove the
+                * running request and notify the copytool */
+               pgs.hpk_fid = larr->arr_hai.hai_fid;
+               pgs.hpk_cookie = larr->arr_hai.hai_cookie;
+               pgs.hpk_extent = larr->arr_hai.hai_extent;
+               pgs.hpk_flags = HP_FLAG_COMPLETED;
+               pgs.hpk_errval = ENOSYS;
+               pgs.hpk_data_version = 0;
+
+               /* update request state, but do not record in llog, to
+                * avoid deadlock on cdt_llog_lock */
+               rc = mdt_hsm_update_request_state(hsd->mti, &pgs, 0);
+               if (rc)
+                       CERROR("%s: cannot cleanup timed out request: "
+                              DFID" for cookie "LPX64" action=%s\n",
+                              mdt_obd_name(mdt),
+                              PFID(&pgs.hpk_fid), pgs.hpk_cookie,
+                              hsm_copytool_action2name(
+                                      larr->arr_hai.hai_action));
+
+               if (rc == -ENOENT) {
+                       /* The request no longer exists, forget
+                        * about it, and do not send a cancel request
+                        * to the client, for which an error will be
+                        * sent back, leading to an endless cycle of
+                        * cancellation. */
+                       RETURN(LLOG_DEL_RECORD);
+               }
 
-                               new_cnt = 2 * hsd->max_cookie;
-                               new_sz = sizeof(__u64) * new_cnt;
+               /* XXX A cancel request cannot be cancelled. */
+               if (larr->arr_hai.hai_action == HSMA_CANCEL)
+                       RETURN(0);
 
-                               OBD_ALLOC(ptr, new_sz);
-                               if (!ptr) {
-                                       CERROR("%s: Cannot allocate memory "
-                                              "(%d o) for cookie vector\n",
-                                              mdt_obd_name(mdt), new_sz);
-                                       RETURN(-ENOMEM);
-                               }
-                               memcpy(ptr, hsd->cookies, old_sz);
-                               hsd->cookies = ptr;
-                               hsd->max_cookie = new_cnt;
-                               OBD_FREE(old_ptr, old_sz);
-                       }
-                       hsd->cookies[hsd->cookie_cnt] =
-                                                      larr->arr_hai.hai_cookie;
-                       hsd->cookie_cnt++;
-               }
+               larr->arr_status = ARS_CANCELED;
+               larr->arr_req_change = now;
+               rc = llog_write(hsd->mti->mti_env, llh, hdr, hdr->lrh_index);
+               if (rc < 0)
+                       CERROR("%s: cannot update agent log: rc = %d\n",
+                              mdt_obd_name(mdt), rc);
                break;
        }
        case ARS_FAILED:
@@ -400,7 +375,7 @@ int hsm_cdt_procfs_init(struct mdt_device *mdt)
        ENTRY;
 
        /* init /proc entries, failure is not critical */
-       cdt->cdt_proc_dir = lprocfs_seq_register("hsm",
+       cdt->cdt_proc_dir = lprocfs_register("hsm",
                                             mdt2obd_dev(mdt)->obd_proc_entry,
                                             lprocfs_mdt_hsm_vars, mdt);
        if (IS_ERR(cdt->cdt_proc_dir)) {
@@ -432,7 +407,7 @@ void  hsm_cdt_procfs_fini(struct mdt_device *mdt)
  * \param none
  * \retval var vector
  */
-struct lprocfs_seq_vars *hsm_cdt_get_proc_vars(void)
+struct lprocfs_vars *hsm_cdt_get_proc_vars(void)
 {
        return lprocfs_mdt_hsm_vars;
 }
@@ -448,8 +423,9 @@ static int mdt_coordinator(void *data)
        struct mdt_thread_info  *mti = data;
        struct mdt_device       *mdt = mti->mti_mdt;
        struct coordinator      *cdt = &mdt->mdt_coordinator;
-       struct hsm_scan_data     hsd = { 0 };
+       struct hsm_scan_data     hsd = { NULL };
        int                      rc = 0;
+       int                      request_sz;
        ENTRY;
 
        cdt->cdt_thread.t_flags = SVC_RUNNING;
@@ -458,17 +434,13 @@ static int mdt_coordinator(void *data)
        CDEBUG(D_HSM, "%s: coordinator thread starting, pid=%d\n",
               mdt_obd_name(mdt), current_pid());
 
-       /* timeouted cookie vector initialization */
-       hsd.max_cookie = 0;
-       hsd.cookie_cnt = 0;
-       hsd.cookies = NULL;
        /* we use a copy of cdt_max_requests in the cb, so if cdt_max_requests
         * increases due to a change from /proc we do not overflow the
         * hsd.request[] vector
         */
        hsd.max_requests = cdt->cdt_max_requests;
-       hsd.request_sz = hsd.max_requests * sizeof(*hsd.request);
-       OBD_ALLOC(hsd.request, hsd.request_sz);
+       request_sz = hsd.max_requests * sizeof(*hsd.request);
+       OBD_ALLOC(hsd.request, request_sz);
        if (!hsd.request)
                GOTO(out, rc = -ENOMEM);
 
@@ -511,27 +483,16 @@ static int mdt_coordinator(void *data)
                        /* cdt_max_requests has changed,
                         * we need to allocate a new buffer
                         */
-                       OBD_FREE(hsd.request, hsd.request_sz);
+                       OBD_FREE(hsd.request, request_sz);
                        hsd.max_requests = cdt->cdt_max_requests;
-                       hsd.request_sz =
-                                  hsd.max_requests * sizeof(*hsd.request);
-                       OBD_ALLOC(hsd.request, hsd.request_sz);
+                       request_sz = hsd.max_requests * sizeof(*hsd.request);
+                       OBD_ALLOC(hsd.request, request_sz);
                        if (!hsd.request) {
                                rc = -ENOMEM;
                                break;
                        }
                }
 
-               /* create canceled cookie vector for an arbitrary size
-                * if needed, vector will grow during llog scan
-                */
-               hsd.max_cookie = 10;
-               hsd.cookie_cnt = 0;
-               OBD_ALLOC(hsd.cookies, hsd.max_cookie * sizeof(__u64));
-               if (!hsd.cookies) {
-                       rc = -ENOMEM;
-                       goto clean_cb_alloc;
-               }
                hsd.request_cnt = 0;
 
                rc = cdt_llog_process(mti->mti_env, mdt,
@@ -539,23 +500,7 @@ static int mdt_coordinator(void *data)
                if (rc < 0)
                        goto clean_cb_alloc;
 
-               CDEBUG(D_HSM, "Found %d requests to send and %d"
-                             " requests to cancel\n",
-                      hsd.request_cnt, hsd.cookie_cnt);
-               /* first we cancel llog records of the timeouted requests */
-               if (hsd.cookie_cnt > 0) {
-                       rc = mdt_agent_record_update(mti->mti_env, mdt,
-                                                    hsd.cookies,
-                                                    hsd.cookie_cnt,
-                                                    ARS_CANCELED);
-                       if (rc)
-                               CERROR("%s: mdt_agent_record_update() failed, "
-                                      "rc=%d, cannot update status to %s "
-                                      "for %d cookies\n",
-                                      mdt_obd_name(mdt), rc,
-                                      agent_req_status2name(ARS_CANCELED),
-                                      hsd.cookie_cnt);
-               }
+               CDEBUG(D_HSM, "found %d requests to send\n", hsd.request_cnt);
 
                if (list_empty(&cdt->cdt_agents)) {
                        CDEBUG(D_HSM, "no agent available, "
@@ -564,38 +509,19 @@ static int mdt_coordinator(void *data)
                }
 
                /* here hsd contains a list of requests to be started */
-               for (i = 0; i < hsd.max_requests; i++) {
-                       struct hsm_action_list  *hal;
+               for (i = 0; i < hsd.request_cnt; i++) {
+                       struct hsm_scan_request *request = &hsd.request[i];
+                       struct hsm_action_list  *hal = request->hal;
                        struct hsm_action_item  *hai;
                        __u64                   *cookies;
                        int                      sz, j;
                        enum agent_req_status    status;
 
                        /* still room for work ? */
-                       if (atomic_read(&cdt->cdt_request_count) ==
+                       if (atomic_read(&cdt->cdt_request_count) >=
                            cdt->cdt_max_requests)
                                break;
 
-                       if (hsd.request[i].hal == NULL)
-                               continue;
-
-                       /* found a request, we start it */
-                       /* kuc payload allocation so we avoid an additionnal
-                        * allocation in mdt_hsm_agent_send()
-                        */
-                       hal = kuc_alloc(hsd.request[i].hal_used_sz,
-                                       KUC_TRANSPORT_HSM, HMT_ACTION_LIST);
-                       if (IS_ERR(hal)) {
-                               CERROR("%s: Cannot allocate memory (%d o) "
-                                      "for compound "LPX64"\n",
-                                      mdt_obd_name(mdt),
-                                      hsd.request[i].hal_used_sz,
-                                      hsd.request[i].hal->hal_compound_id);
-                               continue;
-                       }
-                       memcpy(hal, hsd.request[i].hal,
-                              hsd.request[i].hal_used_sz);
-
                        rc = mdt_hsm_agent_send(mti, hal, 0);
                        /* if failure, we suppose it is temporary
                         * if the copy tool failed to do the request
@@ -606,67 +532,45 @@ static int mdt_coordinator(void *data)
                        /* set up cookie vector to set records status
                         * after copy tools start or failed
                         */
-                       sz = hsd.request[i].hal->hal_count * sizeof(__u64);
+                       sz = hal->hal_count * sizeof(__u64);
                        OBD_ALLOC(cookies, sz);
                        if (cookies == NULL) {
                                CERROR("%s: Cannot allocate memory (%d o) "
                                       "for cookies vector "LPX64"\n",
                                       mdt_obd_name(mdt), sz,
-                                      hsd.request[i].hal->hal_compound_id);
-                               kuc_free(hal, hsd.request[i].hal_used_sz);
+                                      hal->hal_compound_id);
                                continue;
                        }
                        hai = hai_first(hal);
-                       for (j = 0; j < hsd.request[i].hal->hal_count; j++) {
+                       for (j = 0; j < hal->hal_count; j++) {
                                cookies[j] = hai->hai_cookie;
                                hai = hai_next(hai);
                        }
 
                        rc = mdt_agent_record_update(mti->mti_env, mdt, cookies,
-                                               hsd.request[i].hal->hal_count,
-                                               status);
+                                                    hal->hal_count, status);
                        if (rc)
                                CERROR("%s: mdt_agent_record_update() failed, "
                                       "rc=%d, cannot update status to %s "
                                       "for %d cookies\n",
                                       mdt_obd_name(mdt), rc,
                                       agent_req_status2name(status),
-                                      hsd.request[i].hal->hal_count);
+                                      hal->hal_count);
 
                        OBD_FREE(cookies, sz);
-                       kuc_free(hal, hsd.request[i].hal_used_sz);
                }
 clean_cb_alloc:
-               /* free cookie vector allocated for/by callback */
-               if (hsd.cookies) {
-                       OBD_FREE(hsd.cookies, hsd.max_cookie * sizeof(__u64));
-                       hsd.max_cookie = 0;
-                       hsd.cookie_cnt = 0;
-                       hsd.cookies = NULL;
-               }
-
                /* free hal allocated by callback */
-               for (i = 0; i < hsd.max_requests; i++) {
-                       if (hsd.request[i].hal) {
-                               OBD_FREE(hsd.request[i].hal,
-                                        hsd.request[i].hal_sz);
-                               hsd.request[i].hal_sz = 0;
-                               hsd.request[i].hal = NULL;
-                               hsd.request_cnt--;
-                       }
-               }
-               LASSERT(hsd.request_cnt == 0);
+               for (i = 0; i < hsd.request_cnt; i++) {
+                       struct hsm_scan_request *request = &hsd.request[i];
 
-               /* reset callback data */
-               memset(hsd.request, 0, hsd.request_sz);
+                       OBD_FREE(request->hal, request->hal_sz);
+               }
        }
        EXIT;
 out:
        if (hsd.request)
-               OBD_FREE(hsd.request, hsd.request_sz);
-
-       if (hsd.cookies)
-               OBD_FREE(hsd.cookies, hsd.max_cookie * sizeof(__u64));
+               OBD_FREE(hsd.request, request_sz);
 
        if (cdt->cdt_state == CDT_STOPPING) {
                /* request comes from /proc path, so we need to clean cdt
@@ -701,7 +605,7 @@ out:
  * \retval cdt_restore_handle found
  * \retval NULL not found
  */
-static struct cdt_restore_handle *hsm_restore_hdl_find(struct coordinator *cdt,
+struct cdt_restore_handle *mdt_hsm_restore_hdl_find(struct coordinator *cdt,
                                                       const struct lu_fid *fid)
 {
        struct cdt_restore_handle       *crh;
@@ -762,6 +666,17 @@ static int hsm_restore_cb(const struct lu_env *env,
 
        /* restore request not in a final state */
 
+       /* force replay of restore requests left in started state from previous
+        * CDT context, to be canceled later if finally found to be incompatible
+        * when being re-started */
+       if (larr->arr_status == ARS_STARTED) {
+               larr->arr_status = ARS_WAITING;
+               larr->arr_req_change = cfs_time_current_sec();
+               rc = llog_write(env, llh, hdr, hdr->lrh_index);
+               if (rc != 0)
+                       GOTO(out, rc);
+       }
+
        OBD_SLAB_ALLOC_PTR(crh, mdt_hsm_cdt_kmem);
        if (crh == NULL)
                RETURN(-ENOMEM);
@@ -1269,7 +1184,7 @@ static int hsm_cdt_request_completed(struct mdt_thread_info *mti,
                         * ENOSYS only if does not support cancel
                         */
                        /* this can also happen when cdt calls it to
-                        * for a timeouted request */
+                        * for a timed out request */
                        *status = ARS_FAILED;
                        /* to have a cancel event in changelog */
                        pgs->hpk_errval = ECANCELED;
@@ -1399,7 +1314,7 @@ unlock:
                struct cdt_restore_handle       *crh;
 
                /* restore in data FID done, we swap the layouts
-                * only if restore is successfull */
+                * only if restore is successful */
                if (pgs->hpk_errval == 0) {
                        rc = hsm_swap_layouts(mti, &car->car_hai->hai_fid,
                                              &car->car_hai->hai_dfid, &mh);
@@ -1415,7 +1330,7 @@ unlock:
 
                /* give back layout lock */
                mutex_lock(&cdt->cdt_restore_lock);
-               crh = hsm_restore_hdl_find(cdt, &car->car_hai->hai_fid);
+               crh = mdt_hsm_restore_hdl_find(cdt, &car->car_hai->hai_fid);
                if (crh != NULL)
                        list_del(&crh->crh_list);
                mutex_unlock(&cdt->cdt_restore_lock);
@@ -1470,8 +1385,7 @@ int mdt_hsm_update_request_state(struct mdt_thread_info *mti,
                       " on fid="DFID"\n",
                       mdt_obd_name(mdt),
                       pgs->hpk_cookie, PFID(&pgs->hpk_fid));
-               if (car == NULL)
-                       RETURN(-ENOENT);
+
                RETURN(PTR_ERR(car));
        }
 
@@ -1602,10 +1516,9 @@ static int mdt_cancel_all_cb(const struct lu_env *env,
            larr->arr_status == ARS_STARTED) {
                larr->arr_status = ARS_CANCELED;
                larr->arr_req_change = cfs_time_current_sec();
-               rc = mdt_agent_llog_update_rec(env, hcad->mdt, llh, larr);
-               if (rc == 0)
-                       RETURN(LLOG_DEL_RECORD);
+               rc = llog_write(env, llh, hdr, hdr->lrh_index);
        }
+
        RETURN(rc);
 }
 
@@ -1710,7 +1623,7 @@ out:
 }
 
 /**
- * check if a request is comptaible with file status
+ * check if a request is compatible with file status
  * \param hai [IN] request description
  * \param hal_an [IN] request archive number (not used)
  * \param rq_flags [IN] request flags
@@ -1937,14 +1850,14 @@ mdt_hsm_##VAR##_seq_write(struct file *file, const char __user *buffer, \
        struct seq_file         *m = file->private_data;                \
        struct mdt_device       *mdt = m->private;                      \
        struct coordinator      *cdt = &mdt->mdt_coordinator;           \
-       int                      val;                                   \
+       __s64                    val;                                   \
        int                      rc;                                    \
        ENTRY;                                                          \
                                                                        \
-       rc = lprocfs_write_helper(buffer, count, &val);                 \
+       rc = lprocfs_str_to_s64(buffer, count, &val);                   \
        if (rc)                                                         \
                RETURN(rc);                                             \
-       if (val > 0) {                                                  \
+       if (val > 0 && val < INT_MAX) {                                 \
                cdt->VAR = val;                                         \
                RETURN(count);                                          \
        }                                                               \
@@ -2064,17 +1977,20 @@ int mdt_hsm_cdt_control_seq_show(struct seq_file *m, void *data)
 static int
 mdt_hsm_request_mask_show(struct seq_file *m, __u64 mask)
 {
-       int i, rc = 0;
+       bool first = true;
+       int i;
        ENTRY;
 
        for (i = 0; i < 8 * sizeof(mask); i++) {
-               if (mask & (1UL << i))
-                       rc += seq_printf(m, "%s%s", rc == 0 ? "" : " ",
-                                       hsm_copytool_action2name(i));
+               if (mask & (1UL << i)) {
+                       seq_printf(m, "%s%s", first ? "" : " ",
+                                  hsm_copytool_action2name(i));
+                       first = false;
+               }
        }
-       rc += seq_printf(m, "\n");
+       seq_putc(m, '\n');
 
-       RETURN(rc);
+       RETURN(0);
 }
 
 static int
@@ -2212,7 +2128,7 @@ LPROC_SEQ_FOPS(mdt_hsm_user_request_mask);
 LPROC_SEQ_FOPS(mdt_hsm_group_request_mask);
 LPROC_SEQ_FOPS(mdt_hsm_other_request_mask);
 
-static struct lprocfs_seq_vars lprocfs_mdt_hsm_vars[] = {
+static struct lprocfs_vars lprocfs_mdt_hsm_vars[] = {
        { .name =       "agents",
          .fops =       &mdt_hsm_agent_fops                     },
        { .name =       "actions",