diff options
author | Greg Kroah-Hartman <gregkh@suse.de> | 2011-05-30 18:03:28 +0800 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-05-30 18:03:28 +0800 |
commit | 9148784d0e30457e35bd8592bbde0d48284d5ce8 (patch) | |
tree | 51f5893e6adb224669bcaa23a86082e46110ac6c | |
parent | 9e44e803a2604d1c5da340afe7376e1906665358 (diff) | |
download | stable-queue-9148784d0e30457e35bd8592bbde0d48284d5ce8.tar.gz |
.39 patches
-rw-r--r-- | queue-2.6.39/block-don-t-block-events-on-excl-write-for-non-optical.patch | 125 | ||||
-rw-r--r-- | queue-2.6.39/series | 1 |
2 files changed, 126 insertions, 0 deletions
diff --git a/queue-2.6.39/block-don-t-block-events-on-excl-write-for-non-optical.patch b/queue-2.6.39/block-don-t-block-events-on-excl-write-for-non-optical.patch new file mode 100644 index 0000000000..3bc7b74f47 --- /dev/null +++ b/queue-2.6.39/block-don-t-block-events-on-excl-write-for-non-optical.patch @@ -0,0 +1,125 @@ +From d4dc210f69bcb0b4bef5a83b1c323817be89bad1 Mon Sep 17 00:00:00 2001 +From: Tejun Heo <tj@kernel.org> +Date: Thu, 21 Apr 2011 20:54:46 +0200 +Subject: block: don't block events on excl write for non-optical + devices + +From: Tejun Heo <tj@kernel.org> + +commit d4dc210f69bcb0b4bef5a83b1c323817be89bad1 upstream. + +Disk event code automatically blocks events on excl write. This is +primarily to avoid issuing polling commands while burning is in +progress. This behavior doesn't fit other types of devices with +removeable media where polling commands don't have adverse side +effects and door locking usually doesn't exist. + +This patch introduces new genhd flag which controls the auto-blocking +behavior and uses it to enable auto-blocking only on optical devices. + +Note for stable: 2.6.38 and later only + +Signed-off-by: Tejun Heo <tj@kernel.org> +Reported-by: Kay Sievers <kay.sievers@vrfy.org> +Signed-off-by: Jens Axboe <jaxboe@fusionio.com> +Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + +--- + drivers/block/paride/pcd.c | 1 + + drivers/cdrom/viocd.c | 3 ++- + drivers/ide/ide-cd.c | 3 ++- + drivers/scsi/sr.c | 2 +- + fs/block_dev.c | 17 ++++++++++------- + include/linux/genhd.h | 1 + + 6 files changed, 17 insertions(+), 10 deletions(-) + +--- a/drivers/block/paride/pcd.c ++++ b/drivers/block/paride/pcd.c +@@ -320,6 +320,7 @@ static void pcd_init_units(void) + disk->first_minor = unit; + strcpy(disk->disk_name, cd->name); /* umm... */ + disk->fops = &pcd_bdops; ++ disk->flags = GENHD_FL_BLOCK_EVENTS_ON_EXCL_WRITE; + } + } + +--- a/drivers/cdrom/viocd.c ++++ b/drivers/cdrom/viocd.c +@@ -625,7 +625,8 @@ static int viocd_probe(struct vio_dev *v + blk_queue_max_hw_sectors(q, 4096 / 512); + gendisk->queue = q; + gendisk->fops = &viocd_fops; +- gendisk->flags = GENHD_FL_CD|GENHD_FL_REMOVABLE; ++ gendisk->flags = GENHD_FL_CD | GENHD_FL_REMOVABLE | ++ GENHD_FL_BLOCK_EVENTS_ON_EXCL_WRITE; + set_capacity(gendisk, 0); + gendisk->private_data = d; + d->viocd_disk = gendisk; +--- a/drivers/ide/ide-cd.c ++++ b/drivers/ide/ide-cd.c +@@ -1773,7 +1773,8 @@ static int ide_cd_probe(ide_drive_t *dri + + g->minors = 1; + g->driverfs_dev = &drive->gendev; +- g->flags = GENHD_FL_CD | GENHD_FL_REMOVABLE; ++ g->flags = GENHD_FL_CD | GENHD_FL_REMOVABLE | ++ GENHD_FL_BLOCK_EVENTS_ON_EXCL_WRITE; + if (ide_cdrom_setup(drive)) { + put_device(&info->dev); + goto failed; +--- a/drivers/scsi/sr.c ++++ b/drivers/scsi/sr.c +@@ -636,7 +636,7 @@ static int sr_probe(struct device *dev) + disk->first_minor = minor; + sprintf(disk->disk_name, "sr%d", minor); + disk->fops = &sr_bdops; +- disk->flags = GENHD_FL_CD; ++ disk->flags = GENHD_FL_CD | GENHD_FL_BLOCK_EVENTS_ON_EXCL_WRITE; + disk->events = DISK_EVENT_MEDIA_CHANGE | DISK_EVENT_EJECT_REQUEST; + + blk_queue_rq_timeout(sdev->request_queue, SR_TIMEOUT); +--- a/fs/block_dev.c ++++ b/fs/block_dev.c +@@ -1238,6 +1238,8 @@ int blkdev_get(struct block_device *bdev + res = __blkdev_get(bdev, mode, 0); + + if (whole) { ++ struct gendisk *disk = whole->bd_disk; ++ + /* finish claiming */ + mutex_lock(&bdev->bd_mutex); + spin_lock(&bdev_lock); +@@ -1264,15 +1266,16 @@ int blkdev_get(struct block_device *bdev + spin_unlock(&bdev_lock); + + /* +- * Block event polling for write claims. Any write +- * holder makes the write_holder state stick until all +- * are released. This is good enough and tracking +- * individual writeable reference is too fragile given +- * the way @mode is used in blkdev_get/put(). ++ * Block event polling for write claims if requested. Any ++ * write holder makes the write_holder state stick until ++ * all are released. This is good enough and tracking ++ * individual writeable reference is too fragile given the ++ * way @mode is used in blkdev_get/put(). + */ +- if (!res && (mode & FMODE_WRITE) && !bdev->bd_write_holder) { ++ if ((disk->flags & GENHD_FL_BLOCK_EVENTS_ON_EXCL_WRITE) && ++ !res && (mode & FMODE_WRITE) && !bdev->bd_write_holder) { + bdev->bd_write_holder = true; +- disk_block_events(bdev->bd_disk); ++ disk_block_events(disk); + } + + mutex_unlock(&bdev->bd_mutex); +--- a/include/linux/genhd.h ++++ b/include/linux/genhd.h +@@ -127,6 +127,7 @@ struct hd_struct { + #define GENHD_FL_SUPPRESS_PARTITION_INFO 32 + #define GENHD_FL_EXT_DEVT 64 /* allow extended devt */ + #define GENHD_FL_NATIVE_CAPACITY 128 ++#define GENHD_FL_BLOCK_EVENTS_ON_EXCL_WRITE 256 + + enum { + DISK_EVENT_MEDIA_CHANGE = 1 << 0, /* media changed */ diff --git a/queue-2.6.39/series b/queue-2.6.39/series index f80ec3fd6f..6a0c723bcb 100644 --- a/queue-2.6.39/series +++ b/queue-2.6.39/series @@ -159,3 +159,4 @@ xen-p2m-create-entries-in-the-p2m_mfn-trees-s-to-track-1-1.patch xen-setup-fix-for-incorrect-xen_extra_mem_start.patch xen-setup-ignore-e820_unusable-when-setting-1-1-mappings.patch xen-mmu-fix-a-race-window-causing-leave_mm-bug.patch +block-don-t-block-events-on-excl-write-for-non-optical.patch |