diff options
author | Shaohua Li <shaohua.li@intel.com> | 2011-03-22 03:35:35 -0400 |
---|---|---|
committer | Jens Axboe <jaxboe@fusionio.com> | 2011-03-22 03:35:35 -0400 |
commit | 1e9bb8808ac11094d711d20d580e7b45a4992d0c (patch) | |
tree | d0e228b619664b7f507e37e5eba4a5ebeef103a0 /include/linux/genhd.h | |
parent | 5e84ea3a9c662dc2d7a48703a4468fad954a3b7f (diff) |
block: fix non-atomic access to genhd inflight structures
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>
Diffstat (limited to 'include/linux/genhd.h')
-rw-r--r-- | include/linux/genhd.h | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/include/linux/genhd.h b/include/linux/genhd.h index c0d5f6945c1e..d764a426e9fd 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h | |||
@@ -109,7 +109,7 @@ struct hd_struct { | |||
109 | int make_it_fail; | 109 | int make_it_fail; |
110 | #endif | 110 | #endif |
111 | unsigned long stamp; | 111 | unsigned long stamp; |
112 | int in_flight[2]; | 112 | atomic_t in_flight[2]; |
113 | #ifdef CONFIG_SMP | 113 | #ifdef CONFIG_SMP |
114 | struct disk_stats __percpu *dkstats; | 114 | struct disk_stats __percpu *dkstats; |
115 | #else | 115 | #else |
@@ -370,21 +370,21 @@ static inline void free_part_stats(struct hd_struct *part) | |||
370 | 370 | ||
371 | static inline void part_inc_in_flight(struct hd_struct *part, int rw) | 371 | static inline void part_inc_in_flight(struct hd_struct *part, int rw) |
372 | { | 372 | { |
373 | part->in_flight[rw]++; | 373 | atomic_inc(&part->in_flight[rw]); |
374 | if (part->partno) | 374 | if (part->partno) |
375 | part_to_disk(part)->part0.in_flight[rw]++; | 375 | atomic_inc(&part_to_disk(part)->part0.in_flight[rw]); |
376 | } | 376 | } |
377 | 377 | ||
378 | static inline void part_dec_in_flight(struct hd_struct *part, int rw) | 378 | static inline void part_dec_in_flight(struct hd_struct *part, int rw) |
379 | { | 379 | { |
380 | part->in_flight[rw]--; | 380 | atomic_dec(&part->in_flight[rw]); |
381 | if (part->partno) | 381 | if (part->partno) |
382 | part_to_disk(part)->part0.in_flight[rw]--; | 382 | atomic_dec(&part_to_disk(part)->part0.in_flight[rw]); |
383 | } | 383 | } |
384 | 384 | ||
385 | static inline int part_in_flight(struct hd_struct *part) | 385 | static inline int part_in_flight(struct hd_struct *part) |
386 | { | 386 | { |
387 | return part->in_flight[0] + part->in_flight[1]; | 387 | return atomic_read(&part->in_flight[0]) + atomic_read(&part->in_flight[1]); |
388 | } | 388 | } |
389 | 389 | ||
390 | static inline struct partition_meta_info *alloc_part_info(struct gendisk *disk) | 390 | static inline struct partition_meta_info *alloc_part_info(struct gendisk *disk) |