Whamcloud - gitweb
git://git.whamcloud.com
/
fs
/
lustre-release.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
LU-3817 llite: Truncate to restore file
[fs/lustre-release.git]
/
lustre
/
mdt
/
mdt_coordinator.c
diff --git
a/lustre/mdt/mdt_coordinator.c
b/lustre/mdt/mdt_coordinator.c
index
a48bc36
..
fa92f75
100644
(file)
--- a/
lustre/mdt/mdt_coordinator.c
+++ b/
lustre/mdt/mdt_coordinator.c
@@
-53,7
+53,7
@@
static struct lprocfs_vars lprocfs_mdt_hsm_vars[];
* \param mti [IN] context
* \param fid [IN] object fid
* \param hsm [OUT] HSM meta data
* \param mti [IN] context
* \param fid [IN] object fid
* \param hsm [OUT] HSM meta data
- * \retval obj
+ * \retval obj
or error (-ENOENT if not found)
*/
struct mdt_object *mdt_hsm_get_md_hsm(struct mdt_thread_info *mti,
const struct lu_fid *fid,
*/
struct mdt_object *mdt_hsm_get_md_hsm(struct mdt_thread_info *mti,
const struct lu_fid *fid,
@@
-105,7
+105,7
@@
void mdt_hsm_dump_hal(int level, const char *prefix,
prefix, hal->hal_version, hal->hal_count,
hal->hal_compound_id, hal->hal_archive_id, hal->hal_flags);
prefix, hal->hal_version, hal->hal_count,
hal->hal_compound_id, hal->hal_archive_id, hal->hal_flags);
- hai = hai_
zero
(hal);
+ hai = hai_
first
(hal);
for (i = 0; i < hal->hal_count; i++) {
sz = hai->hai_len - sizeof(*hai);
CDEBUG(level, "%s %d: fid="DFID" dfid="DFID
for (i = 0; i < hal->hal_count; i++) {
sz = hai->hai_len - sizeof(*hai);
CDEBUG(level, "%s %d: fid="DFID" dfid="DFID
@@
-201,7
+201,7
@@
static int mdt_coordinator_cb(const struct lu_env *env,
continue;
}
}
continue;
}
}
- if (
(found == -1) && (empty_slot == -1)
)
+ 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
/* unknown request and no more room for new request,
* continue scan for to find other entries for
* already found request
@@
-239,7
+239,7
@@
static int mdt_coordinator_cb(const struct lu_env *env,
hsd->request[empty_slot].hal = hal;
hsd->request_cnt++;
found = empty_slot;
hsd->request[empty_slot].hal = hal;
hsd->request_cnt++;
found = empty_slot;
- hai = hai_
zero
(hal);
+ hai = hai_
first
(hal);
} else {
/* request is known */
/* we check if record archive num is the same as the
} else {
/* request is known */
/* we check if record archive num is the same as the
@@
-276,7
+276,7
@@
static int mdt_coordinator_cb(const struct lu_env *env,
hsd->request[found].hal = hal_buffer;
hsd->request[found].hal_sz = sz;
}
hsd->request[found].hal = hal_buffer;
hsd->request[found].hal_sz = sz;
}
- hai = hai_
zero
(hsd->request[found].hal);
+ hai = hai_
first
(hsd->request[found].hal);
for (i = 0; i < hsd->request[found].hal->hal_count;
i++)
hai = hai_next(hai);
for (i = 0; i < hsd->request[found].hal->hal_count;
i++)
hai = hai_next(hai);
@@
-422,10
+422,10
@@
static int mdt_coordinator(void *data)
ENTRY;
cdt->cdt_thread.t_flags = SVC_RUNNING;
ENTRY;
cdt->cdt_thread.t_flags = SVC_RUNNING;
-
cfs_waitq_signal
(&cdt->cdt_thread.t_ctl_waitq);
+
wake_up
(&cdt->cdt_thread.t_ctl_waitq);
CDEBUG(D_HSM, "%s: coordinator thread starting, pid=%d\n",
CDEBUG(D_HSM, "%s: coordinator thread starting, pid=%d\n",
- mdt_obd_name(mdt), c
fs_curproc
_pid());
+ mdt_obd_name(mdt), c
urrent
_pid());
/*
* create /proc entries for coordinator
/*
* create /proc entries for coordinator
@@
-461,8
+461,8
@@
static int mdt_coordinator(void *data)
CDEBUG(D_HSM, "coordinator resumes\n");
CDEBUG(D_HSM, "coordinator resumes\n");
- if (
(cdt->cdt_thread.t_flags & SVC_STOPPING)
||
-
(cdt->cdt_state == CDT_STOPPING)
) {
+ if (
cdt->cdt_thread.t_flags & SVC_STOPPING
||
+
cdt->cdt_state == CDT_STOPPING
) {
cdt->cdt_thread.t_flags &= ~SVC_STOPPING;
rc = 0;
break;
cdt->cdt_thread.t_flags &= ~SVC_STOPPING;
rc = 0;
break;
@@
-589,7
+589,7
@@
static int mdt_coordinator(void *data)
kuc_free(hal, hsd.request[i].hal_used_sz);
continue;
}
kuc_free(hal, hsd.request[i].hal_used_sz);
continue;
}
- hai = hai_
zero
(hal);
+ hai = hai_
first
(hal);
for (j = 0; j < hsd.request[i].hal->hal_count; j++) {
cookies[j] = hai->hai_cookie;
hai = hai_next(hai);
for (j = 0; j < hsd.request[i].hal->hal_count; j++) {
cookies[j] = hai->hai_cookie;
hai = hai_next(hai);
@@
-652,16
+652,16
@@
out:
* and cdt cleaning will be done by event sender
*/
cdt->cdt_thread.t_flags = SVC_STOPPED;
* and cdt cleaning will be done by event sender
*/
cdt->cdt_thread.t_flags = SVC_STOPPED;
-
cfs_waitq_signal
(&cdt->cdt_thread.t_ctl_waitq);
+
wake_up
(&cdt->cdt_thread.t_ctl_waitq);
}
if (rc != 0)
CERROR("%s: coordinator thread exiting, process=%d, rc=%d\n",
}
if (rc != 0)
CERROR("%s: coordinator thread exiting, process=%d, rc=%d\n",
- mdt_obd_name(mdt), c
fs_curproc
_pid(), rc);
+ mdt_obd_name(mdt), c
urrent
_pid(), rc);
else
CDEBUG(D_HSM, "%s: coordinator thread exiting, process=%d,"
" no error\n",
else
CDEBUG(D_HSM, "%s: coordinator thread exiting, process=%d,"
" no error\n",
- mdt_obd_name(mdt), c
fs_curproc
_pid());
+ mdt_obd_name(mdt), c
urrent
_pid());
return rc;
}
return rc;
}
@@
-725,8
+725,12
@@
static int hsm_restore_cb(const struct lu_env *env,
larr = (struct llog_agent_req_rec *)hdr;
hai = &larr->arr_hai;
larr = (struct llog_agent_req_rec *)hdr;
hai = &larr->arr_hai;
- if ((hai->hai_action != HSMA_RESTORE) ||
- agent_req_in_final_state(larr->arr_status))
+ if (hai->hai_cookie > cdt->cdt_last_cookie)
+ /* update the cookie to avoid collision */
+ cdt->cdt_last_cookie = hai->hai_cookie + 1;
+
+ if (hai->hai_action != HSMA_RESTORE ||
+ agent_req_in_final_state(larr->arr_status))
RETURN(0);
/* restore request not in a final state */
RETURN(0);
/* restore request not in a final state */
@@
-741,7
+745,7
@@
static int hsm_restore_cb(const struct lu_env *env,
crh->extent.end = hai->hai_extent.offset + hai->hai_extent.length;
*/
crh->crh_extent.start = 0;
crh->extent.end = hai->hai_extent.offset + hai->hai_extent.length;
*/
crh->crh_extent.start = 0;
- crh->crh_extent.end =
OBD_OBJECT_EOF
;
+ crh->crh_extent.end =
hai->hai_extent.length
;
/* get the layout lock */
mdt_lock_reg_init(&crh->crh_lh, LCK_EX);
child = mdt_object_find_lock(mti, &crh->crh_fid, &crh->crh_lh,
/* get the layout lock */
mdt_lock_reg_init(&crh->crh_lh, LCK_EX);
child = mdt_object_find_lock(mti, &crh->crh_fid, &crh->crh_lh,
@@
-796,7
+800,7
@@
static int hsm_init_ucred(struct lu_ucred *uc)
uc->uc_fsgid = 0;
uc->uc_suppgids[0] = -1;
uc->uc_suppgids[1] = -1;
uc->uc_fsgid = 0;
uc->uc_suppgids[0] = -1;
uc->uc_suppgids[1] = -1;
- uc->uc_cap =
0
;
+ uc->uc_cap =
CFS_CAP_FS_MASK
;
uc->uc_umask = 0777;
uc->uc_ginfo = NULL;
uc->uc_identity = NULL;
uc->uc_umask = 0777;
uc->uc_ginfo = NULL;
uc->uc_identity = NULL;
@@
-820,7
+824,7
@@
int mdt_hsm_cdt_wakeup(struct mdt_device *mdt)
/* wake up coordinator */
cdt->cdt_thread.t_flags = SVC_EVENT;
/* wake up coordinator */
cdt->cdt_thread.t_flags = SVC_EVENT;
-
cfs_waitq_signal
(&cdt->cdt_thread.t_ctl_waitq);
+
wake_up
(&cdt->cdt_thread.t_ctl_waitq);
RETURN(0);
}
RETURN(0);
}
@@
-840,7
+844,7
@@
int mdt_hsm_cdt_init(struct mdt_device *mdt)
cdt->cdt_state = CDT_STOPPED;
cdt->cdt_state = CDT_STOPPED;
-
cfs_waitq_init
(&cdt->cdt_thread.t_ctl_waitq);
+
init_waitqueue_head
(&cdt->cdt_thread.t_ctl_waitq);
mutex_init(&cdt->cdt_llog_lock);
init_rwsem(&cdt->cdt_agent_lock);
init_rwsem(&cdt->cdt_request_lock);
mutex_init(&cdt->cdt_llog_lock);
init_rwsem(&cdt->cdt_agent_lock);
init_rwsem(&cdt->cdt_request_lock);
@@
-904,7
+908,7
@@
int mdt_hsm_cdt_start(struct mdt_device *mdt)
int rc;
void *ptr;
struct mdt_thread_info *cdt_mti;
int rc;
void *ptr;
struct mdt_thread_info *cdt_mti;
-
cfs_task_t
*task;
+
struct task_struct
*task;
ENTRY;
/* functions defined but not yet used
ENTRY;
/* functions defined but not yet used
@@
-921,7
+925,7
@@
int mdt_hsm_cdt_start(struct mdt_device *mdt)
cdt->cdt_policy = CDT_DEFAULT_POLICY;
cdt->cdt_state = CDT_INIT;
cdt->cdt_policy = CDT_DEFAULT_POLICY;
cdt->cdt_state = CDT_INIT;
-
cfs_
atomic_set(&cdt->cdt_compound_id, cfs_time_current_sec());
+ 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();
/* 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();
@@
-929,6
+933,7
@@
int mdt_hsm_cdt_start(struct mdt_device *mdt)
cdt->cdt_delay = 60;
cdt->cdt_timeout = 3600;
cdt->cdt_max_request = 3;
cdt->cdt_delay = 60;
cdt->cdt_timeout = 3600;
cdt->cdt_max_request = 3;
+ cdt->cdt_archive_id = 1;
atomic_set(&cdt->cdt_request_count, 0);
/* to avoid deadlock when start is made through /proc
atomic_set(&cdt->cdt_request_count, 0);
/* to avoid deadlock when start is made through /proc
@@
-955,7
+960,7
@@
int mdt_hsm_cdt_start(struct mdt_device *mdt)
rc = 0;
}
rc = 0;
}
-
cfs_
wait_event(cdt->cdt_thread.t_ctl_waitq,
+ wait_event(cdt->cdt_thread.t_ctl_waitq,
(cdt->cdt_thread.t_flags & SVC_RUNNING));
cdt->cdt_state = CDT_RUNNING;
(cdt->cdt_thread.t_flags & SVC_RUNNING));
cdt->cdt_state = CDT_RUNNING;
@@
-989,9
+994,9
@@
int mdt_hsm_cdt_stop(struct mdt_device *mdt)
if (cdt->cdt_state != CDT_STOPPING) {
/* stop coordinator thread before cleaning */
cdt->cdt_thread.t_flags = SVC_STOPPING;
if (cdt->cdt_state != CDT_STOPPING) {
/* stop coordinator thread before cleaning */
cdt->cdt_thread.t_flags = SVC_STOPPING;
-
cfs_waitq_signal
(&cdt->cdt_thread.t_ctl_waitq);
-
cfs_
wait_event(cdt->cdt_thread.t_ctl_waitq,
-
cdt->cdt_thread.t_flags & SVC_STOPPED);
+
wake_up
(&cdt->cdt_thread.t_ctl_waitq);
+ wait_event(cdt->cdt_thread.t_ctl_waitq,
+ cdt->cdt_thread.t_flags & SVC_STOPPED);
}
cdt->cdt_state = CDT_STOPPED;
}
cdt->cdt_state = CDT_STOPPED;
@@
-1051,7
+1056,7
@@
int mdt_hsm_add_hal(struct mdt_thread_info *mti,
ENTRY;
/* register request in memory list */
ENTRY;
/* register request in memory list */
- hai = hai_
zero
(hal);
+ hai = hai_
first
(hal);
for (i = 0; i < hal->hal_count; i++, hai = hai_next(hai)) {
struct cdt_agent_req *car;
for (i = 0; i < hal->hal_count; i++, hai = hai_next(hai)) {
struct cdt_agent_req *car;
@@
-1229,9
+1234,8
@@
static int hsm_cdt_request_completed(struct mdt_thread_info *mti,
*status = ARS_SUCCEED;
break;
default:
*status = ARS_SUCCEED;
break;
default:
- *status = (((cdt->cdt_policy &
- CDT_NORETRY_ACTION) ||
- !(pgs->hpk_flags & HP_FLAG_RETRY)) ?
+ *status = (cdt->cdt_policy & CDT_NORETRY_ACTION ||
+ !(pgs->hpk_flags & HP_FLAG_RETRY) ?
ARS_FAILED : ARS_WAITING);
break;
}
ARS_FAILED : ARS_WAITING);
break;
}
@@
-1329,8
+1333,8
@@
static int hsm_cdt_request_completed(struct mdt_thread_info *mti,
* a crasy CT no need to manage DIRTY
*/
if (rc == 0)
* a crasy CT no need to manage DIRTY
*/
if (rc == 0)
- hsm_set_cl_flags(&cl_flags,
((mh.mh_flags & HS_DIRTY) ?
-
CLF_HSM_DIRTY : 0)
);
+ hsm_set_cl_flags(&cl_flags,
+
mh.mh_flags & HS_DIRTY ? CLF_HSM_DIRTY : 0
);
/* unlock is done later, after layout lock management */
if (is_mh_changed)
/* unlock is done later, after layout lock management */
if (is_mh_changed)
@@
-1340,9
+1344,9
@@
unlock:
/* we give back layout lock only if restore was successful or
* if restore was canceled or if policy is to not retry
* in other cases we just unlock the object */
/* we give back layout lock only if restore was successful or
* if restore was canceled or if policy is to not retry
* in other cases we just unlock the object */
- if (
(car->car_hai->hai_action == HSMA_RESTORE)
&&
- (
(pgs->hpk_errval == 0) || (pgs->hpk_errval == ECANCELED)
||
-
(cdt->cdt_policy & CDT_NORETRY_ACTION)
)) {
+ if (
car->car_hai->hai_action == HSMA_RESTORE
&&
+ (
pgs->hpk_errval == 0 || pgs->hpk_errval == ECANCELED
||
+
cdt->cdt_policy & CDT_NORETRY_ACTION
)) {
struct cdt_restore_handle *crh;
/* restore in data FID done, we swap the layouts
struct cdt_restore_handle *crh;
/* restore in data FID done, we swap the layouts
@@
-1369,8
+1373,9
@@
unlock:
/* just give back layout lock, we keep
* the reference which is given back
* later with the lock for HSM flags */
/* just give back layout lock, we keep
* the reference which is given back
* later with the lock for HSM flags */
- if (!IS_ERR(obj))
+ if (!IS_ERR(obj)
&& crh != NULL
)
mdt_object_unlock(mti, obj, &crh->crh_lh, 1);
mdt_object_unlock(mti, obj, &crh->crh_lh, 1);
+
if (crh != NULL)
OBD_SLAB_FREE_PTR(crh, mdt_hsm_cdt_kmem);
}
if (crh != NULL)
OBD_SLAB_FREE_PTR(crh, mdt_hsm_cdt_kmem);
}
@@
-1378,7
+1383,7
@@
unlock:
GOTO(out, rc);
out:
GOTO(out, rc);
out:
- if (
(obj != NULL)
&& !IS_ERR(obj)) {
+ if (
obj != NULL
&& !IS_ERR(obj)) {
mo_changelog(env, CL_HSM, cl_flags,
mdt_object_child(obj));
mdt_object_put(mti->mti_env, obj);
mo_changelog(env, CL_HSM, cl_flags,
mdt_object_child(obj));
mdt_object_put(mti->mti_env, obj);
@@
-1416,6
+1421,8
@@
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));
" on fid="DFID"\n",
mdt_obd_name(mdt),
pgs->hpk_cookie, PFID(&pgs->hpk_fid));
+ if (car == NULL)
+ RETURN(-ENOENT);
RETURN(PTR_ERR(car));
}
RETURN(PTR_ERR(car));
}
@@
-1430,12
+1437,12
@@
int mdt_hsm_update_request_state(struct mdt_thread_info *mti,
/* progress is done on FID or data FID depending of the action and
* of the copy progress */
/* for restore progress is used to send back the data FID to cdt */
/* progress is done on FID or data FID depending of the action and
* of the copy progress */
/* for restore progress is used to send back the data FID to cdt */
- if (
(car->car_hai->hai_action == HSMA_RESTORE)
&&
-
(lu_fid_eq(&car->car_hai->hai_fid, &car->car_hai->hai_dfid)
))
+ if (
car->car_hai->hai_action == HSMA_RESTORE
&&
+
lu_fid_eq(&car->car_hai->hai_fid, &car->car_hai->hai_dfid
))
car->car_hai->hai_dfid = pgs->hpk_fid;
car->car_hai->hai_dfid = pgs->hpk_fid;
- if ((
(car->car_hai->hai_action == HSMA_RESTORE)
||
-
(car->car_hai->hai_action == HSMA_ARCHIVE)
) &&
+ if ((
car->car_hai->hai_action == HSMA_RESTORE
||
+
car->car_hai->hai_action == HSMA_ARCHIVE
) &&
(!lu_fid_eq(&pgs->hpk_fid, &car->car_hai->hai_dfid) &&
!lu_fid_eq(&pgs->hpk_fid, &car->car_hai->hai_fid))) {
CERROR("%s: Progress on "DFID" for cookie "LPX64
(!lu_fid_eq(&pgs->hpk_fid, &car->car_hai->hai_dfid) &&
!lu_fid_eq(&pgs->hpk_fid, &car->car_hai->hai_fid))) {
CERROR("%s: Progress on "DFID" for cookie "LPX64
@@
-1542,8
+1549,8
@@
static int mdt_cancel_all_cb(const struct lu_env *env,
larr = (struct llog_agent_req_rec *)hdr;
hcad = data;
larr = (struct llog_agent_req_rec *)hdr;
hcad = data;
- if (
(larr->arr_status == ARS_WAITING)
||
-
(larr->arr_status == ARS_STARTED)
) {
+ if (
larr->arr_status == ARS_WAITING
||
+
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);
larr->arr_status = ARS_CANCELED;
larr->arr_req_change = cfs_time_current_sec();
rc = mdt_agent_llog_update_rec(env, hcad->mdt, llh, larr);
@@
-1593,7
+1600,7
@@
static int hsm_cancel_all_actions(struct mdt_device *mdt)
hal_len = sizeof(*hal) + cfs_size_round(MTI_NAME_MAXLEN + 1) +
cfs_size_round(car->car_hai->hai_len);
hal_len = sizeof(*hal) + cfs_size_round(MTI_NAME_MAXLEN + 1) +
cfs_size_round(car->car_hai->hai_len);
- if (
(hal_len > hal_sz) && (hal_sz > 0)
) {
+ if (
hal_len > hal_sz && hal_sz > 0
) {
/* not enough room, free old buffer */
OBD_FREE(hal, hal_sz);
hal = NULL;
/* not enough room, free old buffer */
OBD_FREE(hal, hal_sz);
hal = NULL;
@@
-1619,7
+1626,7
@@
static int hsm_cancel_all_actions(struct mdt_device *mdt)
hal->hal_flags = car->car_flags;
hal->hal_count = 0;
hal->hal_flags = car->car_flags;
hal->hal_count = 0;
- hai = hai_
zero
(hal);
+ hai = hai_
first
(hal);
memcpy(hai, car->car_hai, car->car_hai->hai_len);
hai->hai_action = HSMA_CANCEL;
hal->hal_count = 1;
memcpy(hai, car->car_hai, car->car_hai->hai_len);
hai->hai_action = HSMA_CANCEL;
hal->hal_count = 1;
@@
-1673,12
+1680,12
@@
bool mdt_hsm_is_action_compat(const struct hsm_action_item *hai,
switch (hai->hai_action) {
case HSMA_ARCHIVE:
if (!(hsm_flags & HS_NOARCHIVE) &&
switch (hai->hai_action) {
case HSMA_ARCHIVE:
if (!(hsm_flags & HS_NOARCHIVE) &&
- (
(hsm_flags & HS_DIRTY)
|| !(hsm_flags & HS_ARCHIVED)))
+ (
hsm_flags & HS_DIRTY
|| !(hsm_flags & HS_ARCHIVED)))
is_compat = true;
break;
case HSMA_RESTORE:
if (!(hsm_flags & HS_DIRTY) && (hsm_flags & HS_RELEASED) &&
is_compat = true;
break;
case HSMA_RESTORE:
if (!(hsm_flags & HS_DIRTY) && (hsm_flags & HS_RELEASED) &&
-
(hsm_flags & HS_ARCHIVED)
&& !(hsm_flags & HS_LOST))
+
hsm_flags & HS_ARCHIVED
&& !(hsm_flags & HS_LOST))
is_compat = true;
break;
case HSMA_REMOVE:
is_compat = true;
break;
case HSMA_REMOVE:
@@
-1895,6
+1902,7
@@
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_delay)
GENERATE_PROC_METHOD(cdt_timeout)
GENERATE_PROC_METHOD(cdt_max_request)
+GENERATE_PROC_METHOD(cdt_archive_id)
/*
* procfs write method for MDT/hsm_control
/*
* procfs write method for MDT/hsm_control
@@
-1980,6
+1988,9
@@
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 },
{ "agents", NULL, NULL, NULL, &mdt_hsm_agent_fops, 0 },
{ "agent_actions", NULL, NULL, NULL,
&mdt_agent_actions_fops, 0444 },
+ { "archive_id", lprocfs_rd_hsm_cdt_archive_id,
+ lprocfs_wr_hsm_cdt_archive_id,
+ NULL, NULL, 0 },
{ "grace_delay", lprocfs_rd_hsm_cdt_delay,
lprocfs_wr_hsm_cdt_delay,
NULL, NULL, 0 },
{ "grace_delay", lprocfs_rd_hsm_cdt_delay,
lprocfs_wr_hsm_cdt_delay,
NULL, NULL, 0 },