From 8e0578365057642ce232c0d36c088f838e6c6aba Mon Sep 17 00:00:00 2001 From: Alasdair G Kergon Date: Thu, 2 Apr 2009 19:55:28 +0100 Subject: [PATCH] --- yaml --- r: 140159 b: refs/heads/master c: 570b9d968bf9b16974252ef7cbce73fa6dac34f3 h: refs/heads/master i: 140157: 2c35c9dd62ecef01cd04bd14e84772cb2ab9c8bf 140155: ed398d7de115bf31a42e6dc3dd0710837f04bd45 140151: 5548fac611293843b834c21bf5841de47710a682 140143: fef02563e4996efe5ed7e3e0e4861270312f70bc 140127: b5edb1e09a4fa20c334cc7bd30c848862631f58c 140095: 2447ac733b009ab374864d9bc12c69159b193c4f 140031: c7c9efaf6cf9201b35104eeafb3c21b4af3a27b6 v: v3 --- [refs] | 2 +- trunk/drivers/md/dm-table.c | 26 ++++++++++++++------------ 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/[refs] b/[refs] index 9d0c297c7551..5eba613857da 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: aea9058801c0acfa2831af1714da412dfb0018c2 +refs/heads/master: 570b9d968bf9b16974252ef7cbce73fa6dac34f3 diff --git a/trunk/drivers/md/dm-table.c b/trunk/drivers/md/dm-table.c index 2fd66c30f7f8..e8361b191b9b 100644 --- a/trunk/drivers/md/dm-table.c +++ b/trunk/drivers/md/dm-table.c @@ -399,28 +399,30 @@ static int check_device_area(struct dm_dev_internal *dd, sector_t start, } /* - * This upgrades the mode on an already open dm_dev. Being + * This upgrades the mode on an already open dm_dev, being * careful to leave things as they were if we fail to reopen the - * device. + * device and not to touch the existing bdev field in case + * it is accessed concurrently inside dm_table_any_congested(). */ static int upgrade_mode(struct dm_dev_internal *dd, fmode_t new_mode, struct mapped_device *md) { int r; - struct dm_dev_internal dd_copy; - dev_t dev = dd->dm_dev.bdev->bd_dev; + struct dm_dev_internal dd_new, dd_old; - dd_copy = *dd; + dd_new = dd_old = *dd; + + dd_new.dm_dev.mode |= new_mode; + dd_new.dm_dev.bdev = NULL; + + r = open_dev(&dd_new, dd->dm_dev.bdev->bd_dev, md); + if (r) + return r; dd->dm_dev.mode |= new_mode; - dd->dm_dev.bdev = NULL; - r = open_dev(dd, dev, md); - if (!r) - close_dev(&dd_copy, md); - else - *dd = dd_copy; + close_dev(&dd_old, md); - return r; + return 0; } /*