* (C) Copyright 2012 Commissariat a l'energie atomique et aux energies
* alternatives
*
+ * Copyright (c) 2013, 2014, Intel Corporation.
*/
/*
- * lustre/mdt/mdt_agent_actions.c
+ * lustre/mdt/mdt_hsm_cdt_actions.c
*
* Lustre HSM
*
sz = larr->arr_hai.hai_len - sizeof(larr->arr_hai);
CDEBUG(D_HSM, "%slrh=[type=%X len=%d idx=%d] fid="DFID
" dfid="DFID
- " compound/cookie="LPX64"/"LPX64
- " status=%s action=%s archive#=%d flags="LPX64
- " create="LPU64" change="LPU64
- " extent="LPX64"-"LPX64" gid="LPX64" datalen=%d"
+ " compound/cookie=%#llx/%#llx"
+ " status=%s action=%s archive#=%d flags=%#llx"
+ " create=%llu change=%llu"
+ " extent=%#llx-%#llx gid=%#llx datalen=%d"
" data=[%s]\n",
prefix,
larr->arr_hdr.lrh_type,
/* in case of cancel request, the cookie is already set to the
* value of the request cookie to be cancelled
* so we do not change it */
- if (hai->hai_action != HSMA_CANCEL) {
+ if (hai->hai_action == HSMA_CANCEL) {
+ larr->arr_hai.hai_cookie = hai->hai_cookie;
+ } else {
cdt->cdt_last_cookie++;
- hai->hai_cookie = cdt->cdt_last_cookie;
+ larr->arr_hai.hai_cookie = cdt->cdt_last_cookie;
}
- larr->arr_hai.hai_cookie = hai->hai_cookie;
- rc = llog_cat_add(env, lctxt->loc_handle, &larr->arr_hdr, NULL, NULL);
+
+ rc = llog_cat_add(env, lctxt->loc_handle, &larr->arr_hdr, NULL);
if (rc > 0)
rc = 0;
struct llog_agent_req_rec *larr;
struct data_update_cb *ducb;
int rc, i;
- int found;
ENTRY;
larr = (struct llog_agent_req_rec *)hdr;
ducb = data;
- found = 0;
/* check if all done */
if (ducb->cookies_count == ducb->cookies_done)
rc = 0;
for (i = 0 ; i < ducb->cookies_count ; i++) {
- CDEBUG(D_HSM, "%s: search "LPX64", found "LPX64"\n",
+ CDEBUG(D_HSM, "%s: search %#llx, found %#llx\n",
mdt_obd_name(ducb->mdt), ducb->cookies[i],
larr->arr_hai.hai_cookie);
if (larr->arr_hai.hai_cookie == ducb->cookies[i]) {
larr->arr_status = ducb->status;
larr->arr_req_change = ducb->change_time;
- rc = mdt_agent_llog_update_rec(env, ducb->mdt, llh,
- larr);
+ rc = llog_write(env, llh, hdr, hdr->lrh_index);
ducb->cookies_done++;
- found = 1;
break;
}
}
CERROR("%s: mdt_agent_llog_update_rec() failed, rc = %d\n",
mdt_obd_name(ducb->mdt), rc);
- if (found == 1)
- RETURN(LLOG_DEL_RECORD);
-
RETURN(rc);
}
RETURN(rc);
}
-/**
- * update a llog record
- * cdt_llog_lock must be hold
- * \param env [IN] environment
- * \param mdt [IN] mdt device
- * \param llh [IN] llog handle, must be a catalog handle
- * \param larr [IN] record
- * \retval 0 success
- * \retval -ve failure
- */
-int mdt_agent_llog_update_rec(const struct lu_env *env,
- struct mdt_device *mdt, struct llog_handle *llh,
- struct llog_agent_req_rec *larr)
-{
- struct llog_rec_hdr saved_hdr;
- int rc;
- ENTRY;
-
- /* saved old record info */
- saved_hdr = larr->arr_hdr;
- /* add new record with updated values */
- larr->arr_hdr.lrh_id = 0;
- larr->arr_hdr.lrh_index = 0;
- rc = llog_cat_add(env, llh->u.phd.phd_cat_handle, &larr->arr_hdr,
- NULL, NULL);
- larr->arr_hdr = saved_hdr;
- RETURN(rc);
-}
-
/*
* Agent actions /proc seq_file methods
* As llog processing uses a callback for each entry, we cannot do a sequential
* multiple record in seq_file buffer in one show call.
* op->start() sets the iterator up and returns the first element of sequence
* op->stop() shuts it down.
- * op->next() returns the next element of sequence.
- * op->show() prints element into the buffer.
+ * op->show() iterate llog and print element into the buffer.
* In case of error ->start() and ->next() return ERR_PTR(error)
* In the end of sequence they return %NULL
* op->show() returns 0 in case of success and negative number in case of error.
#define AGENT_ACTIONS_IT_MAGIC 0x19660426
struct agent_action_iterator {
int aai_magic; /**< magic number */
+ bool aai_eof; /**< all done */
struct lu_env aai_env; /**< lustre env for llog */
- struct obd_device *aai_obd; /**< metadata device */
+ struct mdt_device *aai_mdt; /**< metadata device */
struct llog_ctxt *aai_ctxt; /**< llog context */
- int aai_index_done; /**< idx already shown */
- int aai_index_cb; /**< current idx in loop cb */
- int aai_eof; /**< all done */
+ int aai_cat_index; /**< cata idx already shown */
+ int aai_index; /**< idx in cata shown */
};
/**
* seq_file method called to start access to /proc file
* get llog context + llog handle
*/
-static void *mdt_agent_actions_proc_start(struct seq_file *s, loff_t *pos)
+static void *mdt_hsm_actions_proc_start(struct seq_file *s, loff_t *pos)
{
struct agent_action_iterator *aai = s->private;
ENTRY;
- LASSERTF(aai->aai_magic == AGENT_ACTIONS_IT_MAGIC, "%08X",
+ LASSERTF(aai->aai_magic == AGENT_ACTIONS_IT_MAGIC, "%08X\n",
aai->aai_magic);
- aai->aai_ctxt = llog_get_context(aai->aai_obd, LLOG_AGENT_ORIG_CTXT);
+ aai->aai_ctxt = llog_get_context(mdt2obd_dev(aai->aai_mdt),
+ LLOG_AGENT_ORIG_CTXT);
if (aai->aai_ctxt == NULL || aai->aai_ctxt->loc_handle == NULL) {
CERROR("llog_get_context() failed\n");
RETURN(ERR_PTR(-ENOENT));
}
- CDEBUG(D_HSM, "llog succesfully initialized, start from "LPD64"\n",
+ CDEBUG(D_HSM, "llog successfully initialized, start from %lld\n",
*pos);
/* first call = rewind */
if (*pos == 0) {
- aai->aai_index_done = 0;
- aai->aai_eof = 0;
+ aai->aai_cat_index = 0;
+ aai->aai_index = 0;
+ aai->aai_eof = false;
*pos = 1;
}
+ if (aai->aai_eof)
+ RETURN(NULL);
+
RETURN(aai);
}
-/**
- * seq_file method called to get next item
- * just returns NULL at eof
- * (seq_file buffer filling is done in llog_cat_process() callback)
- */
-static void *mdt_agent_actions_proc_next(struct seq_file *s, void *v,
+static void *mdt_hsm_actions_proc_next(struct seq_file *s, void *v,
loff_t *pos)
{
- struct agent_action_iterator *aai = s->private;
- ENTRY;
-
- LASSERTF(aai->aai_magic == AGENT_ACTIONS_IT_MAGIC, "%08X",
- aai->aai_magic);
-
- CDEBUG(D_HSM, "set current="LPD64" to done=%d, eof=%d\n",
- *pos, aai->aai_index_done, aai->aai_eof);
- (*pos) = aai->aai_index_done;
-
- if (aai->aai_eof)
- RETURN(NULL);
-
- RETURN(aai);
+ RETURN(NULL);
}
/**
* llog_cat_process() callback, used to fill a seq_file buffer
*/
-static int agent_actions_show_cb(const struct lu_env *env,
+static int hsm_actions_show_cb(const struct lu_env *env,
struct llog_handle *llh,
struct llog_rec_hdr *hdr,
void *data)
struct llog_agent_req_rec *larr = (struct llog_agent_req_rec *)hdr;
struct seq_file *s = data;
struct agent_action_iterator *aai;
- int rc, sz;
+ int sz;
+ size_t count;
char buf[12];
ENTRY;
aai = s->private;
- LASSERTF(aai->aai_magic == AGENT_ACTIONS_IT_MAGIC, "%08X",
+ LASSERTF(aai->aai_magic == AGENT_ACTIONS_IT_MAGIC, "%08X\n",
aai->aai_magic);
- aai->aai_index_cb++;
/* if rec already printed => skip */
- if (aai->aai_index_cb <= aai->aai_index_done)
+ if (unlikely(llh->lgh_hdr->llh_cat_idx < aai->aai_cat_index))
RETURN(0);
- sz = larr->arr_hai.hai_len - sizeof(larr->arr_hai);
- rc = seq_printf(s, "lrh=[type=%X len=%d idx=%d] fid="DFID
- " dfid="DFID
- " compound/cookie="LPX64"/"LPX64
- " action=%s archive#=%d flags="LPX64
- " extent="LPX64"-"LPX64
- " gid="LPX64" datalen=%d status=%s"
- " data=[%s]\n",
- larr->arr_hdr.lrh_type,
- larr->arr_hdr.lrh_len, larr->arr_hdr.lrh_index,
- PFID(&larr->arr_hai.hai_fid),
- PFID(&larr->arr_hai.hai_dfid),
- larr->arr_compound_id, larr->arr_hai.hai_cookie,
- hsm_copytool_action2name(larr->arr_hai.hai_action),
- larr->arr_archive_id,
- larr->arr_flags,
- larr->arr_hai.hai_extent.offset,
- larr->arr_hai.hai_extent.length,
- larr->arr_hai.hai_gid, sz,
- agent_req_status2name(larr->arr_status),
- hai_dump_data_field(&larr->arr_hai, buf, sizeof(buf)));
- if (rc >= 0) {
- aai->aai_index_done++;
+ if (unlikely(llh->lgh_hdr->llh_cat_idx == aai->aai_cat_index &&
+ hdr->lrh_index <= aai->aai_index))
RETURN(0);
- }
- /* buffer is full, stop filling */
- RETURN(LLOG_PROC_BREAK);
+
+ count = s->count;
+ sz = larr->arr_hai.hai_len - sizeof(larr->arr_hai);
+ seq_printf(s, "lrh=[type=%X len=%d idx=%d/%d] fid="DFID
+ " dfid="DFID" compound/cookie=%#llx/%#llx"
+ " action=%s archive#=%d flags=%#llx"
+ " extent=%#llx-%#llx"
+ " gid=%#llx datalen=%d status=%s data=[%s]\n",
+ hdr->lrh_type, hdr->lrh_len,
+ llh->lgh_hdr->llh_cat_idx, hdr->lrh_index,
+ PFID(&larr->arr_hai.hai_fid),
+ PFID(&larr->arr_hai.hai_dfid),
+ larr->arr_compound_id, larr->arr_hai.hai_cookie,
+ hsm_copytool_action2name(larr->arr_hai.hai_action),
+ larr->arr_archive_id,
+ larr->arr_flags,
+ larr->arr_hai.hai_extent.offset,
+ larr->arr_hai.hai_extent.length,
+ larr->arr_hai.hai_gid, sz,
+ agent_req_status2name(larr->arr_status),
+ hai_dump_data_field(&larr->arr_hai, buf, sizeof(buf)));
+
+ aai->aai_cat_index = llh->lgh_hdr->llh_cat_idx;
+ aai->aai_index = hdr->lrh_index;
+
+ RETURN(0);
}
/**
- * mdt_agent_actions_proc_show() is called at for each seq record
+ * mdt_hsm_actions_proc_show() is called at for each seq record
* process the llog, with a cb which fill the file_seq buffer
* to be faster, one show will fill multiple records
*/
-static int mdt_agent_actions_proc_show(struct seq_file *s, void *v)
+static int mdt_hsm_actions_proc_show(struct seq_file *s, void *v)
{
struct agent_action_iterator *aai = s->private;
+ struct coordinator *cdt = &aai->aai_mdt->mdt_coordinator;
int rc;
ENTRY;
- LASSERTF(aai->aai_magic == AGENT_ACTIONS_IT_MAGIC, "%08X",
+ LASSERTF(aai->aai_magic == AGENT_ACTIONS_IT_MAGIC, "%08X\n",
aai->aai_magic);
- CDEBUG(D_HSM, "show from done=%d, eof=%d\n",
- aai->aai_index_done, aai->aai_eof);
+ CDEBUG(D_HSM, "show from cat %d index %d eof=%d\n",
+ aai->aai_cat_index, aai->aai_index, aai->aai_eof);
if (aai->aai_eof)
RETURN(0);
- aai->aai_index_cb = 0;
+ mutex_lock(&cdt->cdt_llog_lock);
rc = llog_cat_process(&aai->aai_env, aai->aai_ctxt->loc_handle,
- agent_actions_show_cb, s, 0, 0);
- /* was all llog parsed? */
- if (rc == 0)
- aai->aai_eof = 1;
- /* not enough room in buffer? */
- if (rc == LLOG_PROC_BREAK)
- RETURN(0);
- /* error */
+ hsm_actions_show_cb, s,
+ aai->aai_cat_index, aai->aai_index);
+ mutex_unlock(&cdt->cdt_llog_lock);
+ if (rc == 0) /* all llog parsed */
+ aai->aai_eof = true;
+ if (rc == LLOG_PROC_BREAK) /* buffer full */
+ rc = 0;
RETURN(rc);
}
* seq_file method called to stop access to /proc file
* clean + put llog context
*/
-static void mdt_agent_actions_proc_stop(struct seq_file *s, void *v)
+static void mdt_hsm_actions_proc_stop(struct seq_file *s, void *v)
{
struct agent_action_iterator *aai = s->private;
ENTRY;
- LASSERTF(aai->aai_magic == AGENT_ACTIONS_IT_MAGIC, "%08X",
+ LASSERTF(aai->aai_magic == AGENT_ACTIONS_IT_MAGIC, "%08X\n",
aai->aai_magic);
if (aai->aai_ctxt)
return;
}
-static const struct seq_operations mdt_agent_actions_proc_ops = {
- .start = mdt_agent_actions_proc_start,
- .next = mdt_agent_actions_proc_next,
- .show = mdt_agent_actions_proc_show,
- .stop = mdt_agent_actions_proc_stop,
+static const struct seq_operations mdt_hsm_actions_proc_ops = {
+ .start = mdt_hsm_actions_proc_start,
+ .next = mdt_hsm_actions_proc_next,
+ .show = mdt_hsm_actions_proc_show,
+ .stop = mdt_hsm_actions_proc_stop,
};
-static int lprocfs_open_agent_actions(struct inode *inode, struct file *file)
+static int lprocfs_open_hsm_actions(struct inode *inode, struct file *file)
{
struct agent_action_iterator *aai;
struct seq_file *s;
struct mdt_device *mdt;
ENTRY;
- if (LPROCFS_ENTRY_CHECK(PDE(inode)))
- RETURN(-ENOENT);
-
- rc = seq_open(file, &mdt_agent_actions_proc_ops);
+ rc = seq_open(file, &mdt_hsm_actions_proc_ops);
if (rc)
RETURN(rc);
/* mdt is saved in proc_dir_entry->data by
* mdt_coordinator_procfs_init() calling lprocfs_register()
*/
- mdt = (struct mdt_device *)PDE(inode)->data;
- aai->aai_obd = mdt2obd_dev(mdt);
+ mdt = (struct mdt_device *)PDE_DATA(inode);
+ aai->aai_mdt = mdt;
s = file->private_data;
s->private = aai;
}
/**
- * lprocfs_release_agent_actions() is called at end of /proc access
- * free alloacted ressources and call cleanup lprocfs methods
+ * lprocfs_release_hsm_actions() is called at end of /proc access.
+ * It frees allocated resources and calls cleanup lprocfs methods.
*/
-static int lprocfs_release_agent_actions(struct inode *inode, struct file *file)
+static int lprocfs_release_hsm_actions(struct inode *inode, struct file *file)
{
struct seq_file *seq = file->private_data;
struct agent_action_iterator *aai = seq->private;
return lprocfs_seq_release(inode, file);
}
-/* methods to access agent actions llog through /proc */
-const struct file_operations mdt_agent_actions_fops = {
+/* Methods to access HSM action list LLOG through /proc */
+const struct file_operations mdt_hsm_actions_fops = {
.owner = THIS_MODULE,
- .open = lprocfs_open_agent_actions,
+ .open = lprocfs_open_hsm_actions,
.read = seq_read,
.llseek = seq_lseek,
- .release = lprocfs_release_agent_actions,
+ .release = lprocfs_release_hsm_actions,
};