llog_cb_t cb, void *data, int startcat,
int startidx, bool fork)
{
- struct llog_process_data d;
- struct llog_log_hdr *llh = cat_llh->lgh_hdr;
- int rc;
- ENTRY;
+ struct llog_process_data d;
+ struct llog_log_hdr *llh = cat_llh->lgh_hdr;
+ int rc;
- LASSERT(llh->llh_flags & LLOG_F_IS_CAT);
- d.lpd_data = data;
- d.lpd_cb = cb;
- d.lpd_startcat = startcat;
- d.lpd_startidx = startidx;
+ ENTRY;
+
+ LASSERT(llh->llh_flags & LLOG_F_IS_CAT);
+ d.lpd_data = data;
+ d.lpd_cb = cb;
+ d.lpd_startcat = (startcat == LLOG_CAT_FIRST ? 0 : startcat);
+ d.lpd_startidx = startidx;
if (llh->llh_cat_idx >= cat_llh->lgh_last_idx &&
llh->llh_count > 1) {
CWARN("%s: catlog "DFID" crosses index zero\n",
cat_llh->lgh_ctxt->loc_obd->obd_name,
PFID(&cat_llh->lgh_id.lgl_oi.oi_fid));
-
- cd.lpcd_first_idx = llh->llh_cat_idx;
- cd.lpcd_last_idx = 0;
- rc = llog_process_or_fork(env, cat_llh, cat_cb,
- &d, &cd, fork);
- if (rc != 0)
- RETURN(rc);
-
- cd.lpcd_first_idx = 0;
+ /*startcat = 0 is default value for general processing */
+ if ((startcat != LLOG_CAT_FIRST &&
+ startcat >= llh->llh_cat_idx) || !startcat) {
+ /* processing the catalog part at the end */
+ cd.lpcd_first_idx = (startcat ? startcat :
+ llh->llh_cat_idx);
+ cd.lpcd_last_idx = 0;
+ rc = llog_process_or_fork(env, cat_llh, cat_cb,
+ &d, &cd, fork);
+ /* Reset the startcat becasue it has already reached
+ * catalog bottom.
+ */
+ startcat = 0;
+ if (rc != 0)
+ RETURN(rc);
+ }
+ /* processing the catalog part at the begining */
+ cd.lpcd_first_idx = (startcat == LLOG_CAT_FIRST) ? 0 : startcat;
+ /* Note, the processing will stop at the lgh_last_idx value,
+ * and it could be increased during processing. So records
+ * between current lgh_last_idx and lgh_last_idx in future
+ * would left unprocessed.
+ */
cd.lpcd_last_idx = cat_llh->lgh_last_idx;
rc = llog_process_or_fork(env, cat_llh, cat_cb,
&d, &cd, fork);
- } else {
+ } else {
rc = llog_process_or_fork(env, cat_llh, cat_cb,
&d, NULL, fork);
- }
+ }
- RETURN(rc);
+ RETURN(rc);
}
int llog_cat_process(const struct lu_env *env, struct llog_handle *cat_llh,
cfs_fail_val : (LLOG_HDR_BITMAP_SIZE(llh->lgh_hdr) - 1);
/* processing reaches catalog bottom */
if (d->opd_sync_last_catalog_idx == size)
- d->opd_sync_last_catalog_idx = 0;
+ d->opd_sync_last_catalog_idx = LLOG_CAT_FIRST;
else if (wrapped)
/* If catalog is wrapped we can`t predict last index of
* processing because lgh_last_idx could be changed.
* Starting form the next one */
d->opd_sync_last_catalog_idx++;
- } while (rc == 0 && (wrapped || d->opd_sync_last_catalog_idx == 0));
+ } while (rc == 0 && (wrapped ||
+ d->opd_sync_last_catalog_idx == LLOG_CAT_FIRST));
if (rc < 0) {
CERROR("%s: llog process with osp_sync_process_queues "