goto err_out_client;
        sprintf(rbd_dev->header_name, "%s%s", rbd_dev->image_name, RBD_SUFFIX);
 
+       /* Get information about the image being mapped */
+
+       rc = rbd_read_header(rbd_dev, &rbd_dev->header);
+       if (rc)
+               goto err_out_client;
+
+       /* no need to lock here, as rbd_dev is not registered yet */
+       rc = rbd_dev_snaps_update(rbd_dev);
+       if (rc)
+               goto err_out_header;
+
+       rc = rbd_dev_set_mapping(rbd_dev, snap_name);
+       if (rc)
+               goto err_out_header;
+
        /* register our block device */
        rc = register_blkdev(0, rbd_dev->name);
        if (rc < 0)
-               goto err_out_client;
+               goto err_out_header;
        rbd_dev->major = rc;
 
        rc = rbd_bus_add_dev(rbd_dev);
         * of the sysfs code (initiated by rbd_bus_del_dev()).
         */
 
-       /* contact OSD, request size info about the object being mapped */
-       rc = rbd_read_header(rbd_dev, &rbd_dev->header);
-       if (rc)
-               goto err_out_bus;
-
-       /* no need to lock here, as rbd_dev is not registered yet */
-       rc = rbd_dev_snaps_update(rbd_dev);
-       if (rc)
-               goto err_out_bus;
-
-       rc = rbd_dev_set_mapping(rbd_dev, snap_name);
-       if (rc)
-               goto err_out_bus;
-
        down_write(&rbd_dev->header_rwsem);
        rc = rbd_dev_snaps_register(rbd_dev);
        up_write(&rbd_dev->header_rwsem);
 
 err_out_blkdev:
        unregister_blkdev(rbd_dev->major, rbd_dev->name);
+err_out_header:
+       rbd_header_free(&rbd_dev->header);
 err_out_client:
        kfree(rbd_dev->header_name);
        rbd_put_client(rbd_dev);