Whamcloud - gitweb
LU-7024 tests: Skip squash_id if server version is older than 2.5.53
[fs/lustre-release.git] / lustre / mdt / mdt_coordinator.c
index 970d933..daf8d95 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
@@ -184,8 +187,8 @@ static int mdt_coordinator_cb(const struct lu_env *env,
                    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 */
+               /* first search whether the request is found in the list we
+                * have built and if there is room in the request vector */
                empty_slot = -1;
                found = -1;
                for (i = 0; i < hsd->max_requests &&
@@ -311,7 +314,7 @@ static int mdt_coordinator_cb(const struct lu_env *env,
                        struct hsm_progress_kernel pgs;
 
                        dump_llog_agent_req_rec("mdt_coordinator_cb(): "
-                                               "request timeouted, start "
+                                               "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
@@ -329,13 +332,22 @@ static int mdt_coordinator_cb(const struct lu_env *env,
                         */
                        rc = mdt_hsm_update_request_state(hsd->mti, &pgs, 0);
                        if (rc)
-                               CERROR("%s: Cannot cleanup timeouted request: "
+                               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);
+                       }
+
                        /* add the cookie to the list of record to be
                         * canceled by caller */
                        if (hsd->max_cookie == (hsd->cookie_cnt - 1)) {
@@ -391,7 +403,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)) {
@@ -423,7 +435,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;
 }
@@ -439,7 +451,7 @@ 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;
        ENTRY;
 
@@ -533,7 +545,7 @@ static int mdt_coordinator(void *data)
                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 */
+               /* first we cancel llog records of the timed out requests */
                if (hsd.cookie_cnt > 0) {
                        rc = mdt_agent_record_update(mti->mti_env, mdt,
                                                     hsd.cookies,
@@ -903,6 +915,13 @@ int mdt_hsm_cdt_init(struct mdt_device *mdt)
        cdt->cdt_policy = CDT_DEFAULT_POLICY;
        cdt->cdt_active_req_timeout = 3600;
 
+       /* Initialize cdt_compound_id here to allow its usage for
+        * delayed requests from RAoLU policy */
+       atomic_set(&cdt->cdt_compound_id, cfs_time_current_sec());
+
+       /* by default do not remove archives on last unlink */
+       cdt->cdt_remove_archive_on_last_unlink = false;
+
        RETURN(0);
 }
 
@@ -954,7 +973,6 @@ int mdt_hsm_cdt_start(struct mdt_device *mdt)
 
        cdt->cdt_state = CDT_INIT;
 
-       atomic_set(&cdt->cdt_compound_id, cfs_time_current_sec());
        /* just need to be larger than previous one */
        /* cdt_last_cookie is protected by cdt_llog_lock */
        cdt->cdt_last_cookie = cfs_time_current_sec();
@@ -1260,7 +1278,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;
@@ -1390,7 +1408,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);
@@ -1701,7 +1719,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
@@ -2194,6 +2212,36 @@ mdt_hsm_other_request_mask_seq_write(struct file *file, const char __user *buf,
                                           &cdt->cdt_other_request_mask);
 }
 
+static int mdt_hsm_cdt_raolu_seq_show(struct seq_file *m, void *data)
+{
+       struct mdt_device       *mdt = m->private;
+       struct coordinator      *cdt = &mdt->mdt_coordinator;
+       ENTRY;
+
+       seq_printf(m, "%d\n", (int)cdt->cdt_remove_archive_on_last_unlink);
+       RETURN(0);
+}
+
+static ssize_t
+mdt_hsm_cdt_raolu_seq_write(struct file *file, const char __user *buffer,
+                         size_t count, loff_t *off)
+
+{
+       struct seq_file         *m = file->private_data;
+       struct mdt_device       *mdt = m->private;
+       struct coordinator      *cdt = &mdt->mdt_coordinator;
+       int                      val;
+       int                      rc;
+       ENTRY;
+
+       rc = lprocfs_write_helper(buffer, count, &val);
+       if (rc < 0)
+               RETURN(rc);
+
+       cdt->cdt_remove_archive_on_last_unlink = val;
+       RETURN(count);
+}
+
 LPROC_SEQ_FOPS(mdt_hsm_cdt_loop_period);
 LPROC_SEQ_FOPS(mdt_hsm_cdt_grace_delay);
 LPROC_SEQ_FOPS(mdt_hsm_cdt_active_req_timeout);
@@ -2202,8 +2250,9 @@ LPROC_SEQ_FOPS(mdt_hsm_cdt_default_archive_id);
 LPROC_SEQ_FOPS(mdt_hsm_user_request_mask);
 LPROC_SEQ_FOPS(mdt_hsm_group_request_mask);
 LPROC_SEQ_FOPS(mdt_hsm_other_request_mask);
+LPROC_SEQ_FOPS(mdt_hsm_cdt_raolu);
 
-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",
@@ -2229,5 +2278,7 @@ static struct lprocfs_seq_vars lprocfs_mdt_hsm_vars[] = {
          .fops =       &mdt_hsm_group_request_mask_fops,       },
        { .name =       "other_request_mask",
          .fops =       &mdt_hsm_other_request_mask_fops,       },
+       { .name =       "remove_archive_on_last_unlink",
+         .fops =       &mdt_hsm_cdt_raolu_fops,                },
        { 0 }
 };