char fs_name[MTI_NAME_MAXLEN+1];
/* request to be send to agents */
int request_sz; /** allocated size */
- int max_request; /** vector size */
+ int max_requests; /** vector size */
int request_cnt; /** used count */
struct {
int hal_sz;
/* Are agents full? */
if (atomic_read(&cdt->cdt_request_count) ==
- cdt->cdt_max_request)
+ 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_request &&
+ for (i = 0; i < hsd->max_requests &&
(empty_slot == -1 || found == -1); i++) {
if (hsd->request[i].hal == NULL) {
empty_slot = i;
/* test if request too long, if yes cancel it
* the same way the copy tool acknowledge a cancel request */
- if ((last + cdt->cdt_timeout) < cfs_time_current_sec()) {
+ if ((last + cdt->cdt_active_req_timeout)
+ < cfs_time_current_sec()) {
struct hsm_progress_kernel pgs;
dump_llog_agent_req_rec("mdt_coordinator_cb(): "
case ARS_FAILED:
case ARS_CANCELED:
case ARS_SUCCEED:
- if ((larr->arr_req_change + cdt->cdt_delay) <
+ if ((larr->arr_req_change + cdt->cdt_grace_delay) <
cfs_time_current_sec())
RETURN(LLOG_DEL_RECORD);
break;
hsd.max_cookie = 0;
hsd.cookie_cnt = 0;
hsd.cookies = NULL;
- /* we use a copy of cdt_max_request in the cb, so if cdt_max_request
+ /* 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_request = cdt->cdt_max_request;
- hsd.request_sz = hsd.max_request * sizeof(*hsd.request);
+ hsd.max_requests = cdt->cdt_max_requests;
+ hsd.request_sz = hsd.max_requests * sizeof(*hsd.request);
OBD_ALLOC(hsd.request, hsd.request_sz);
if (!hsd.request)
GOTO(out, rc = -ENOMEM);
CDEBUG(D_HSM, "coordinator starts reading llog\n");
- if (hsd.max_request != cdt->cdt_max_request) {
- /* cdt_max_request has changed,
+ if (hsd.max_requests != cdt->cdt_max_requests) {
+ /* cdt_max_requests has changed,
* we need to allocate a new buffer
*/
OBD_FREE(hsd.request, hsd.request_sz);
- hsd.max_request = cdt->cdt_max_request;
+ hsd.max_requests = cdt->cdt_max_requests;
hsd.request_sz =
- hsd.max_request * sizeof(*hsd.request);
+ hsd.max_requests * sizeof(*hsd.request);
OBD_ALLOC(hsd.request, hsd.request_sz);
if (!hsd.request) {
rc = -ENOMEM;
}
/* here hsd contains a list of requests to be started */
- for (i = 0; i < hsd.max_request; i++) {
+ for (i = 0; i < hsd.max_requests; i++) {
struct hsm_action_list *hal;
struct hsm_action_item *hai;
__u64 *cookies;
/* still room for work ? */
if (atomic_read(&cdt->cdt_request_count) ==
- cdt->cdt_max_request)
+ cdt->cdt_max_requests)
break;
if (hsd.request[i].hal == NULL)
}
/* free hal allocated by callback */
- for (i = 0; i < hsd.max_request; i++) {
+ for (i = 0; i < hsd.max_requests; i++) {
if (hsd.request[i].hal) {
OBD_FREE(hsd.request[i].hal,
hsd.request[i].hal_sz);
RETURN(rc);
/* for mdt_ucred(), lu_ucred stored in lu_ucred_key */
- rc = lu_context_init(&cdt->cdt_session, LCT_SESSION);
+ rc = lu_context_init(&cdt->cdt_session, LCT_SERVER_SESSION);
if (rc == 0) {
lu_context_enter(&cdt->cdt_session);
cdt->cdt_env.le_ses = &cdt->cdt_session;
/* default values for /proc tunnables
* can be override by MGS conf */
cdt->cdt_default_archive_id = 1;
- cdt->cdt_delay = 60;
+ cdt->cdt_grace_delay = 60;
cdt->cdt_loop_period = 10;
- cdt->cdt_max_request = 3;
+ cdt->cdt_max_requests = 3;
cdt->cdt_policy = CDT_DEFAULT_POLICY;
- cdt->cdt_timeout = 3600;
+ cdt->cdt_active_req_timeout = 3600;
RETURN(0);
}
/* 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();
-
atomic_set(&cdt->cdt_request_count, 0);
+ cdt->cdt_user_request_mask = (1UL << HSMA_RESTORE);
+ cdt->cdt_group_request_mask = (1UL << HSMA_RESTORE);
+ cdt->cdt_other_request_mask = (1UL << HSMA_RESTORE);
/* to avoid deadlock when start is made through /proc
* /proc entries are created by the coordinator thread */
}
GENERATE_PROC_METHOD(cdt_loop_period)
-GENERATE_PROC_METHOD(cdt_delay)
-GENERATE_PROC_METHOD(cdt_timeout)
-GENERATE_PROC_METHOD(cdt_max_request)
+GENERATE_PROC_METHOD(cdt_grace_delay)
+GENERATE_PROC_METHOD(cdt_active_req_timeout)
+GENERATE_PROC_METHOD(cdt_max_requests)
GENERATE_PROC_METHOD(cdt_default_archive_id)
/*
RETURN(sz);
}
+static int
+lprocfs_rd_hsm_request_mask(char *page, char **start, off_t off,
+ int count, int *eof, __u64 mask)
+{
+ int i, rc = 0;
+ ENTRY;
+
+ for (i = 0; i < 8 * sizeof(mask); i++) {
+ if (mask & (1UL << i))
+ rc += snprintf(page + rc, count - rc, "%s%s",
+ rc == 0 ? "" : " ",
+ hsm_copytool_action2name(i));
+ }
+
+ rc += snprintf(page + rc, count - rc, "\n");
+
+ RETURN(rc);
+}
+
+static int
+lprocfs_rd_hsm_user_request_mask(char *page, char **start, off_t off,
+ int count, int *eof, void *data)
+{
+ struct mdt_device *mdt = data;
+ struct coordinator *cdt = &mdt->mdt_coordinator;
+
+ return lprocfs_rd_hsm_request_mask(page, start, off, count, eof,
+ cdt->cdt_user_request_mask);
+}
+
+static int
+lprocfs_rd_hsm_group_request_mask(char *page, char **start, off_t off,
+ int count, int *eof, void *data)
+{
+ struct mdt_device *mdt = data;
+ struct coordinator *cdt = &mdt->mdt_coordinator;
+
+ return lprocfs_rd_hsm_request_mask(page, start, off, count, eof,
+ cdt->cdt_group_request_mask);
+}
+
+static int
+lprocfs_rd_hsm_other_request_mask(char *page, char **start, off_t off,
+ int count, int *eof, void *data)
+{
+ struct mdt_device *mdt = data;
+ struct coordinator *cdt = &mdt->mdt_coordinator;
+
+ return lprocfs_rd_hsm_request_mask(page, start, off, count, eof,
+ cdt->cdt_other_request_mask);
+}
+
+static inline enum hsm_copytool_action
+hsm_copytool_name2action(const char *name)
+{
+ if (strcasecmp(name, "NOOP") == 0)
+ return HSMA_NONE;
+ else if (strcasecmp(name, "ARCHIVE") == 0)
+ return HSMA_ARCHIVE;
+ else if (strcasecmp(name, "RESTORE") == 0)
+ return HSMA_RESTORE;
+ else if (strcasecmp(name, "REMOVE") == 0)
+ return HSMA_REMOVE;
+ else if (strcasecmp(name, "CANCEL") == 0)
+ return HSMA_CANCEL;
+ else
+ return -1;
+}
+
+static int
+lprocfs_wr_hsm_request_mask(struct file *file, const char __user *user_buf,
+ unsigned long user_count, __u64 *mask)
+{
+ char *buf, *pos, *name;
+ size_t buf_size;
+ __u64 new_mask = 0;
+ int rc;
+ ENTRY;
+
+ if (!(user_count < 4096))
+ RETURN(-ENOMEM);
+
+ buf_size = user_count + 1;
+
+ OBD_ALLOC(buf, buf_size);
+ if (buf == NULL)
+ RETURN(-ENOMEM);
+
+ if (copy_from_user(buf, user_buf, buf_size - 1))
+ GOTO(out, rc = -EFAULT);
+
+ buf[buf_size - 1] = '\0';
+
+ pos = buf;
+ while ((name = strsep(&pos, " \t\v\n")) != NULL) {
+ int action;
+
+ if (*name == '\0')
+ continue;
+
+ action = hsm_copytool_name2action(name);
+ if (action < 0)
+ GOTO(out, rc = -EINVAL);
+
+ new_mask |= (1UL << action);
+ }
+
+ *mask = new_mask;
+ rc = user_count;
+out:
+ OBD_FREE(buf, buf_size);
+
+ RETURN(rc);
+}
+
+static int
+lprocfs_wr_hsm_user_request_mask(struct file *file, const char __user *buf,
+ unsigned long count, void *data)
+{
+ struct mdt_device *mdt = data;
+ struct coordinator *cdt = &mdt->mdt_coordinator;
+
+ return lprocfs_wr_hsm_request_mask(file, buf, count,
+ &cdt->cdt_user_request_mask);
+}
+
+static int
+lprocfs_wr_hsm_group_request_mask(struct file *file, const char __user *buf,
+ unsigned long count, void *data)
+{
+ struct mdt_device *mdt = data;
+ struct coordinator *cdt = &mdt->mdt_coordinator;
+
+ return lprocfs_wr_hsm_request_mask(file, buf, count,
+ &cdt->cdt_group_request_mask);
+}
+
+static int
+lprocfs_wr_hsm_other_request_mask(struct file *file, const char __user *buf,
+ unsigned long count, void *data)
+{
+ struct mdt_device *mdt = data;
+ struct coordinator *cdt = &mdt->mdt_coordinator;
+
+ return lprocfs_wr_hsm_request_mask(file, buf, count,
+ &cdt->cdt_other_request_mask);
+}
+
static struct lprocfs_vars lprocfs_mdt_hsm_vars[] = {
- { "agents", NULL, NULL, NULL, &mdt_hsm_agent_fops, 0 },
- { "agent_actions", NULL, NULL, NULL,
- &mdt_agent_actions_fops, 0444 },
- { "default_archive_id", lprocfs_rd_hsm_cdt_default_archive_id,
- lprocfs_wr_hsm_cdt_default_archive_id,
- NULL, NULL, 0 },
- { "grace_delay", lprocfs_rd_hsm_cdt_delay,
- lprocfs_wr_hsm_cdt_delay,
- NULL, NULL, 0 },
- { "loop_period", lprocfs_rd_hsm_cdt_loop_period,
- lprocfs_wr_hsm_cdt_loop_period,
- NULL, NULL, 0 },
- { "max_requests", lprocfs_rd_hsm_cdt_max_request,
- lprocfs_wr_hsm_cdt_max_request,
- NULL, NULL, 0 },
- { "policy", lprocfs_rd_hsm_policy, lprocfs_wr_hsm_policy,
- NULL, NULL, 0 },
- { "request_timeout", lprocfs_rd_hsm_cdt_timeout,
- lprocfs_wr_hsm_cdt_timeout,
- NULL, NULL, 0 },
- { "requests", NULL, NULL, NULL, &mdt_hsm_request_fops, 0 },
+ { "agents", NULL, NULL, NULL, &mdt_hsm_agent_fops,
+ 0 },
+ { "actions", NULL, NULL, NULL, &mdt_hsm_actions_fops,
+ 0444 },
+ { "default_archive_id", lprocfs_rd_hsm_cdt_default_archive_id,
+ lprocfs_wr_hsm_cdt_default_archive_id,
+ NULL, NULL, 0 },
+ { "grace_delay", lprocfs_rd_hsm_cdt_grace_delay,
+ lprocfs_wr_hsm_cdt_grace_delay,
+ NULL, NULL, 0 },
+ { "loop_period", lprocfs_rd_hsm_cdt_loop_period,
+ lprocfs_wr_hsm_cdt_loop_period,
+ NULL, NULL, 0 },
+ { "max_requests", lprocfs_rd_hsm_cdt_max_requests,
+ lprocfs_wr_hsm_cdt_max_requests,
+ NULL, NULL, 0 },
+ { "policy", lprocfs_rd_hsm_policy,
+ lprocfs_wr_hsm_policy,
+ NULL, NULL, 0 },
+ { "active_request_timeout", lprocfs_rd_hsm_cdt_active_req_timeout,
+ lprocfs_wr_hsm_cdt_active_req_timeout,
+ NULL, NULL, 0 },
+ { "active_requests", NULL, NULL, NULL,
+ &mdt_hsm_active_requests_fops, 0 },
+ { "user_request_mask", lprocfs_rd_hsm_user_request_mask,
+ lprocfs_wr_hsm_user_request_mask, },
+ { "group_request_mask", lprocfs_rd_hsm_group_request_mask,
+ lprocfs_wr_hsm_group_request_mask, },
+ { "other_request_mask", lprocfs_rd_hsm_other_request_mask,
+ lprocfs_wr_hsm_other_request_mask, },
{ 0 }
};