OSDN Git Service

dm mpath: remove extra nesting in map function
authorMike Snitzer <snitzer@redhat.com>
Fri, 28 Feb 2014 14:33:48 +0000 (15:33 +0100)
committerMike Snitzer <snitzer@redhat.com>
Thu, 27 Mar 2014 20:56:25 +0000 (16:56 -0400)
Return early for case when no path exists, and when the
pathgroup isn't ready. This eliminates the need for
extra nesting for the the common case.

Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Signed-off-by: Hannes Reinecke <hare@suse.de>
drivers/md/dm-mpath.c

index 07ca77f..e7d80ba 100644 (file)
@@ -398,29 +398,31 @@ static int multipath_map(struct dm_target *ti, struct request *clone,
 
        pgpath = m->current_pgpath;
 
-       if (pgpath) {
-               if (pg_ready(m)) {
-                       if (set_mapinfo(m, map_context) < 0)
-                               /* ENOMEM, requeue */
-                               goto out_unlock;
-
-                       bdev = pgpath->path.dev->bdev;
-                       clone->q = bdev_get_queue(bdev);
-                       clone->rq_disk = bdev->bd_disk;
-                       clone->cmd_flags |= REQ_FAILFAST_TRANSPORT;
-                       mpio = map_context->ptr;
-                       mpio->pgpath = pgpath;
-                       mpio->nr_bytes = nr_bytes;
-                       if (pgpath->pg->ps.type->start_io)
-                               pgpath->pg->ps.type->start_io(&pgpath->pg->ps,
-                                                             &pgpath->path,
-                                                             nr_bytes);
-                       r = DM_MAPIO_REMAPPED;
-                       goto out_unlock;
-               }
+       if (!pgpath) {
+               if (!__must_push_back(m))
+                       r = -EIO;       /* Failed */
+               goto out_unlock;
+       }
+       if (!pg_ready(m)) {
                __pg_init_all_paths(m);
-       } else if (!__must_push_back(m))
-               r = -EIO;       /* Failed */
+               goto out_unlock;
+       }
+       if (set_mapinfo(m, map_context) < 0)
+               /* ENOMEM, requeue */
+               goto out_unlock;
+
+       bdev = pgpath->path.dev->bdev;
+       clone->q = bdev_get_queue(bdev);
+       clone->rq_disk = bdev->bd_disk;
+       clone->cmd_flags |= REQ_FAILFAST_TRANSPORT;
+       mpio = map_context->ptr;
+       mpio->pgpath = pgpath;
+       mpio->nr_bytes = nr_bytes;
+       if (pgpath->pg->ps.type->start_io)
+               pgpath->pg->ps.type->start_io(&pgpath->pg->ps,
+                                             &pgpath->path,
+                                             nr_bytes);
+       r = DM_MAPIO_REMAPPED;
 
 out_unlock:
        spin_unlock_irqrestore(&m->lock, flags);