#define PFID_STRIPE_COUNT_MASK ((1 << PFID_STRIPE_IDX_BITS) - 1)
#define SCRUB_MAGIC_V1 0x4C5FD252
+#define SCRUB_MAGIC_V2 0x4C5FE253
#define SCRUB_CHECKPOINT_INTERVAL 60
#define SCRUB_WINDOW_SIZE 1024
memset(sf, 0, sizeof(*sf));
uuid_copy(&sf->sf_uuid, &uuid);
- sf->sf_magic = SCRUB_MAGIC_V1;
+ sf->sf_magic = SCRUB_MAGIC_V2;
sf->sf_status = SS_INIT;
}
EXPORT_SYMBOL(scrub_file_init);
scrub->os_name, sf->sf_flags, flags);
uuid_copy(&sf->sf_uuid, &uuid);
+ sf->sf_magic = SCRUB_MAGIC_V2;
sf->sf_status = SS_INIT;
sf->sf_flags |= flags;
sf->sf_flags &= ~SF_AUTO;
}
scrub_file_to_cpu(sf, &scrub->os_file_disk);
- if (sf->sf_magic != SCRUB_MAGIC_V1) {
- CDEBUG(D_LFSCK, "%s: invalid scrub magic 0x%x != 0x%x\n",
- scrub->os_name, sf->sf_magic, SCRUB_MAGIC_V1);
+ if (sf->sf_magic == SCRUB_MAGIC_V1) {
+ CWARN("%s: reset scrub OI count for format change (LU-16655)\n",
+ scrub->os_name);
+ sf->sf_oi_count = 0;
+ } else if (sf->sf_magic != SCRUB_MAGIC_V2) {
+ CDEBUG(D_LFSCK, "%s: invalid scrub magic %#x, should be %#x\n",
+ scrub->os_name, sf->sf_magic, SCRUB_MAGIC_V2);
return -EFAULT;
}
int rc;
ENTRY;
- if (unlikely(sf->sf_oi_count & (sf->sf_oi_count - 1)) != 0) {
- LCONSOLE_WARN("%s: Invalid OI count in scrub file %d\n",
+ if (unlikely((sf->sf_oi_count & (sf->sf_oi_count - 1)) != 0 ||
+ sf->sf_oi_count > OSD_OI_FID_NR_MAX)) {
+ LCONSOLE_WARN("%s: invalid OI count %u in scrub file, reset it\n",
osd_dev2name(osd), sf->sf_oi_count);
sf->sf_oi_count = 0;
}
dirty = true;
}
- if ((sf->sf_oi_count & (sf->sf_oi_count - 1)) != 0) {
- LCONSOLE_WARN("%s: invalid oi count %d, set it to %d\n",
+ if (unlikely((sf->sf_oi_count & (sf->sf_oi_count - 1)) != 0 ||
+ sf->sf_oi_count > OSD_OI_FID_NR_MAX)) {
+ LCONSOLE_WARN("%s: invalid OI count %u, reset to %u\n",
osd_name(dev), sf->sf_oi_count,
osd_oi_count);
sf->sf_oi_count = osd_oi_count;