]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/md/dm-table.c
[PATCH] pass fmode_t to blkdev_put()
[linux-2.6-omap-h63xx.git] / drivers / md / dm-table.c
index 5dd32b8a57ac981328c538c5180e8494b506e0f5..dd8bd2e867cdd7c09783ccf0e1653a6a9808d43c 100644 (file)
@@ -43,7 +43,7 @@ struct dm_table {
         * device.  This should be a combination of FMODE_READ
         * and FMODE_WRITE.
         */
-       int mode;
+       fmode_t mode;
 
        /* a list of devices used by this table */
        struct list_head devices;
@@ -217,7 +217,7 @@ static int alloc_targets(struct dm_table *t, unsigned int num)
        return 0;
 }
 
-int dm_table_create(struct dm_table **result, int mode,
+int dm_table_create(struct dm_table **result, fmode_t mode,
                    unsigned num_targets, struct mapped_device *md)
 {
        struct dm_table *t = kzalloc(sizeof(*t), GFP_KERNEL);
@@ -357,7 +357,7 @@ static int open_dev(struct dm_dev_internal *d, dev_t dev,
                return PTR_ERR(bdev);
        r = bd_claim_by_disk(bdev, _claim_ptr, dm_disk(md));
        if (r)
-               blkdev_put(bdev);
+               blkdev_put(bdev, d->dm_dev.mode);
        else
                d->dm_dev.bdev = bdev;
        return r;
@@ -372,7 +372,7 @@ static void close_dev(struct dm_dev_internal *d, struct mapped_device *md)
                return;
 
        bd_release_from_disk(d->dm_dev.bdev, dm_disk(md));
-       blkdev_put(d->dm_dev.bdev);
+       blkdev_put(d->dm_dev.bdev, d->dm_dev.mode);
        d->dm_dev.bdev = NULL;
 }
 
@@ -395,7 +395,7 @@ static int check_device_area(struct dm_dev_internal *dd, sector_t start,
  * careful to leave things as they were if we fail to reopen the
  * device.
  */
-static int upgrade_mode(struct dm_dev_internal *dd, int new_mode,
+static int upgrade_mode(struct dm_dev_internal *dd, fmode_t new_mode,
                        struct mapped_device *md)
 {
        int r;
@@ -421,7 +421,7 @@ static int upgrade_mode(struct dm_dev_internal *dd, int new_mode,
  */
 static int __table_get_device(struct dm_table *t, struct dm_target *ti,
                              const char *path, sector_t start, sector_t len,
-                             int mode, struct dm_dev **result)
+                             fmode_t mode, struct dm_dev **result)
 {
        int r;
        dev_t uninitialized_var(dev);
@@ -482,6 +482,13 @@ void dm_set_device_limits(struct dm_target *ti, struct block_device *bdev)
 {
        struct request_queue *q = bdev_get_queue(bdev);
        struct io_restrictions *rs = &ti->limits;
+       char b[BDEVNAME_SIZE];
+
+       if (unlikely(!q)) {
+               DMWARN("%s: Cannot set limits for nonexistent device %s",
+                      dm_device_name(ti->table->md), bdevname(bdev, b));
+               return;
+       }
 
        /*
         * Combine the device limits low.
@@ -530,7 +537,7 @@ void dm_set_device_limits(struct dm_target *ti, struct block_device *bdev)
 EXPORT_SYMBOL_GPL(dm_set_device_limits);
 
 int dm_get_device(struct dm_target *ti, const char *path, sector_t start,
-                 sector_t len, int mode, struct dm_dev **result)
+                 sector_t len, fmode_t mode, struct dm_dev **result)
 {
        int r = __table_get_device(ti->table, ti, path,
                                   start, len, mode, result);
@@ -880,7 +887,7 @@ struct list_head *dm_table_get_devices(struct dm_table *t)
        return &t->devices;
 }
 
-int dm_table_get_mode(struct dm_table *t)
+fmode_t dm_table_get_mode(struct dm_table *t)
 {
        return t->mode;
 }
@@ -950,7 +957,14 @@ int dm_table_any_congested(struct dm_table *t, int bdi_bits)
 
        list_for_each_entry(dd, devices, list) {
                struct request_queue *q = bdev_get_queue(dd->dm_dev.bdev);
-               r |= bdi_congested(&q->backing_dev_info, bdi_bits);
+               char b[BDEVNAME_SIZE];
+
+               if (likely(q))
+                       r |= bdi_congested(&q->backing_dev_info, bdi_bits);
+               else
+                       DMWARN_LIMIT("%s: any_congested: nonexistent device %s",
+                                    dm_device_name(t->md),
+                                    bdevname(dd->dm_dev.bdev, b));
        }
 
        return r;
@@ -963,8 +977,14 @@ void dm_table_unplug_all(struct dm_table *t)
 
        list_for_each_entry(dd, devices, list) {
                struct request_queue *q = bdev_get_queue(dd->dm_dev.bdev);
-
-               blk_unplug(q);
+               char b[BDEVNAME_SIZE];
+
+               if (likely(q))
+                       blk_unplug(q);
+               else
+                       DMWARN_LIMIT("%s: Cannot unplug nonexistent device %s",
+                                    dm_device_name(t->md),
+                                    bdevname(dd->dm_dev.bdev, b));
        }
 }