Commit a2fea5f1 authored by Urs Thuermann's avatar Urs Thuermann Committed by David S. Miller
Browse files

[CAN]: Move proto_{,un}register() out of spin-locked region



The implementation of proto_register() has changed so that it can now
sleep.  The call to proto_register() must be moved out of the
spin-locked region.

Signed-off-by: default avatarUrs Thuermann <urs.thuermann@volkswagen.de>
Signed-off-by: default avatarOliver Hartkopp <oliver.hartkopp@volkswagen.de>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 5423dd67
Loading
Loading
Loading
Loading
+14 −13
Original line number Diff line number Diff line
@@ -656,27 +656,27 @@ int can_proto_register(struct can_proto *cp)
		return -EINVAL;
	}

	err = proto_register(cp->prot, 0);
	if (err < 0)
		return err;

	spin_lock(&proto_tab_lock);
	if (proto_tab[proto]) {
		printk(KERN_ERR "can: protocol %d already registered\n",
		       proto);
		err = -EBUSY;
		goto errout;
	}

	err = proto_register(cp->prot, 0);
	if (err < 0)
		goto errout;

	} else {
		proto_tab[proto] = cp;

	/* use generic ioctl function if the module doesn't bring its own */
		/* use generic ioctl function if not defined by module */
		if (!cp->ops->ioctl)
			cp->ops->ioctl = can_ioctl;

 errout:
	}
	spin_unlock(&proto_tab_lock);

	if (err < 0)
		proto_unregister(cp->prot);

	return err;
}
EXPORT_SYMBOL(can_proto_register);
@@ -694,9 +694,10 @@ void can_proto_unregister(struct can_proto *cp)
		printk(KERN_ERR "BUG: can: protocol %d is not registered\n",
		       proto);
	}
	proto_unregister(cp->prot);
	proto_tab[proto] = NULL;
	spin_unlock(&proto_tab_lock);

	proto_unregister(cp->prot);
}
EXPORT_SYMBOL(can_proto_unregister);