Disable partition scan
Subsystems (4)
PATCH 1/1 Disable partition scan
Hi all,
for some setups (eg dmraid or multipathing) the in-kernel partition scan is pointless; the (block) partitions won't be used anywhere. Instead the system will be using kpartx-generated device-mapper devices. Worse, on some setups (RAID0 dmraid or active/passive multipath devices) the in-kernel partition scan will generate plenty of I/O errors as the partitions table might not be accessible or invalid for this device.
This patch implements a new kernel command-line option 'no_partition_scan' which will switch off the partition scan globally. The partition scan can be re-enabled for individual devices by echoing any positive number smaller than the number of minors into/sys/class/block/XXX/range
and rescanning the device.
Please apply.
Cheers,
Hannes
Signature · 4 lines
Dr. Hannes Reinecke zSeries & Storage [email protected] +49 911 74053 688 SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: Markus Rex, HRB 16746 (AG Nürnberg)
Disable partition scan
For some setups (multipath or dmraid) the in-kernel partition scan is pointless as the (block) partitions won't be used anywhere. Worse, it might trigger I/O errors as the partition table might not be accessible (eg for the passive path of a multipath device) or even invalid (eg for RAID0 dmraid).
This patch allows to switch off the in-kernel partition scan by adding 'no_partition_scan' to the kernel commandline. Partitions scan can be allowed for individual disk by echoing a positive number into /sys/block/XXX/range and rescan the disk.
block/genhd.c +36 -2
@@ -173,6 +173,18 @@ static int exact_lock(dev_t devt, void *data)return 0 ; } +static int __read_mostly no_partition_scan; + +static int __init no_partition_scan_setup (char *str) +{ + no_partition_scan =1 ; +printk (KERN_INFO "genhd: omit partition scan.\n" ); + +return 1 ; +} + +__setup ("no_partition_scan" , no_partition_scan_setup); +/** * add_disk - add partitioning information to kernel list * @disk: per-device partitioning information
@@ -186,6 +198,8 @@ void add_disk(struct gendisk *disk)int retval; disk->flags |=GENHD_FL_UP ; +if (no_partition_scan) + disk->flags |=GENHD_FL_NO_PARTITION_SCAN ;blk_register_region (MKDEV (disk->major, disk->first_minor), disk->minors,NULL , exact_match, exact_lock, disk);register_disk (disk);
@@ -419,7 +433,27 @@ static ssize_t disk_range_show(struct device *dev, {struct gendisk *disk =dev_to_disk (dev); -return sprintf (buf,"%d\n" , disk->minors); +return sprintf (buf,"%d\n" , + (disk->flags &GENHD_FL_NO_PARTITION_SCAN ?0 : disk->minors)); +} + +static ssize_t disk_range_store (struct device *dev, +struct device_attribute *attr, +const char *buf,size_t count) +{ +struct gendisk *disk =dev_to_disk (dev); +int i; + +if (count >0 &&sscanf (buf,"%d" , &i) >0 ) { +if (i ==0 ) + disk->flags |=GENHD_FL_NO_PARTITION_SCAN ; +else if (i <= disk->minors) + disk->flags &= ~GENHD_FL_NO_PARTITION_SCAN ; +else + count = -EINVAL ; + } + +return count; } static ssize_t disk_removable_show(struct device *dev,
@@ -509,7 +543,7 @@ static ssize_t disk_fail_store(struct device *dev,#endif -static DEVICE_ATTR(range, S_IRUGO, disk_range_show, NULL); +static DEVICE_ATTR(range, S_IRUGO|S_IWUSR, disk_range_show, disk_range_store); static DEVICE_ATTR(removable, S_IRUGO, disk_removable_show, NULL); static DEVICE_ATTR(ro, S_IRUGO, disk_ro_show, NULL); static DEVICE_ATTR(size, S_IRUGO, disk_size_show, NULL);
block/scsi_ioctl.c +0 -0
drivers/block/virtio_blk.c +19 -12
@@ -72,7 +72,7 @@ static void blk_done(struct virtqueue *vq)static bool do_req (struct request_queue *q,struct virtio_blk *vblk,struct request *req) { -unsigned long num, out, in; +unsigned long num, out =1 , in =1 ;struct virtblk_req *vbr; vbr =mempool_alloc (vblk->pool,GFP_ATOMIC );
@@ -100,19 +100,26 @@ static bool do_req(struct request_queue *q, struct virtio_blk *vblk,/* This init could be done at vblk creation time */ sg_init_table (vblk->sg,VIRTIO_MAX_SG );sg_set_buf (&vblk->sg[0 ], &vbr->out_hdr,sizeof (vbr->out_hdr)); - num =blk_rq_map_sg (q, vbr->req, vblk->sg+1 ); -sg_set_buf (&vblk->sg[num+1 ], &vbr->status,sizeof (vbr->status)); - -if (rq_data_dir (vbr->req) ==WRITE ) { - vbr->out_hdr.type |=VIRTIO_BLK_T_OUT ; - out =1 + num; - in =1 ; - }else { - vbr->out_hdr.type |=VIRTIO_BLK_T_IN ; - out =1 ; - in =1 + num; +if (blk_pc_request (vbr->req)) { +sg_set_buf (&vblk->sg[out], &vbr->req->cmd, vbr->req->cmd_len); + out++; + } + num =blk_rq_map_sg (q, vbr->req, vblk->sg+out); +sg_set_buf (&vblk->sg[num+out], &vbr->status,sizeof (vbr->status)); +if (blk_pc_request (vbr->req)) { +sg_set_buf (&vblk->sg[num+out+1 ], &vbr->req->sense,96 ); + in++; } +if (vbr->req->data_len) { +if (rq_data_dir (vbr->req) ==WRITE ) { + vbr->out_hdr.type |=VIRTIO_BLK_T_OUT ; + out += num; + }else { + vbr->out_hdr.type |=VIRTIO_BLK_T_IN ; + in += num; + } + }if (vblk->vq->vq_ops->add_buf (vblk->vq, vblk->sg, out, in, vbr)) {mempool_free (vbr, vblk->pool);return false;
drivers/scsi/device_handler/scsi_dh_alua.c +0 -0
fs/partitions/check.c +2 -0
@@ -485,6 +485,8 @@ int rescan_partitions(struct gendisk *disk, struct block_device *bdev)delete_partition (disk, p);if (disk->fops->revalidate_disk) disk->fops->revalidate_disk (disk); +if (disk->flags &GENHD_FL_NO_PARTITION_SCAN ) +return 0 ;if (!get_capacity (disk) || !(state =check_partition (disk, bdev)))return 0 ;if (IS_ERR (state))/* I/O error reading the partition table */
include/linux/genhd.h +1 -0
@@ -109,6 +109,7 @@ struct hd_struct {#define GENHD_FL_UP 16#define GENHD_FL_SUPPRESS_PARTITION_INFO 32#define GENHD_FL_FAIL 64 +#define GENHD_FL_NO_PARTITION_SCAN 128#define BLK_SCSI_MAX_CMDS (256)#define BLK_SCSI_CMD_PER_LONG (BLK_SCSI_MAX_CMDS / (sizeof(long) * 8))
include/linux/virtio_blk.h +0 -0
Hi all again,
Quoted 15 lines · Hannes Reinecke
Hi all,
for some setups (eg dmraid or multipathing) the in-kernel partition scan is pointless; the (block) partitions won't be used anywhere. Instead the system will be using kpartx-generated device-mapper devices. Worse, on some setups (RAID0 dmraid or active/passive multipath devices) the in-kernel partition scan will generate plenty of I/O errors as the partitions table might not be accessible or invalid for this device.
This patch implements a new kernel command-line option '
no_partition_scan' which will switch off the partition scan globally. The partition scan can be re-enabled for individual devices by echoing any positive number smaller than the number of minors into/sys/class/block/XXX/range
Quoted 4 lines
and rescanning the device.
Please apply.
Yeah, cool. One should take care not to mangle to patches. Should teach me to use git properly. Oh well.
Corrected patch attached.
Cheers,
Hannes
Signature · 4 lines
Dr. Hannes Reinecke zSeries & Storage [email protected] +49 911 74053 688 SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: Markus Rex, HRB 16746 (AG Nürnberg)
Disable partition scan
For some setups (multipath or dmraid) the in-kernel partition scan is pointless as the (block) partitions won't be used anywhere. Worse, it might trigger I/O errors as the partition table might not be accessible (eg for the passive path of a multipath device) or even invalid (eg for RAID0 dmraid).
This patch allows to switch off the in-kernel partition scan by adding 'no_partition_scan' to the kernel commandline. Partitions scan can be allowed for individual disk by echoing a positive number into /sys/block/XXX/range and rescan the disk.
block/genhd.c +36 -2
@@ -173,6 +173,18 @@ static int exact_lock(dev_t devt, void *data)return 0 ; } +static int __read_mostly no_partition_scan; + +static int __init no_partition_scan_setup (char *str) +{ + no_partition_scan =1 ; +printk (KERN_INFO "genhd: omit partition scan.\n" ); + +return 1 ; +} + +__setup ("no_partition_scan" , no_partition_scan_setup); +/** * add_disk - add partitioning information to kernel list * @disk: per-device partitioning information
@@ -186,6 +198,8 @@ void add_disk(struct gendisk *disk)int retval; disk->flags |=GENHD_FL_UP ; +if (no_partition_scan) + disk->flags |=GENHD_FL_NO_PARTITION_SCAN ;blk_register_region (MKDEV (disk->major, disk->first_minor), disk->minors,NULL , exact_match, exact_lock, disk);register_disk (disk);
@@ -419,7 +433,27 @@ static ssize_t disk_range_show(struct device *dev, {struct gendisk *disk =dev_to_disk (dev); -return sprintf (buf,"%d\n" , disk->minors); +return sprintf (buf,"%d\n" , + (disk->flags &GENHD_FL_NO_PARTITION_SCAN ?0 : disk->minors)); +} + +static ssize_t disk_range_store (struct device *dev, +struct device_attribute *attr, +const char *buf,size_t count) +{ +struct gendisk *disk =dev_to_disk (dev); +int i; + +if (count >0 &&sscanf (buf,"%d" , &i) >0 ) { +if (i ==0 ) + disk->flags |=GENHD_FL_NO_PARTITION_SCAN ; +else if (i <= disk->minors) + disk->flags &= ~GENHD_FL_NO_PARTITION_SCAN ; +else + count = -EINVAL ; + } + +return count; } static ssize_t disk_removable_show(struct device *dev,
@@ -509,7 +543,7 @@ static ssize_t disk_fail_store(struct device *dev,#endif -static DEVICE_ATTR(range, S_IRUGO, disk_range_show, NULL); +static DEVICE_ATTR(range, S_IRUGO|S_IWUSR, disk_range_show, disk_range_store); static DEVICE_ATTR(removable, S_IRUGO, disk_removable_show, NULL); static DEVICE_ATTR(ro, S_IRUGO, disk_ro_show, NULL); static DEVICE_ATTR(size, S_IRUGO, disk_size_show, NULL);
fs/partitions/check.c +2 -0
@@ -485,6 +485,8 @@ int rescan_partitions(struct gendisk *disk, struct block_device *bdev)delete_partition (disk, p);if (disk->fops->revalidate_disk) disk->fops->revalidate_disk (disk); +if (disk->flags &GENHD_FL_NO_PARTITION_SCAN ) +return 0 ;if (!get_capacity (disk) || !(state =check_partition (disk, bdev)))return 0 ;if (IS_ERR (state))/* I/O error reading the partition table */
include/linux/genhd.h +1 -0
@@ -109,6 +109,7 @@ struct hd_struct {#define GENHD_FL_UP 16#define GENHD_FL_SUPPRESS_PARTITION_INFO 32#define GENHD_FL_FAIL 64 +#define GENHD_FL_NO_PARTITION_SCAN 128#define BLK_SCSI_MAX_CMDS (256)#define BLK_SCSI_CMD_PER_LONG (BLK_SCSI_MAX_CMDS / (sizeof(long) * 8))
include/linux/virtio_blk.h +0 -0
Quoted 6 lines · Hannes Reinecke
Hi all again,
Yeah, cool. One should take care not to mangle to patches. Should teach me to use git properly. Oh well.
Corrected patch attached.
It's also missing an update to Documentation/kernel-parameters.txt .... Please add that.
Thanks,
Signature · 1 line
~Randy