GOTO(out, rc);
}
+ spin_lock(&scrub->os_lock);
scrub->os_full_speed = 1;
+ spin_unlock(&scrub->os_lock);
+
sf->sf_flags |= SF_INCONSISTENT;
} else if (oid == oid2) {
GOTO(out, rc = 0);
}
update:
+ spin_lock(&scrub->os_lock);
scrub->os_full_speed = 1;
+ spin_unlock(&scrub->os_lock);
sf->sf_flags |= SF_INCONSISTENT;
}
if (flags & SS_RESET)
scrub_file_reset(scrub, dev->od_uuid, 0);
+ spin_lock(&scrub->os_lock);
scrub->os_partial_scan = 0;
if (flags & SS_AUTO_FULL) {
scrub->os_full_speed = 1;
scrub->os_full_speed = 0;
}
- spin_lock(&scrub->os_lock);
scrub->os_in_prior = 0;
scrub->os_waiting = 0;
scrub->os_paused = 0;
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);
}
} else {
+ spin_lock(&scrub->os_lock);
scrub->os_in_prior = 0;
+ spin_unlock(&scrub->os_lock);
}
if (rc)
sizeof(*zde) / 8, (void *)zde);
if (rc) {
if (rc != -ENOENT)
- CWARN("%s: initial OI scrub failed to find"
- "the entry %s under .lustre: rc = %d\n",
+ CWARN("%s: initial OI scrub failed to find the entry %s under .lustre: rc = %d\n",
osd_name(dev), map->olm_name, rc);
else if (!fid_is_zero(&map->olm_fid))
/* Try to remove the stale OI mapping. */
/* od_otable_sem: prevent concurrent start/stop */
down(&dev->od_otable_sem);
+ spin_lock(&scrub->os_lock);
scrub->os_paused = 1;
+ spin_unlock(&scrub->os_lock);
scrub_stop(scrub);
up(&dev->od_otable_sem);
struct ptlrpc_thread *thread = &scrub->os_thread;
struct lustre_mdt_attrs *lma = NULL;
nvlist_t *nvbuf = NULL;
- int size = 0;
- int rc;
+ int rc, size = 0;
+ bool locked;
ENTRY;
LASSERT(it->ooi_user_ready);
rc = __osd_xattr_load_by_oid(dev, it->ooi_pos, &nvbuf);
- if (!scrub->os_full_speed)
+ locked = false;
+ if (!scrub->os_full_speed) {
spin_lock(&scrub->os_lock);
+ locked = true;
+ }
it->ooi_prefetched--;
if (!scrub->os_full_speed) {
if (scrub->os_waiting) {
scrub->os_waiting = 0;
wake_up_all(&thread->t_ctl_waitq);
}
- spin_unlock(&scrub->os_lock);
}
+ if (locked)
+ spin_unlock(&scrub->os_lock);
if (rc == -ENOENT || rc == -EEXIST || rc == -ENODATA)
goto again;