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

drbd: Fix rcu_read_lock balance on error path

Signed-off-by: Andreas Gruenbacher <agruen@linbit.com>
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>

authored by

Andreas Gruenbacher and committed by
Jens Axboe
f9eb7bf4 6110d70b

+12 -7
+12 -7
drivers/block/drbd/drbd_nl.c
··· 2658 2658 const struct sib_info *sib) 2659 2659 { 2660 2660 struct state_info *si = NULL; /* for sizeof(si->member); */ 2661 - struct net_conf *nc; 2662 2661 struct nlattr *nla; 2663 2662 int got_ldev; 2664 2663 int err = 0; ··· 2687 2688 goto nla_put_failure; 2688 2689 2689 2690 rcu_read_lock(); 2690 - if (got_ldev) 2691 - if (disk_conf_to_skb(skb, rcu_dereference(mdev->ldev->disk_conf), exclude_sensitive)) 2692 - goto nla_put_failure; 2691 + if (got_ldev) { 2692 + struct disk_conf *disk_conf; 2693 2693 2694 - nc = rcu_dereference(mdev->tconn->net_conf); 2695 - if (nc) 2696 - err = net_conf_to_skb(skb, nc, exclude_sensitive); 2694 + disk_conf = rcu_dereference(mdev->ldev->disk_conf); 2695 + err = disk_conf_to_skb(skb, disk_conf, exclude_sensitive); 2696 + } 2697 + if (!err) { 2698 + struct net_conf *nc; 2699 + 2700 + nc = rcu_dereference(mdev->tconn->net_conf); 2701 + if (nc) 2702 + err = net_conf_to_skb(skb, nc, exclude_sensitive); 2703 + } 2697 2704 rcu_read_unlock(); 2698 2705 if (err) 2699 2706 goto nla_put_failure;