Skip to content

Commit af65bdf

Browse files
kaberDavid S. Miller
authored andcommitted
[NETLINK]: Switch cb_lock spinlock to mutex and allow to override it
Switch cb_lock to mutex and allow netlink kernel users to override it with a subsystem specific mutex for consistent locking in dump callbacks. All netlink_dump_start users have been audited not to rely on any side-effects of the previously used spinlock. Signed-off-by: Patrick McHardy <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent b076deb commit af65bdf

File tree

20 files changed

+47
-34
lines changed

20 files changed

+47
-34
lines changed

drivers/connector/connector.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,7 @@ static int __devinit cn_init(void)
448448

449449
dev->nls = netlink_kernel_create(NETLINK_CONNECTOR,
450450
CN_NETLINK_USERS + 0xf,
451-
dev->input, THIS_MODULE);
451+
dev->input, NULL, THIS_MODULE);
452452
if (!dev->nls)
453453
return -EIO;
454454

drivers/scsi/scsi_netlink.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,8 @@ scsi_netlink_init(void)
168168
}
169169

170170
scsi_nl_sock = netlink_kernel_create(NETLINK_SCSITRANSPORT,
171-
SCSI_NL_GRP_CNT, scsi_nl_rcv, THIS_MODULE);
171+
SCSI_NL_GRP_CNT, scsi_nl_rcv, NULL,
172+
THIS_MODULE);
172173
if (!scsi_nl_sock) {
173174
printk(KERN_ERR "%s: register of recieve handler failed\n",
174175
__FUNCTION__);

drivers/scsi/scsi_transport_iscsi.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1435,7 +1435,7 @@ static __init int iscsi_transport_init(void)
14351435
if (err)
14361436
goto unregister_conn_class;
14371437

1438-
nls = netlink_kernel_create(NETLINK_ISCSI, 1, iscsi_if_rx,
1438+
nls = netlink_kernel_create(NETLINK_ISCSI, 1, iscsi_if_rx, NULL,
14391439
THIS_MODULE);
14401440
if (!nls) {
14411441
err = -ENOBUFS;

fs/ecryptfs/netlink.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ int ecryptfs_init_netlink(void)
229229

230230
ecryptfs_nl_sock = netlink_kernel_create(NETLINK_ECRYPTFS, 0,
231231
ecryptfs_receive_nl_message,
232-
THIS_MODULE);
232+
NULL, THIS_MODULE);
233233
if (!ecryptfs_nl_sock) {
234234
rc = -EIO;
235235
ecryptfs_printk(KERN_ERR, "Failed to create netlink socket\n");

include/linux/netlink.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,10 @@ struct netlink_skb_parms
157157
#define NETLINK_CREDS(skb) (&NETLINK_CB((skb)).creds)
158158

159159

160-
extern struct sock *netlink_kernel_create(int unit, unsigned int groups, void (*input)(struct sock *sk, int len), struct module *module);
160+
extern struct sock *netlink_kernel_create(int unit, unsigned int groups,
161+
void (*input)(struct sock *sk, int len),
162+
struct mutex *cb_mutex,
163+
struct module *module);
161164
extern void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err);
162165
extern int netlink_has_listeners(struct sock *sk, unsigned int group);
163166
extern int netlink_unicast(struct sock *ssk, struct sk_buff *skb, __u32 pid, int nonblock);

kernel/audit.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -795,7 +795,7 @@ static int __init audit_init(void)
795795
printk(KERN_INFO "audit: initializing netlink socket (%s)\n",
796796
audit_default ? "enabled" : "disabled");
797797
audit_sock = netlink_kernel_create(NETLINK_AUDIT, 0, audit_receive,
798-
THIS_MODULE);
798+
NULL, THIS_MODULE);
799799
if (!audit_sock)
800800
audit_panic("cannot initialize netlink socket");
801801
else

lib/kobject_uevent.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ EXPORT_SYMBOL_GPL(add_uevent_var);
293293
static int __init kobject_uevent_init(void)
294294
{
295295
uevent_sock = netlink_kernel_create(NETLINK_KOBJECT_UEVENT, 1, NULL,
296-
THIS_MODULE);
296+
NULL, THIS_MODULE);
297297

298298
if (!uevent_sock) {
299299
printk(KERN_ERR

net/bridge/netfilter/ebt_ulog.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ static int __init ebt_ulog_init(void)
302302
}
303303

304304
ebtulognl = netlink_kernel_create(NETLINK_NFLOG, EBT_ULOG_MAXNLGROUPS,
305-
NULL, THIS_MODULE);
305+
NULL, NULL, THIS_MODULE);
306306
if (!ebtulognl)
307307
ret = -ENOMEM;
308308
else if ((ret = ebt_register_watcher(&ulog)))

net/core/rtnetlink.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -972,7 +972,7 @@ void __init rtnetlink_init(void)
972972
panic("rtnetlink_init: cannot allocate rta_buf\n");
973973

974974
rtnl = netlink_kernel_create(NETLINK_ROUTE, RTNLGRP_MAX, rtnetlink_rcv,
975-
THIS_MODULE);
975+
NULL, THIS_MODULE);
976976
if (rtnl == NULL)
977977
panic("rtnetlink_init: cannot initialize rtnetlink\n");
978978
netlink_set_nonroot(NETLINK_ROUTE, NL_NONROOT_RECV);

net/decnet/netfilter/dn_rtmsg.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ static int __init dn_rtmsg_init(void)
138138
int rv = 0;
139139

140140
dnrmg = netlink_kernel_create(NETLINK_DNRTMSG, DNRNG_NLGRP_MAX,
141-
dnrmg_receive_user_sk, THIS_MODULE);
141+
dnrmg_receive_user_sk, NULL, THIS_MODULE);
142142
if (dnrmg == NULL) {
143143
printk(KERN_ERR "dn_rtmsg: Cannot create netlink socket");
144144
return -ENOMEM;

0 commit comments

Comments
 (0)