-/* OI_scrub file ops */
-
-static void osd_scrub_file_to_cpu(struct scrub_file *des,
- struct scrub_file *src)
-{
- memcpy(des->sf_uuid, src->sf_uuid, 16);
- des->sf_flags = le64_to_cpu(src->sf_flags);
- des->sf_magic = le32_to_cpu(src->sf_magic);
- des->sf_status = le16_to_cpu(src->sf_status);
- des->sf_param = le16_to_cpu(src->sf_param);
- des->sf_time_last_complete =
- le64_to_cpu(src->sf_time_last_complete);
- des->sf_time_latest_start =
- le64_to_cpu(src->sf_time_latest_start);
- des->sf_time_last_checkpoint =
- le64_to_cpu(src->sf_time_last_checkpoint);
- des->sf_pos_latest_start =
- le64_to_cpu(src->sf_pos_latest_start);
- des->sf_pos_last_checkpoint =
- le64_to_cpu(src->sf_pos_last_checkpoint);
- des->sf_pos_first_inconsistent =
- le64_to_cpu(src->sf_pos_first_inconsistent);
- des->sf_items_checked =
- le64_to_cpu(src->sf_items_checked);
- des->sf_items_updated =
- le64_to_cpu(src->sf_items_updated);
- des->sf_items_failed =
- le64_to_cpu(src->sf_items_failed);
- des->sf_items_updated_prior =
- le64_to_cpu(src->sf_items_updated_prior);
- des->sf_run_time = le32_to_cpu(src->sf_run_time);
- des->sf_success_count = le32_to_cpu(src->sf_success_count);
- des->sf_oi_count = le16_to_cpu(src->sf_oi_count);
- des->sf_internal_flags = le16_to_cpu(src->sf_internal_flags);
- memcpy(des->sf_oi_bitmap, src->sf_oi_bitmap, SCRUB_OI_BITMAP_SIZE);
-}
-
-static void osd_scrub_file_to_le(struct scrub_file *des,
- struct scrub_file *src)
-{
- memcpy(des->sf_uuid, src->sf_uuid, 16);
- des->sf_flags = cpu_to_le64(src->sf_flags);
- des->sf_magic = cpu_to_le32(src->sf_magic);
- des->sf_status = cpu_to_le16(src->sf_status);
- des->sf_param = cpu_to_le16(src->sf_param);
- des->sf_time_last_complete =
- cpu_to_le64(src->sf_time_last_complete);
- des->sf_time_latest_start =
- cpu_to_le64(src->sf_time_latest_start);
- des->sf_time_last_checkpoint =
- cpu_to_le64(src->sf_time_last_checkpoint);
- des->sf_pos_latest_start =
- cpu_to_le64(src->sf_pos_latest_start);
- des->sf_pos_last_checkpoint =
- cpu_to_le64(src->sf_pos_last_checkpoint);
- des->sf_pos_first_inconsistent =
- cpu_to_le64(src->sf_pos_first_inconsistent);
- des->sf_items_checked =
- cpu_to_le64(src->sf_items_checked);
- des->sf_items_updated =
- cpu_to_le64(src->sf_items_updated);
- des->sf_items_failed =
- cpu_to_le64(src->sf_items_failed);
- des->sf_items_updated_prior =
- cpu_to_le64(src->sf_items_updated_prior);
- des->sf_run_time = cpu_to_le32(src->sf_run_time);
- des->sf_success_count = cpu_to_le32(src->sf_success_count);
- des->sf_oi_count = cpu_to_le16(src->sf_oi_count);
- des->sf_internal_flags = cpu_to_le16(src->sf_internal_flags);
- memcpy(des->sf_oi_bitmap, src->sf_oi_bitmap, SCRUB_OI_BITMAP_SIZE);
-}
-
-static void osd_scrub_file_init(struct osd_scrub *scrub, __u8 *uuid)
-{
- struct scrub_file *sf = &scrub->os_file;
-
- memset(sf, 0, sizeof(*sf));
- memcpy(sf->sf_uuid, uuid, 16);
- sf->sf_magic = SCRUB_MAGIC_V1;
- sf->sf_status = SS_INIT;
-}
-
-void osd_scrub_file_reset(struct osd_scrub *scrub, __u8 *uuid, __u64 flags)
-{
- struct scrub_file *sf = &scrub->os_file;
-
- CDEBUG(D_LFSCK, "%.16s: reset OI scrub file, old flags = "
- LPX64", add flags = "LPX64"\n",
- osd_scrub2name(scrub), sf->sf_flags, flags);
-
- memcpy(sf->sf_uuid, uuid, 16);
- sf->sf_status = SS_INIT;
- sf->sf_flags |= flags;
- sf->sf_flags &= ~SF_AUTO;
- sf->sf_run_time = 0;
- sf->sf_time_latest_start = 0;
- sf->sf_time_last_checkpoint = 0;
- sf->sf_pos_latest_start = 0;
- sf->sf_pos_last_checkpoint = 0;
- sf->sf_pos_first_inconsistent = 0;
- sf->sf_items_checked = 0;
- sf->sf_items_updated = 0;
- sf->sf_items_failed = 0;
- if (!scrub->os_in_join)
- sf->sf_items_updated_prior = 0;
-
- sf->sf_items_noscrub = 0;
- sf->sf_items_igif = 0;
-}
-
-static int osd_scrub_file_load(struct osd_scrub *scrub)
-{
- loff_t pos = 0;
- int len = sizeof(scrub->os_file_disk);
- int rc;
-
- rc = osd_ldiskfs_read(scrub->os_inode, &scrub->os_file_disk, len, &pos);
- if (rc == len) {
- struct scrub_file *sf = &scrub->os_file;
-
- osd_scrub_file_to_cpu(sf, &scrub->os_file_disk);
- if (sf->sf_magic != SCRUB_MAGIC_V1) {
- CDEBUG(D_LFSCK, "%.16s: invalid scrub magic "
- "0x%x != 0x%x\n", osd_scrub2name(scrub),
- sf->sf_magic, SCRUB_MAGIC_V1);
- /* Process it as new scrub file. */
- rc = -ENOENT;
- } else {
- rc = 0;
- }
- } else if (rc != 0) {
- CDEBUG(D_LFSCK, "%.16s: fail to load scrub file, "
- "expected = %d: rc = %d\n",
- osd_scrub2name(scrub), len, rc);
- if (rc > 0)
- rc = -EFAULT;
- } else {
- /* return -ENOENT for empty scrub file case. */
- rc = -ENOENT;
- }
-
- return rc;
-}
-
-int osd_scrub_file_store(struct osd_scrub *scrub)
-{
- struct osd_device *dev;
- handle_t *jh;
- loff_t pos = 0;
- int len = sizeof(scrub->os_file_disk);
- int credits;
- int rc;
-
- dev = container_of0(scrub, struct osd_device, od_scrub);
- credits = osd_dto_credits_noquota[DTO_WRITE_BASE] +
- osd_dto_credits_noquota[DTO_WRITE_BLOCK];
- jh = osd_journal_start_sb(osd_sb(dev), LDISKFS_HT_MISC, credits);
- if (IS_ERR(jh)) {
- rc = PTR_ERR(jh);
- CDEBUG(D_LFSCK, "%.16s: fail to start trans for scrub store: "
- "rc = %d\n", osd_scrub2name(scrub), rc);
- return rc;
- }
-
- osd_scrub_file_to_le(&scrub->os_file_disk, &scrub->os_file);
- rc = osd_ldiskfs_write_record(scrub->os_inode, &scrub->os_file_disk,
- len, 0, &pos, jh);
- ldiskfs_journal_stop(jh);
- if (rc != 0)
- CDEBUG(D_LFSCK, "%.16s: fail to store scrub file, "
- "expected = %d: rc = %d\n",
- osd_scrub2name(scrub), len, rc);
-
- scrub->os_time_last_checkpoint = cfs_time_current();
- scrub->os_time_next_checkpoint = scrub->os_time_last_checkpoint +
- cfs_time_seconds(SCRUB_CHECKPOINT_INTERVAL);
- return rc;
-}
-