Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f9eb7bf4 authored by Andreas Gruenbacher's avatar Andreas Gruenbacher Committed by Jens Axboe
Browse files

drbd: Fix rcu_read_lock balance on error path

parent 6110d70b
Loading
Loading
Loading
Loading
+12 −7
Original line number Original line Diff line number Diff line
@@ -2658,7 +2658,6 @@ int nla_put_status_info(struct sk_buff *skb, struct drbd_conf *mdev,
		const struct sib_info *sib)
		const struct sib_info *sib)
{
{
	struct state_info *si = NULL; /* for sizeof(si->member); */
	struct state_info *si = NULL; /* for sizeof(si->member); */
	struct net_conf *nc;
	struct nlattr *nla;
	struct nlattr *nla;
	int got_ldev;
	int got_ldev;
	int err = 0;
	int err = 0;
@@ -2688,13 +2687,19 @@ int nla_put_status_info(struct sk_buff *skb, struct drbd_conf *mdev,
		goto nla_put_failure;
		goto nla_put_failure;


	rcu_read_lock();
	rcu_read_lock();
	if (got_ldev)
	if (got_ldev) {
		if (disk_conf_to_skb(skb, rcu_dereference(mdev->ldev->disk_conf), exclude_sensitive))
		struct disk_conf *disk_conf;
			goto nla_put_failure;

		disk_conf = rcu_dereference(mdev->ldev->disk_conf);
		err = disk_conf_to_skb(skb, disk_conf, exclude_sensitive);
	}
	if (!err) {
		struct net_conf *nc;


		nc = rcu_dereference(mdev->tconn->net_conf);
		nc = rcu_dereference(mdev->tconn->net_conf);
		if (nc)
		if (nc)
			err = net_conf_to_skb(skb, nc, exclude_sensitive);
			err = net_conf_to_skb(skb, nc, exclude_sensitive);
	}
	rcu_read_unlock();
	rcu_read_unlock();
	if (err)
	if (err)
		goto nla_put_failure;
		goto nla_put_failure;