]> Pileus Git - ~andy/linux/blobdiff - drivers/md/dm-snap.c
hlist: drop the node parameter from iterators
[~andy/linux] / drivers / md / dm-snap.c
index b7e179cdc5af906aed485c7f32b0a65e68533032..10079e07edf48e8cafe8183d01e5808b09304f3b 100644 (file)
@@ -190,9 +190,19 @@ struct dm_snap_tracked_chunk {
        chunk_t chunk;
 };
 
-static struct dm_snap_tracked_chunk *track_chunk(struct dm_snapshot *s,
-                                                struct bio *bio,
-                                                chunk_t chunk)
+static void init_tracked_chunk(struct bio *bio)
+{
+       struct dm_snap_tracked_chunk *c = dm_per_bio_data(bio, sizeof(struct dm_snap_tracked_chunk));
+       INIT_HLIST_NODE(&c->node);
+}
+
+static bool is_bio_tracked(struct bio *bio)
+{
+       struct dm_snap_tracked_chunk *c = dm_per_bio_data(bio, sizeof(struct dm_snap_tracked_chunk));
+       return !hlist_unhashed(&c->node);
+}
+
+static void track_chunk(struct dm_snapshot *s, struct bio *bio, chunk_t chunk)
 {
        struct dm_snap_tracked_chunk *c = dm_per_bio_data(bio, sizeof(struct dm_snap_tracked_chunk));
 
@@ -202,13 +212,11 @@ static struct dm_snap_tracked_chunk *track_chunk(struct dm_snapshot *s,
        hlist_add_head(&c->node,
                       &s->tracked_chunk_hash[DM_TRACKED_CHUNK_HASH(chunk)]);
        spin_unlock_irq(&s->tracked_chunk_lock);
-
-       return c;
 }
 
-static void stop_tracking_chunk(struct dm_snapshot *s,
-                               struct dm_snap_tracked_chunk *c)
+static void stop_tracking_chunk(struct dm_snapshot *s, struct bio *bio)
 {
+       struct dm_snap_tracked_chunk *c = dm_per_bio_data(bio, sizeof(struct dm_snap_tracked_chunk));
        unsigned long flags;
 
        spin_lock_irqsave(&s->tracked_chunk_lock, flags);
@@ -219,12 +227,11 @@ static void stop_tracking_chunk(struct dm_snapshot *s,
 static int __chunk_is_tracked(struct dm_snapshot *s, chunk_t chunk)
 {
        struct dm_snap_tracked_chunk *c;
-       struct hlist_node *hn;
        int found = 0;
 
        spin_lock_irq(&s->tracked_chunk_lock);
 
-       hlist_for_each_entry(c, hn,
+       hlist_for_each_entry(c,
            &s->tracked_chunk_hash[DM_TRACKED_CHUNK_HASH(chunk)], node) {
                if (c->chunk == chunk) {
                        found = 1;
@@ -1559,8 +1566,7 @@ static void remap_exception(struct dm_snapshot *s, struct dm_exception *e,
                                          s->store->chunk_mask);
 }
 
-static int snapshot_map(struct dm_target *ti, struct bio *bio,
-                       union map_info *map_context)
+static int snapshot_map(struct dm_target *ti, struct bio *bio)
 {
        struct dm_exception *e;
        struct dm_snapshot *s = ti->private;
@@ -1568,6 +1574,8 @@ static int snapshot_map(struct dm_target *ti, struct bio *bio,
        chunk_t chunk;
        struct dm_snap_pending_exception *pe = NULL;
 
+       init_tracked_chunk(bio);
+
        if (bio->bi_rw & REQ_FLUSH) {
                bio->bi_bdev = s->cow->bdev;
                return DM_MAPIO_REMAPPED;
@@ -1652,7 +1660,7 @@ static int snapshot_map(struct dm_target *ti, struct bio *bio,
                }
        } else {
                bio->bi_bdev = s->origin->bdev;
-               map_context->ptr = track_chunk(s, bio, chunk);
+               track_chunk(s, bio, chunk);
        }
 
 out_unlock:
@@ -1673,20 +1681,20 @@ out:
  * If merging is currently taking place on the chunk in question, the
  * I/O is deferred by adding it to s->bios_queued_during_merge.
  */
-static int snapshot_merge_map(struct dm_target *ti, struct bio *bio,
-                             union map_info *map_context)
+static int snapshot_merge_map(struct dm_target *ti, struct bio *bio)
 {
        struct dm_exception *e;
        struct dm_snapshot *s = ti->private;
        int r = DM_MAPIO_REMAPPED;
        chunk_t chunk;
 
+       init_tracked_chunk(bio);
+
        if (bio->bi_rw & REQ_FLUSH) {
                if (!dm_bio_get_target_request_nr(bio))
                        bio->bi_bdev = s->origin->bdev;
                else
                        bio->bi_bdev = s->cow->bdev;
-               map_context->ptr = NULL;
                return DM_MAPIO_REMAPPED;
        }
 
@@ -1715,7 +1723,7 @@ static int snapshot_merge_map(struct dm_target *ti, struct bio *bio,
                remap_exception(s, e, bio, chunk);
 
                if (bio_rw(bio) == WRITE)
-                       map_context->ptr = track_chunk(s, bio, chunk);
+                       track_chunk(s, bio, chunk);
                goto out_unlock;
        }
 
@@ -1733,14 +1741,12 @@ out_unlock:
        return r;
 }
 
-static int snapshot_end_io(struct dm_target *ti, struct bio *bio,
-                          int error, union map_info *map_context)
+static int snapshot_end_io(struct dm_target *ti, struct bio *bio, int error)
 {
        struct dm_snapshot *s = ti->private;
-       struct dm_snap_tracked_chunk *c = map_context->ptr;
 
-       if (c)
-               stop_tracking_chunk(s, c);
+       if (is_bio_tracked(bio))
+               stop_tracking_chunk(s, bio);
 
        return 0;
 }
@@ -2109,8 +2115,7 @@ static void origin_dtr(struct dm_target *ti)
        dm_put_device(ti, dev);
 }
 
-static int origin_map(struct dm_target *ti, struct bio *bio,
-                     union map_info *map_context)
+static int origin_map(struct dm_target *ti, struct bio *bio)
 {
        struct dm_dev *dev = ti->private;
        bio->bi_bdev = dev->bdev;