Patch "block: get rid of blk_integrity_revalidate()" has been added to the 4.4-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
block: get rid of blk_integrity_revalidate()
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
block-get-rid-of-blk_integrity_revalidate.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
19b7ccf8651df09d274671b53039c672a52ad84dMon Sep 17 00:00:00 2001
From: Ilya Dryomov <[email protected]>
Date: Tue, 18 Apr 2017 18:43:20 +0200
Subject: block: get rid of blk_integrity_revalidate()
From: Ilya Dryomov <[email protected]>
commit 19b7ccf8651df09d274671b53039c672a52ad84d upstream.
Commit 25520d55cdb6 ("block: Inline blk_integrity in struct gendisk") introduced blk_integrity_revalidate(), which seems to assume ownership of the stable pages flag and unilaterally clears it if no blk_integrity profile is registered:
if (bi->profile)
disk->queue->backing_dev_info->capabilities |=
BDI_CAP_STABLE_WRITES;
else
disk->queue->backing_dev_info->capabilities &=
~BDI_CAP_STABLE_WRITES;It's called from revalidate_disk() and rescan_partitions(), making it impossible to enable stable pages for drivers that support partitions and don't use blk_integrity: while the call in revalidate_disk() can be trivially worked around (see zram, which doesn't support partitions and hence gets away with zram_revalidate_disk()), rescan_partitions() can be triggered from userspace at any time. This breaks rbd, where the ceph messenger is responsible for generating/verifying CRCs.
Since blk_integrity_{un,}register() "must" be used for (un)registering the integrity profile with the block layer, move BDI_CAP_STABLE_WRITES setting there. This way drivers that call blk_integrity_register() and use integrity infrastructure won't interfere with drivers that don't but still want stable pages.
--- block/blk-integrity.c | 19 ++----------------- block/partition-generic.c | 1 - fs/block_dev.c | 1 - include/linux/genhd.h | 2 -- 4 files changed, 2 insertions(+), 21 deletions(-)
block/blk-integrity.c +2 -17
@@ -417,7 +417,7 @@ void blk_integrity_register(struct gendi bi->tuple_size = template->tuple_size; bi->tag_size = template->tag_size; -blk_integrity_revalidate (disk); + disk->queue->backing_dev_info.capabilities |=BDI_CAP_STABLE_WRITES ; }EXPORT_SYMBOL (blk_integrity_register);
@@ -430,26 +430,11 @@ EXPORT_SYMBOL(blk_integrity_register);*/ void blk_integrity_unregister (struct gendisk *disk) { -blk_integrity_revalidate (disk); + disk->queue->backing_dev_info.capabilities &= ~BDI_CAP_STABLE_WRITES ;memset (&disk->queue->integrity,0 ,sizeof (struct blk_integrity )); }EXPORT_SYMBOL (blk_integrity_unregister); -void blk_integrity_revalidate (struct gendisk *disk) -{ -struct blk_integrity *bi = &disk->queue->integrity; - -if (!(disk->flags &GENHD_FL_UP )) -return ; - -if (bi->profile) - disk->queue->backing_dev_info.capabilities |= -BDI_CAP_STABLE_WRITES ; -else - disk->queue->backing_dev_info.capabilities &= - ~BDI_CAP_STABLE_WRITES ; -} -void blk_integrity_add (struct gendisk *disk) { if (kobject_init_and_add(&disk->integrity_kobj, &integrity_ktype,
block/partition-generic.c +0 -1
@@ -435,7 +435,6 @@ rescan:if (disk->fops->revalidate_disk) disk->fops->revalidate_disk (disk); -blk_integrity_revalidate (disk);check_disk_size_change (disk, bdev); bdev->bd_invalidated =0 ;if (!get_capacity (disk) || !(state =check_partition (disk, bdev)))
fs/block_dev.c +0 -1
@@ -1098,7 +1098,6 @@ int revalidate_disk(struct gendisk *diskif (disk->fops->revalidate_disk) ret = disk->fops->revalidate_disk (disk); -blk_integrity_revalidate (disk); bdev =bdget_disk (disk,0 );if (!bdev)return ret;
include/linux/genhd.h +0 -2
@@ -742,11 +742,9 @@ static inline void part_nr_sects_write(s#if defined(CONFIG_BLK_DEV_INTEGRITY )extern void blk_integrity_add (struct gendisk *);extern void blk_integrity_del (struct gendisk *); -extern void blk_integrity_revalidate (struct gendisk *);#else /* CONFIG_BLK_DEV_INTEGRITY */ static inline void blk_integrity_add (struct gendisk *disk) { }static inline void blk_integrity_del (struct gendisk *disk) { } -static inline void blk_integrity_revalidate (struct gendisk *disk) { }#endif /* CONFIG_BLK_DEV_INTEGRITY */ #else /* CONFIG_BLOCK */
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/block-get-rid-of-blk_integrity_revalidate.patch