OSDN Git Service

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph...
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 26 Jun 2013 18:47:46 +0000 (08:47 -1000)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 26 Jun 2013 18:47:46 +0000 (08:47 -1000)
Pull Ceph fix from Sage Weil:
 "This fixes another problem with using v2 images on 3.10 due to the
  order in which fields are read from the image header.

  Hopefully this is the last one"

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client:
  rbd: fetch object order before using it

1  2 
drivers/block/rbd.c

diff --combined drivers/block/rbd.c
@@@ -497,7 -497,7 +497,7 @@@ static int rbd_open(struct block_devic
        return 0;
  }
  
 -static int rbd_release(struct gendisk *disk, fmode_t mode)
 +static void rbd_release(struct gendisk *disk, fmode_t mode)
  {
        struct rbd_device *rbd_dev = disk->private_data;
        unsigned long open_count_before;
        mutex_lock_nested(&ctl_mutex, SINGLE_DEPTH_NESTING);
        put_device(&rbd_dev->dev);
        mutex_unlock(&ctl_mutex);
 -
 -      return 0;
  }
  
  static const struct block_device_operations rbd_bd_ops = {
@@@ -1198,7 -1200,7 +1198,7 @@@ static struct bio *bio_clone_range(stru
        /* Find first affected segment... */
  
        resid = offset;
 -      __bio_for_each_segment(bv, bio_src, idx, 0) {
 +      bio_for_each_segment(bv, bio_src, idx) {
                if (resid < bv->bv_len)
                        break;
                resid -= bv->bv_len;
@@@ -4243,6 -4245,10 +4243,10 @@@ static int rbd_dev_v2_header_info(struc
  
        down_write(&rbd_dev->header_rwsem);
  
+       ret = rbd_dev_v2_image_size(rbd_dev);
+       if (ret)
+               goto out;
        if (first_time) {
                ret = rbd_dev_v2_header_onetime(rbd_dev);
                if (ret)
                                        "is EXPERIMENTAL!");
        }
  
-       ret = rbd_dev_v2_image_size(rbd_dev);
-       if (ret)
-               goto out;
        if (rbd_dev->spec->snap_id == CEPH_NOSNAP)
                if (rbd_dev->mapping.size != rbd_dev->header.image_size)
                        rbd_dev->mapping.size = rbd_dev->header.image_size;