Get rid of global _io_lock spinlock. --- diff/drivers/md/dm-iostats.c 2002-12-16 11:18:35.000000000 +0000 +++ source/drivers/md/dm-iostats.c 2002-12-16 11:18:45.000000000 +0000 @@ -41,6 +41,8 @@ #define MAX_COUNT ((count_t) - 1) struct iostats_avg_c { + spinlock_t lock; + struct dm_dev *dev; uint32_t reads; uint32_t writes; @@ -117,6 +119,7 @@ if (!r) { struct iostats_avg_c *ic = ti->private; + ic->lock = SPIN_LOCK_UNLOCKED; ic->reads = 0; ic->writes = 0; ic->total_r = 0; @@ -153,9 +156,6 @@ return 1; } -/* FIXME: should be a target lock */ -static spinlock_t _io_lock = SPIN_LOCK_UNLOCKED; - /* average latency stats end_io function */ static void iostats_avg_end_io(struct buffer_head *bh, int uptodate) { @@ -164,7 +164,7 @@ struct dm_iostats *io = bh->b_private; struct iostats_avg_c *ic = io->ti->private; - spin_lock_irqsave(&_io_lock, flags); + spin_lock_irqsave(&ic->lock, flags); /* average io latency; ignore an io on jiffies overflow */ if (jiffies >= io->start_io) { @@ -189,7 +189,7 @@ } } - spin_unlock_irqrestore(&_io_lock, flags); + spin_unlock_irqrestore(&ic->lock, flags); bh->b_end_io = io->end_io; bh->b_private = io->context;