X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fosd-zfs%2Fosd_scrub.c;h=97cfb2d61b74bcbb55447ed9eeaded6b281e2db5;hb=4cccb265c5c2148cc4d1089fa1bdaa8db606d57e;hp=dd0eddd1646500f86b5c3bf1278ac831628f8031;hpb=6ff16309a006788cc91a7adf561aaebd76dd3b38;p=fs%2Flustre-release.git diff --git a/lustre/osd-zfs/osd_scrub.c b/lustre/osd-zfs/osd_scrub.c index dd0eddd..97cfb2d 100644 --- a/lustre/osd-zfs/osd_scrub.c +++ b/lustre/osd-zfs/osd_scrub.c @@ -332,7 +332,7 @@ static int osd_scrub_prep(const struct lu_env *env, struct osd_device *dev) 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); @@ -367,7 +367,7 @@ static int osd_scrub_post(const struct lu_env *env, struct osd_device *dev, 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)) { @@ -385,8 +385,9 @@ static int osd_scrub_post(const struct lu_env *env, struct osd_device *dev, } 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); @@ -413,7 +414,6 @@ osd_scrub_wakeup(struct lustre_scrub *scrub, struct osd_otable_it *it) 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; @@ -424,15 +424,14 @@ static int osd_scrub_next(const struct lu_env *env, struct osd_device *dev, 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)) { @@ -469,12 +468,9 @@ again: 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); @@ -584,12 +580,12 @@ static int osd_scrub_main(void *args) } 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); @@ -700,7 +696,7 @@ static const struct osd_lf_map osd_lf_maps[] = { /* PENDING */ { - .olm_name = "PENDING", + .olm_name = MDT_ORPHAN_DIR, }, /* ROOT */ @@ -1386,7 +1382,7 @@ int osd_scrub_start(const struct lu_env *env, struct osd_device *dev, 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; @@ -1416,7 +1412,7 @@ int osd_scrub_setup(const struct lu_env *env, struct osd_device *dev) 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)); @@ -1447,6 +1443,7 @@ int osd_scrub_setup(const struct lu_env *env, struct osd_device *dev) 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) { @@ -1455,29 +1452,12 @@ int osd_scrub_setup(const struct lu_env *env, struct osd_device *dev) } 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; @@ -1697,7 +1677,6 @@ static int osd_otable_it_next(const struct lu_env *env, struct dt_it *di) 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; @@ -1719,9 +1698,8 @@ again: } 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);