return rc;
}
-static int
-osd_consistency_check(const struct lu_env *env, struct osd_device *osd,
- struct osd_object *obj, const struct lu_fid *fid,
- uint64_t oid, bool is_dir)
+static void
+osd_zfs_consistency_check(const struct lu_env *env, struct osd_device *osd,
+ struct osd_object *obj, const struct lu_fid *fid,
+ u64 oid, bool is_dir)
{
struct lustre_scrub *scrub = &osd->od_scrub;
dnode_t *dn = NULL;
int once = 0;
bool insert;
int rc;
- ENTRY;
-
- if (!fid_is_norm(fid) && !fid_is_igif(fid))
- RETURN(0);
+ ENTRY;
/* oid == ZFS_NO_OBJECT must be for lookup ".." case */
if (oid == ZFS_NO_OBJECT) {
rc = osd_sa_handle_get(obj);
if (rc)
- RETURN(rc);
+ return;
rc = -sa_lookup(obj->oo_sa_hdl, SA_ZPL_PARENT(osd), &oid, 8);
if (rc)
- RETURN(rc);
- }
-
- if (scrub->os_running) {
- if (scrub->os_pos_current > oid)
- RETURN(0);
- } else if (osd->od_auto_scrub_interval == AS_NEVER) {
- RETURN(0);
- } else {
- if (ktime_get_real_seconds() <
- scrub->os_file.sf_time_last_complete +
- osd->od_auto_scrub_interval)
- RETURN(0);
+ return;
}
+ if (!scrub_needs_check(&osd->od_scrub, fid, oid))
+ return;
again:
rc = osd_fid_lookup(env, osd, fid, &oid2);
if (rc == -ENOENT) {
rc = __osd_obj2dnode(osd->od_os, oid, &dn);
/* The object has been removed (by race maybe). */
if (rc)
- RETURN(rc = (rc == -EEXIST ? -ENOENT : rc));
+ return;
goto trigger;
} else if (rc || oid == oid2) {
rc = __osd_obj2dnode(osd->od_os, oid, &dn);
/* The object has been removed (by race maybe). */
if (rc)
- RETURN(rc = (rc == -EEXIST ? -ENOENT : rc));
+ return;
}
rc = osd_oii_insert(env, osd, fid, oid, insert);
GOTO(out, rc);
}
- if (osd->od_auto_scrub_interval != AS_NEVER && ++once == 1) {
+ if (osd->od_scrub.os_auto_scrub_interval != AS_NEVER && ++once == 1) {
rc = osd_scrub_start(env, osd, SS_AUTO_FULL |
SS_CLEAR_DRYRUN | SS_CLEAR_FAILOUT);
CDEBUG_LIMIT(D_LFSCK | D_CONSOLE | D_WARNING,
out:
if (dn)
osd_dnode_rele(dn);
-
- return rc;
}
static int osd_dir_lookup(const struct lu_env *env, struct dt_object *dt,
up_read(&obj->oo_guard);
out:
if (!rc && !osd_remote_fid(env, osd, fid)) {
+ bool is_dir = S_ISDIR(DTTOIF(oti->oti_zde.lzd_reg.zde_type));
+
/*
* this should ask the scrubber to check OI given
* the mapping we just found in the dir entry.
* from the layers above, including LFSCK which
* is supposed to fix dangling entries.
*/
- osd_consistency_check(env, osd, obj, fid, oid,
- S_ISDIR(DTTOIF(oti->oti_zde.lzd_reg.zde_type)));
+ osd_zfs_consistency_check(env, osd, obj, fid, oid, is_dir);
}
return rc == 0 ? 1 : (rc == -ENOENT ? -ENODATA : rc);