Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

rbd: fix error paths in rbd_dev_refresh()

header_rwsem should be released on errors. Also remove useless
rbd_dev->mapping.size != rbd_dev->header.image_size test.

Signed-off-by: Ilya Dryomov <idryomov@redhat.com>

authored by

Ilya Dryomov and committed by
Ilya Dryomov
73e39e4d 982d6011

+6 -7
+6 -7
drivers/block/rbd.c
··· 3694 3694 3695 3695 ret = rbd_dev_header_info(rbd_dev); 3696 3696 if (ret) 3697 - return ret; 3697 + goto out; 3698 3698 3699 3699 /* 3700 3700 * If there is a parent, see if it has disappeared due to the ··· 3703 3703 if (rbd_dev->parent) { 3704 3704 ret = rbd_dev_v2_parent_info(rbd_dev); 3705 3705 if (ret) 3706 - return ret; 3706 + goto out; 3707 3707 } 3708 3708 3709 3709 if (rbd_dev->spec->snap_id == CEPH_NOSNAP) { 3710 - if (rbd_dev->mapping.size != rbd_dev->header.image_size) 3711 - rbd_dev->mapping.size = rbd_dev->header.image_size; 3710 + rbd_dev->mapping.size = rbd_dev->header.image_size; 3712 3711 } else { 3713 3712 /* validate mapped snapshot's EXISTS flag */ 3714 3713 rbd_exists_validate(rbd_dev); 3715 3714 } 3716 3715 3716 + out: 3717 3717 up_write(&rbd_dev->header_rwsem); 3718 - 3719 - if (mapping_size != rbd_dev->mapping.size) 3718 + if (!ret && mapping_size != rbd_dev->mapping.size) 3720 3719 rbd_dev_update_size(rbd_dev); 3721 3720 3722 - return 0; 3721 + return ret; 3723 3722 } 3724 3723 3725 3724 static int rbd_init_disk(struct rbd_device *rbd_dev)