]> git.openfabrics.org - ~shefty/rdma-dev.git/commitdiff
block: fix non-atomic access to genhd inflight structures
authorShaohua Li <shaohua.li@intel.com>
Tue, 22 Mar 2011 07:35:35 +0000 (08:35 +0100)
committerJens Axboe <jaxboe@fusionio.com>
Tue, 22 Mar 2011 07:35:35 +0000 (08:35 +0100)
After the stack plugging introduction, these are called lockless.
Ensure that the counters are updated atomically.

Signed-off-by: Shaohua Li<shaohua.li@intel.com>
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
drivers/md/dm.c
fs/partitions/check.c
include/linux/genhd.h

index 88820704a1916e5db109b019643a55e3640a753f..0cf68b478878f327598fb756fe2da173d5443468 100644 (file)
@@ -477,7 +477,8 @@ static void start_io_acct(struct dm_io *io)
        cpu = part_stat_lock();
        part_round_stats(cpu, &dm_disk(md)->part0);
        part_stat_unlock();
-       dm_disk(md)->part0.in_flight[rw] = atomic_inc_return(&md->pending[rw]);
+       atomic_set(&dm_disk(md)->part0.in_flight[rw],
+               atomic_inc_return(&md->pending[rw]));
 }
 
 static void end_io_acct(struct dm_io *io)
@@ -497,8 +498,8 @@ static void end_io_acct(struct dm_io *io)
         * After this is decremented the bio must not be touched if it is
         * a flush.
         */
-       dm_disk(md)->part0.in_flight[rw] = pending =
-               atomic_dec_return(&md->pending[rw]);
+       pending = atomic_dec_return(&md->pending[rw]);
+       atomic_set(&dm_disk(md)->part0.in_flight[rw], pending);
        pending += atomic_read(&md->pending[rw^0x1]);
 
        /* nudge anyone waiting on suspend queue */
index 9c21119512b9ace640f1d6107f73b7681c4f1417..ac546975031f7dd9a0f110f9a4479c6e34cef15c 100644 (file)
@@ -290,7 +290,8 @@ ssize_t part_inflight_show(struct device *dev,
 {
        struct hd_struct *p = dev_to_part(dev);
 
-       return sprintf(buf, "%8u %8u\n", p->in_flight[0], p->in_flight[1]);
+       return sprintf(buf, "%8u %8u\n", atomic_read(&p->in_flight[0]),
+               atomic_read(&p->in_flight[1]));
 }
 
 #ifdef CONFIG_FAIL_MAKE_REQUEST
index c0d5f6945c1ebffcccc452da109e353b646a4b0c..d764a426e9fdbf5b5086542e3eeb6c6a2e6d3c8a 100644 (file)
@@ -109,7 +109,7 @@ struct hd_struct {
        int make_it_fail;
 #endif
        unsigned long stamp;
-       int in_flight[2];
+       atomic_t in_flight[2];
 #ifdef CONFIG_SMP
        struct disk_stats __percpu *dkstats;
 #else
@@ -370,21 +370,21 @@ static inline void free_part_stats(struct hd_struct *part)
 
 static inline void part_inc_in_flight(struct hd_struct *part, int rw)
 {
-       part->in_flight[rw]++;
+       atomic_inc(&part->in_flight[rw]);
        if (part->partno)
-               part_to_disk(part)->part0.in_flight[rw]++;
+               atomic_inc(&part_to_disk(part)->part0.in_flight[rw]);
 }
 
 static inline void part_dec_in_flight(struct hd_struct *part, int rw)
 {
-       part->in_flight[rw]--;
+       atomic_dec(&part->in_flight[rw]);
        if (part->partno)
-               part_to_disk(part)->part0.in_flight[rw]--;
+               atomic_dec(&part_to_disk(part)->part0.in_flight[rw]);
 }
 
 static inline int part_in_flight(struct hd_struct *part)
 {
-       return part->in_flight[0] + part->in_flight[1];
+       return atomic_read(&part->in_flight[0]) + atomic_read(&part->in_flight[1]);
 }
 
 static inline struct partition_meta_info *alloc_part_info(struct gendisk *disk)