blkcg: skip blkg printing if q isn't associated with disk
authorVivek Goyal <vgoyal@redhat.com>
Mon, 5 Mar 2012 21:15:10 +0000 (13:15 -0800)
committerJens Axboe <axboe@kernel.dk>
Tue, 6 Mar 2012 20:27:22 +0000 (21:27 +0100)
blk-cgroup printing code currently assumes that there is a device/disk
associated with every queue in the system, but modules like floppy,
can instantiate request queues without registering disk which can lead
to oops.

Skip the queue/blkg which don't have dev/disk associated with them.

-tj: Factored out backing_dev_info check into blkg_dev_name().

Signed-off-by: Vivek Goyal <vgoyal@redhat.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-cgroup.c

index 8742af3..7694236 100644 (file)
@@ -951,13 +951,24 @@ static int blkiocg_file_write(struct cgroup *cgrp, struct cftype *cft,
        return ret;
 }
 
+static const char *blkg_dev_name(struct blkio_group *blkg)
+{
+       /* some drivers (floppy) instantiate a queue w/o disk registered */
+       if (blkg->q->backing_dev_info.dev)
+               return dev_name(blkg->q->backing_dev_info.dev);
+       return NULL;
+}
+
 static void blkio_print_group_conf(struct cftype *cft, struct blkio_group *blkg,
                                   struct seq_file *m)
 {
-       const char *dname = dev_name(blkg->q->backing_dev_info.dev);
+       const char *dname = blkg_dev_name(blkg);
        int fileid = BLKIOFILE_ATTR(cft->private);
        int rw = WRITE;
 
+       if (!dname)
+               return;
+
        switch (blkg->plid) {
                case BLKIO_POLICY_PROP:
                        if (blkg->conf.weight)
@@ -1049,9 +1060,9 @@ static int blkio_read_blkg_stats(struct blkio_cgroup *blkcg,
 
        rcu_read_lock();
        hlist_for_each_entry_rcu(blkg, n, &blkcg->blkg_list, blkcg_node) {
-               const char *dname = dev_name(blkg->q->backing_dev_info.dev);
+               const char *dname = blkg_dev_name(blkg);
 
-               if (BLKIOFILE_POLICY(cft->private) != blkg->plid)
+               if (!dname || BLKIOFILE_POLICY(cft->private) != blkg->plid)
                        continue;
                if (pcpu)
                        cgroup_total += blkio_get_stat_cpu(blkg, cb, dname,