| From stable-bounces@linux.kernel.org Thu Jul 12 09:28:41 2007 |
| From: Stefan Bader <shbader@de.ibm.com> |
| Date: Thu, 12 Jul 2007 17:28:33 +0100 |
| Subject: dm: disable barriers |
| To: Linus Torvalds <torvalds@linux-foundation.org> |
| Cc: stable@kernel.org, Stefan Bader <shbader@de.ibm.com> |
| Message-ID: <20070712162833.GT24114@agk.fab.redhat.com> |
| Content-Disposition: inline |
| |
| |
| From: Stefan Bader <shbader@de.ibm.com> |
| |
| This patch causes device-mapper to reject any barrier requests. This is done |
| since most of the targets won't handle this correctly anyway. So until the |
| situation improves it is better to reject these requests at the first place. |
| Since barrier requests won't get to the targets, the checks there can be |
| removed. |
| |
| Signed-off-by: Stefan Bader <shbader@de.ibm.com> |
| Signed-off-by: Alasdair G Kergon <agk@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/md/dm-crypt.c | 3 --- |
| drivers/md/dm-mpath.c | 3 --- |
| drivers/md/dm-snap.c | 6 ------ |
| drivers/md/dm.c | 9 +++++++++ |
| 4 files changed, 9 insertions(+), 12 deletions(-) |
| |
| --- a/drivers/md/dm-crypt.c |
| +++ b/drivers/md/dm-crypt.c |
| @@ -943,9 +943,6 @@ static int crypt_map(struct dm_target *t |
| struct crypt_config *cc = ti->private; |
| struct crypt_io *io; |
| |
| - if (bio_barrier(bio)) |
| - return -EOPNOTSUPP; |
| - |
| io = mempool_alloc(cc->io_pool, GFP_NOIO); |
| io->target = ti; |
| io->base_bio = bio; |
| --- a/drivers/md/dm-mpath.c |
| +++ b/drivers/md/dm-mpath.c |
| @@ -798,9 +798,6 @@ static int multipath_map(struct dm_targe |
| struct mpath_io *mpio; |
| struct multipath *m = (struct multipath *) ti->private; |
| |
| - if (bio_barrier(bio)) |
| - return -EOPNOTSUPP; |
| - |
| mpio = mempool_alloc(m->mpio_pool, GFP_NOIO); |
| dm_bio_record(&mpio->details, bio); |
| |
| --- a/drivers/md/dm-snap.c |
| +++ b/drivers/md/dm-snap.c |
| @@ -887,9 +887,6 @@ static int snapshot_map(struct dm_target |
| if (!s->valid) |
| return -EIO; |
| |
| - if (unlikely(bio_barrier(bio))) |
| - return -EOPNOTSUPP; |
| - |
| /* FIXME: should only take write lock if we need |
| * to copy an exception */ |
| down_write(&s->lock); |
| @@ -1160,9 +1157,6 @@ static int origin_map(struct dm_target * |
| struct dm_dev *dev = (struct dm_dev *) ti->private; |
| bio->bi_bdev = dev->bdev; |
| |
| - if (unlikely(bio_barrier(bio))) |
| - return -EOPNOTSUPP; |
| - |
| /* Only tell snapshots if this is a write */ |
| return (bio_rw(bio) == WRITE) ? do_origin(dev, bio) : DM_MAPIO_REMAPPED; |
| } |
| --- a/drivers/md/dm.c |
| +++ b/drivers/md/dm.c |
| @@ -802,6 +802,15 @@ static int dm_request(request_queue_t *q |
| int rw = bio_data_dir(bio); |
| struct mapped_device *md = q->queuedata; |
| |
| + /* |
| + * There is no use in forwarding any barrier request since we can't |
| + * guarantee it is (or can be) handled by the targets correctly. |
| + */ |
| + if (unlikely(bio_barrier(bio))) { |
| + bio_endio(bio, bio->bi_size, -EOPNOTSUPP); |
| + return 0; |
| + } |
| + |
| down_read(&md->io_lock); |
| |
| disk_stat_inc(dm_disk(md), ios[rw]); |