scrub->os_pos_current = sf->sf_pos_latest_start;
sf->sf_status = SS_SCANNING;
- sf->sf_time_latest_start = cfs_time_current_sec();
+ sf->sf_time_latest_start = ktime_get_real_seconds();
sf->sf_time_last_checkpoint = sf->sf_time_latest_start;
sf->sf_pos_last_checkpoint = sf->sf_pos_latest_start - 1;
rc = scrub_file_store(env, scrub);
scrub->os_new_checked = 0;
sf->sf_pos_last_checkpoint = scrub->os_pos_current;
}
- sf->sf_time_last_checkpoint = cfs_time_current_sec();
+ sf->sf_time_last_checkpoint = ktime_get_real_seconds();
if (result > 0) {
sf->sf_status = SS_COMPLETED;
if (!(sf->sf_param & SP_DRYRUN)) {
} else {
sf->sf_status = SS_FAILED;
}
- sf->sf_run_time += cfs_duration_sec(cfs_time_current() + HALF_SEC -
- scrub->os_time_last_checkpoint);
+ sf->sf_run_time += ktime_get_seconds() -
+ scrub->os_time_last_checkpoint;
+
rc = scrub_file_store(env, scrub);
up_write(&scrub->os_rwsem);
static int osd_scrub_next(const struct lu_env *env, struct osd_device *dev,
struct lu_fid *fid, uint64_t *oid)
{
- struct l_wait_info lwi = { 0 };
struct lustre_scrub *scrub = &dev->od_scrub;
struct ptlrpc_thread *thread = &scrub->os_thread;
struct osd_otable_it *it = dev->od_otable_it;
ENTRY;
if (OBD_FAIL_CHECK(OBD_FAIL_OSD_SCRUB_DELAY) && cfs_fail_val > 0) {
- lwi = LWI_TIMEOUT(cfs_time_seconds(cfs_fail_val), NULL, NULL);
- if (likely(lwi.lwi_timeout > 0)) {
- l_wait_event(thread->t_ctl_waitq,
- !list_empty(&scrub->os_inconsistent_items) ||
- !thread_is_running(thread),
- &lwi);
- if (unlikely(!thread_is_running(thread)))
- RETURN(SCRUB_NEXT_EXIT);
- }
+ wait_event_idle_timeout(
+ thread->t_ctl_waitq,
+ !list_empty(&scrub->os_inconsistent_items) ||
+ !thread_is_running(thread),
+ cfs_time_seconds(cfs_fail_val));
+
+ if (unlikely(!thread_is_running(thread)))
+ RETURN(SCRUB_NEXT_EXIT);
}
if (OBD_FAIL_CHECK(OBD_FAIL_OSD_SCRUB_CRASH)) {
spin_unlock(&scrub->os_lock);
}
- if (!scrub->os_full_speed && !osd_scrub_has_window(it)) {
- memset(&lwi, 0, sizeof(lwi));
- l_wait_event(thread->t_ctl_waitq,
- osd_scrub_wakeup(scrub, it),
- &lwi);
- }
+ if (!scrub->os_full_speed && !osd_scrub_has_window(it))
+ wait_event_idle(thread->t_ctl_waitq,
+ osd_scrub_wakeup(scrub, it));
if (unlikely(!thread_is_running(thread)))
GOTO(out, rc = SCRUB_NEXT_EXIT);
}
if (!scrub->os_full_speed) {
- struct l_wait_info lwi = { 0 };
struct osd_otable_it *it = dev->od_otable_it;
- l_wait_event(thread->t_ctl_waitq,
- it->ooi_user_ready || !thread_is_running(thread),
- &lwi);
+ wait_event_idle(thread->t_ctl_waitq,
+ it->ooi_user_ready ||
+ !thread_is_running(thread));
+
if (unlikely(!thread_is_running(thread)))
GOTO(post, rc = 0);
/* PENDING */
{
- .olm_name = "PENDING",
+ .olm_name = MDT_ORPHAN_DIR,
},
/* ROOT */
RETURN(rc == -EALREADY ? 0 : rc);
}
-static void osd_scrub_stop(struct osd_device *dev)
+void osd_scrub_stop(struct osd_device *dev)
{
struct lustre_scrub *scrub = &dev->od_scrub;
ENTRY;
bool dirty = false;
ENTRY;
- memcpy(dev->od_uuid,
+ memcpy(dev->od_uuid.b,
&dsl_dataset_phys(dev->od_os->os_dsl_dataset)->ds_guid,
sizeof(dsl_dataset_phys(dev->od_os->os_dsl_dataset)->ds_guid));
memset(&dev->od_scrub, 0, sizeof(struct lustre_scrub));
if (IS_ERR_OR_NULL(obj))
RETURN(obj ? PTR_ERR(obj) : -ENOENT);
+ obj->do_body_ops = &osd_body_scrub_ops;
scrub->os_obj = obj;
rc = scrub_file_load(env, scrub);
if (rc == -ENOENT || rc == -EFAULT) {
} else if (rc < 0) {
GOTO(cleanup_obj, rc);
} else {
- if (memcmp(sf->sf_uuid, dev->od_uuid, 16) != 0) {
- struct obd_uuid *old_uuid;
- struct obd_uuid *new_uuid;
-
- OBD_ALLOC_PTR(old_uuid);
- OBD_ALLOC_PTR(new_uuid);
- if (!old_uuid || !new_uuid) {
- CERROR("%s: UUID has been changed, but"
- "failed to allocate RAM for report\n",
- osd_name(dev));
- } else {
- class_uuid_unparse(sf->sf_uuid, old_uuid);
- class_uuid_unparse(dev->od_uuid, new_uuid);
- CDEBUG(D_LFSCK, "%s: UUID has been changed "
- "from %s to %s\n", osd_name(dev),
- old_uuid->uuid, new_uuid->uuid);
- }
+ if (!uuid_equal(&sf->sf_uuid, &dev->od_uuid)) {
+ CDEBUG(D_LFSCK,
+ "%s: UUID has been changed from %pU to %pU\n",
+ osd_name(dev), &sf->sf_uuid, &dev->od_uuid);
scrub_file_reset(scrub, dev->od_uuid, SF_INCONSISTENT);
dirty = true;
- if (old_uuid)
- OBD_FREE_PTR(old_uuid);
- if (new_uuid)
- OBD_FREE_PTR(new_uuid);
} else if (sf->sf_status == SS_SCANNING) {
sf->sf_status = SS_CRASHED;
dirty = true;
struct osd_device *dev = it->ooi_dev;
struct lustre_scrub *scrub = &dev->od_scrub;
struct ptlrpc_thread *thread = &scrub->os_thread;
- struct l_wait_info lwi = { 0 };
struct lustre_mdt_attrs *lma = NULL;
nvlist_t *nvbuf = NULL;
int size = 0;
}
if (it->ooi_pos >= scrub->os_pos_current)
- l_wait_event(thread->t_ctl_waitq,
- osd_otable_it_wakeup(scrub, it),
- &lwi);
+ wait_event_idle(thread->t_ctl_waitq,
+ osd_otable_it_wakeup(scrub, it));
if (!thread_is_running(thread) && !it->ooi_used_outside)
GOTO(out, rc = 1);