X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fosd-ldiskfs%2Fosd_scrub.c;h=90f273e62a0b0cb67245d63f463048ff8687e429;hp=bd46b9ec78f1be69e86ff05b375294443b07feaf;hb=23a6e1ed8eec2c07653ed07c35bb109ecb87a5b7;hpb=8e88bbfef5795b3bf9541c8cb5b2dd8a3bb11d9f diff --git a/lustre/osd-ldiskfs/osd_scrub.c b/lustre/osd-ldiskfs/osd_scrub.c index bd46b9e..90f273e 100644 --- a/lustre/osd-ldiskfs/osd_scrub.c +++ b/lustre/osd-ldiskfs/osd_scrub.c @@ -208,7 +208,7 @@ osd_scrub_convert_ff(struct osd_thread_info *info, struct osd_device *dev, if (rc == sizeof(*ff)) { /* 2) delete the old XATTR_NAME_FID */ dquot_initialize(inode); - rc = osd_removexattr(dentry, inode, XATTR_NAME_FID); + rc = ll_vfs_removexattr(dentry, inode, XATTR_NAME_FID); if (rc) GOTO(stop, rc); @@ -339,8 +339,11 @@ iget: GOTO(out, rc = 0); } - if (!scrub->os_partial_scan) + if (!scrub->os_partial_scan) { + spin_lock(&scrub->os_lock); scrub->os_full_speed = 1; + spin_unlock(&scrub->os_lock); + } switch (val) { case SCRUB_NEXT_NOLMA: @@ -367,9 +370,11 @@ iget: GOTO(out, rc = 0); } else { - if (!scrub->os_partial_scan) + if (!scrub->os_partial_scan) { + spin_lock(&scrub->os_lock); scrub->os_full_speed = 1; - + spin_unlock(&scrub->os_lock); + } sf->sf_flags |= SF_INCONSISTENT; /* XXX: If the device is restored from file-level backup, then @@ -474,6 +479,7 @@ static int osd_scrub_prep(const struct lu_env *env, struct osd_device *dev) if (flags & SS_RESET) scrub_file_reset(scrub, dev->od_uuid, 0); + spin_lock(&scrub->os_lock); if (flags & SS_AUTO_FULL) { scrub->os_full_speed = 1; scrub->os_partial_scan = 0; @@ -491,7 +497,6 @@ static int osd_scrub_prep(const struct lu_env *env, struct osd_device *dev) scrub->os_partial_scan = 0; } - spin_lock(&scrub->os_lock); scrub->os_in_prior = 0; scrub->os_waiting = 0; scrub->os_paused = 0; @@ -810,10 +815,10 @@ static int osd_scrub_next(struct osd_thread_info *info, struct osd_device *dev, oii = list_entry(scrub->os_inconsistent_items.next, struct osd_inconsistent_item, oii_list); - spin_unlock(&scrub->os_lock); *oic = &oii->oii_cache; scrub->os_in_prior = 1; + spin_unlock(&scrub->os_lock); return 0; } @@ -897,7 +902,9 @@ static int osd_scrub_exec(struct osd_thread_info *info, struct osd_device *dev, rc = osd_scrub_check_update(info, dev, oic, rc); if (rc != 0) { + spin_lock(&scrub->os_lock); scrub->os_in_prior = 0; + spin_unlock(&scrub->os_lock); return rc; } @@ -910,7 +917,9 @@ static int osd_scrub_exec(struct osd_thread_info *info, struct osd_device *dev, } if (scrub->os_in_prior) { + spin_lock(&scrub->os_lock); scrub->os_in_prior = 0; + spin_unlock(&scrub->os_lock); return 0; } @@ -971,6 +980,7 @@ static void osd_scrub_join(const struct lu_env *env, struct osd_device *dev, LASSERT(!(flags & SS_AUTO_PARTIAL)); down_write(&scrub->os_rwsem); + spin_lock(&scrub->os_lock); scrub->os_in_join = 1; if (flags & SS_SET_FAILOUT) sf->sf_param |= SP_FAILOUT; @@ -997,6 +1007,7 @@ static void osd_scrub_join(const struct lu_env *env, struct osd_device *dev, sf->sf_flags |= SF_AUTO; scrub->os_full_speed = 1; } + spin_unlock(&scrub->os_lock); scrub->os_new_checked = 0; if (sf->sf_pos_last_checkpoint != 0) @@ -1079,7 +1090,7 @@ static int osd_inode_iteration(struct osd_thread_info *info, if (rc == 0) { __u64 used = ksfs->f_files - ksfs->f_ffree; - do_div(used, sf->sf_items_updated_prior); + used = div64_u64(used, sf->sf_items_updated_prior); /* If we hit too much inconsistent OI * mappings during the partial scan, * then scan the device completely. */ @@ -2302,8 +2313,11 @@ osd_ios_ROOT_scan(struct osd_thread_info *info, struct osd_device *dev, * FID directly, instead, the OI scrub will scan the OI structure * and try to re-generate the LMA from the OI mapping. But if the * OI mapping crashed or lost also, then we have to give up under - * double failure cases. */ + * double failure cases. + */ + spin_lock(&scrub->os_lock); scrub->os_convert_igif = 1; + spin_unlock(&scrub->os_lock); child = osd_lookup_one_len_unlocked(dev, dot_lustre_name, dentry, strlen(dot_lustre_name)); if (IS_ERR(child)) { @@ -2553,7 +2567,9 @@ void osd_scrub_stop(struct osd_device *dev) /* od_otable_mutex: prevent curcurrent start/stop */ mutex_lock(&dev->od_otable_mutex); + spin_lock(&scrub->os_lock); scrub->os_paused = 1; + spin_unlock(&scrub->os_lock); scrub_stop(scrub); mutex_unlock(&dev->od_otable_mutex); } @@ -2601,6 +2617,7 @@ int osd_scrub_setup(const struct lu_env *env, struct osd_device *dev) } inode = file_inode(filp); + ldiskfs_set_inode_flag(inode, LDISKFS_INODE_JOURNAL_DATA); if (!dev->od_dt_dev.dd_rdonly) { /* 'What the @fid is' is not imporatant, because the object * has no OI mapping, and only is visible inside the OSD.*/ @@ -2623,7 +2640,7 @@ int osd_scrub_setup(const struct lu_env *env, struct osd_device *dev) RETURN(obj ? PTR_ERR(obj) : -ENOENT); #ifndef HAVE_S_UUID_AS_UUID_T - memcpy(dev->od_uuid.b, sb->s_uuid, UUID_SIZE); + memcpy(dev->od_uuid.b, sb->s_uuid, sizeof(dev->od_uuid)); #else uuid_copy(&dev->od_uuid, &sb->s_uuid); #endif @@ -2752,8 +2769,6 @@ void osd_scrub_cleanup(const struct lu_env *env, struct osd_device *dev) dt_object_put_nocache(env, scrub->os_obj); scrub->os_obj = NULL; } - if (dev->od_oi_table != NULL) - osd_oi_fini(osd_oti_get(env), dev); } /* object table based iteration APIs */ @@ -3047,6 +3062,7 @@ int osd_oii_insert(struct osd_device *dev, struct osd_idmap_cache *oic, oii->oii_cache = *oic; oii->oii_insert = insert; + spin_lock(&lscrub->os_lock); if (lscrub->os_partial_scan) { __u64 now = ktime_get_real_seconds(); @@ -3067,7 +3083,6 @@ int osd_oii_insert(struct osd_device *dev, struct osd_idmap_cache *oic, lscrub->os_full_scrub = 1; } - spin_lock(&lscrub->os_lock); if (unlikely(!thread_is_running(thread))) { spin_unlock(&lscrub->os_lock); OBD_FREE_PTR(oii);