/** * Invalidate lsid inside ring buffer. */ bool invalidate_lsid(struct walb_dev *wdev, u64 lsid) { struct sector_data *zero_sector; struct walb_super_sector *super; u64 off; bool ret; ASSERT(lsid != INVALID_LSID); zero_sector = sector_alloc( wdev->physical_bs, GFP_KERNEL | __GFP_ZERO); if (!zero_sector) { LOGe("sector allocation failed.\n"); return false; } spin_lock(&wdev->lsuper0_lock); super = get_super_sector(wdev->lsuper0); off = get_offset_of_lsid_2(super, lsid); spin_unlock(&wdev->lsuper0_lock); ret = sector_io(WRITE, wdev->ldev, off, zero_sector); if (!ret) { LOGe("sector write failed.\n"); iocore_set_readonly(wdev); } sector_free(zero_sector); return ret; }
/** * Check logpack of the given lsid exists. * * @lsid lsid to check. * * @return Non-zero if valid, or 0. */ int walb_check_lsid_valid(struct walb_dev *wdev, u64 lsid) { struct sector_data *sect; struct walb_logpack_header *logh; u64 off; ASSERT(wdev); sect = sector_alloc(wdev->physical_bs, GFP_NOIO); if (!sect) { LOGe("walb_check_lsid_valid: alloc sector failed.\n"); goto error0; } ASSERT(is_same_size_sector(sect, wdev->lsuper0)); logh = get_logpack_header(sect); spin_lock(&wdev->lsuper0_lock); off = get_offset_of_lsid_2(get_super_sector(wdev->lsuper0), lsid); spin_unlock(&wdev->lsuper0_lock); if (!sector_io(READ, wdev->ldev, off, sect)) { LOGe("walb_check_lsid_valid: read sector failed.\n"); goto error1; } /* Check valid logpack header. */ if (!is_valid_logpack_header_with_checksum( logh, wdev->physical_bs, wdev->log_checksum_salt)) { goto error1; } /* Check lsid. */ if (logh->logpack_lsid != lsid) { goto error1; } sector_free(sect); return 1; error1: sector_free(sect); error0: return 0; }
static int sector_read(struct sbd_context *st, int sector, void *data) { return sector_io(st, sector, data, 0); }
static int sector_write(struct sbd_context *st, int sector, void *data) { return sector_io(st, sector, data, 1); }