Ok, I applied the patch below to the .38-stable tree, after backporting a few other patches, but for some very wierd reason, I can't get it to apply to the .39-stable tree.
What am I doing wrong? I'm totally confused here. lost, greg k-h > commit: d4dc210f69bcb0b4bef5a83b1c323817be89bad1 > From: Tejun Heo <[email protected]> > Date: Thu, 21 Apr 2011 20:54:46 +0200 > Subject: [PATCH] block: don't block events on excl write for non-optical > devices > > 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 > > Cc: [email protected] > Signed-off-by: Tejun Heo <[email protected]> > Reported-by: Kay Sievers <[email protected]> > Signed-off-by: Jens Axboe <[email protected]> > --- > drivers/block/paride/pcd.c | 1 + > drivers/cdrom/viocd.c | 3 ++- > drivers/ide/ide-cd.c | 2 +- > drivers/scsi/sr.c | 2 +- > fs/block_dev.c | 17 ++++++++++------- > include/linux/genhd.h | 1 + > 6 files changed, 16 insertions(+), 10 deletions(-) > > diff --git a/drivers/block/paride/pcd.c b/drivers/block/paride/pcd.c > index 2f2ccf6..a0aabd9 100644 > --- 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; > disk->events = DISK_EVENT_MEDIA_CHANGE; > } > } > diff --git a/drivers/cdrom/viocd.c b/drivers/cdrom/viocd.c > index 4e874c5..ae15a4d 100644 > --- a/drivers/cdrom/viocd.c > +++ b/drivers/cdrom/viocd.c > @@ -625,7 +625,8 @@ static int viocd_probe(struct vio_dev *vdev, const struct > vio_device_id *id) > 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; > gendisk->events = DISK_EVENT_MEDIA_CHANGE; > set_capacity(gendisk, 0); > gendisk->private_data = d; > diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c > index fd1e117..6e5123b 100644 > --- a/drivers/ide/ide-cd.c > +++ b/drivers/ide/ide-cd.c > @@ -1781,7 +1781,7 @@ static int ide_cd_probe(ide_drive_t *drive) > > ide_cd_read_toc(drive, &sense); > g->fops = &idecd_ops; > - g->flags |= GENHD_FL_REMOVABLE; > + g->flags |= GENHD_FL_REMOVABLE | GENHD_FL_BLOCK_EVENTS_ON_EXCL_WRITE; > g->events = DISK_EVENT_MEDIA_CHANGE; > add_disk(g); > return 0; > diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c > index 95019c7..4778e27 100644 > --- 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); > diff --git a/fs/block_dev.c b/fs/block_dev.c > index 257b00e..d7c2e0f 100644 > --- a/fs/block_dev.c > +++ b/fs/block_dev.c > @@ -1237,6 +1237,8 @@ int blkdev_get(struct block_device *bdev, fmode_t mode, > void *holder) > 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); > @@ -1263,15 +1265,16 @@ int blkdev_get(struct block_device *bdev, fmode_t > mode, void *holder) > 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); > diff --git a/include/linux/genhd.h b/include/linux/genhd.h > index d764a42..300d758 100644 > --- 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 */ > > _______________________________________________ > stable mailing list > [email protected] > http://linux.kernel.org/mailman/listinfo/stable _______________________________________________ stable mailing list [email protected] http://linux.kernel.org/mailman/listinfo/stable
