Commit 7a5b96b4 authored by Mikulas Patocka's avatar Mikulas Patocka Committed by Mike Snitzer
Browse files

dm integrity: use discard support when recalculating



If we have discard support we don't have to recalculate hash - we can
just fill the metadata with the discard pattern.

Signed-off-by: default avatarMikulas Patocka <mpatocka@redhat.com>
Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
parent b1a2b933
Loading
Loading
Loading
Loading
+33 −24
Original line number Diff line number Diff line
@@ -2689,6 +2689,7 @@ static void integrity_recalc(struct work_struct *w)
	if (unlikely(dm_integrity_failed(ic)))
		goto err;

	if (!ic->discard) {
		io_req.bi_op = REQ_OP_READ;
		io_req.bi_op_flags = 0;
		io_req.mem.type = DM_IO_VMA;
@@ -2710,6 +2711,9 @@ static void integrity_recalc(struct work_struct *w)
			integrity_sector_checksum(ic, logical_sector + i, ic->recalc_buffer + (i << SECTOR_SHIFT), t);
			t += ic->tag_size;
		}
	} else {
		t = ic->recalc_tags + (n_sectors >> ic->sb->log2_sectors_per_block) * ic->tag_size;
	}

	metadata_block = get_metadata_sector_and_offset(ic, area, offset, &metadata_offset);

@@ -4364,12 +4368,14 @@ static int dm_integrity_ctr(struct dm_target *ti, unsigned argc, char **argv)
			goto bad;
		}
		INIT_WORK(&ic->recalc_work, integrity_recalc);
		if (!ic->discard) {
			ic->recalc_buffer = vmalloc(RECALC_SECTORS << SECTOR_SHIFT);
			if (!ic->recalc_buffer) {
				ti->error = "Cannot allocate buffer for recalculating";
				r = -ENOMEM;
				goto bad;
			}
		}
		ic->recalc_tags = kvmalloc_array(RECALC_SECTORS >> ic->sb->log2_sectors_per_block,
						 ic->tag_size, GFP_KERNEL);
		if (!ic->recalc_tags) {
@@ -4377,6 +4383,9 @@ static int dm_integrity_ctr(struct dm_target *ti, unsigned argc, char **argv)
			r = -ENOMEM;
			goto bad;
		}
		if (ic->discard)
			memset(ic->recalc_tags, DISCARD_FILLER,
			       (RECALC_SECTORS >> ic->sb->log2_sectors_per_block) * ic->tag_size);
	} else {
		if (ic->sb->flags & cpu_to_le32(SB_FLAG_RECALCULATING)) {
			ti->error = "Recalculate can only be specified with internal_hash";
@@ -4570,7 +4579,7 @@ static void dm_integrity_dtr(struct dm_target *ti)

static struct target_type integrity_target = {
	.name			= "integrity",
	.version		= {1, 8, 0},
	.version		= {1, 9, 0},
	.module			= THIS_MODULE,
	.features		= DM_TARGET_SINGLETON | DM_TARGET_INTEGRITY,
	.ctr			= dm_integrity_ctr,