Skip to content

Commit

Permalink
[NET]: Add a dev_ioctl() fallback to sock_ioctl()
Browse files Browse the repository at this point in the history
Currently all network protocols need to call dev_ioctl as the default
fallback in their ioctl implementations.  This patch adds a fallback
to dev_ioctl to sock_ioctl if the protocol returned -ENOIOCTLCMD.
This way all the procotol ioctl handlers can be simplified and we don't
need to export dev_ioctl.

Signed-off-by: Christoph Hellwig <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
Christoph Hellwig authored and davem330 committed Jan 3, 2006
1 parent 5ff7630 commit b5e5fa5
Show file tree
Hide file tree
Showing 17 changed files with 27 additions and 40 deletions.
19 changes: 1 addition & 18 deletions net/appletalk/ddp.c
Original file line number Diff line number Diff line change
Expand Up @@ -1763,7 +1763,7 @@ static int atalk_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr
*/
static int atalk_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
{
int rc = -EINVAL;
int rc = -ENOIOCTLCMD;
struct sock *sk = sock->sk;
void __user *argp = (void __user *)arg;

Expand Down Expand Up @@ -1813,23 +1813,6 @@ static int atalk_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
rc = atif_ioctl(cmd, argp);
rtnl_unlock();
break;
/* Physical layer ioctl calls */
case SIOCSIFLINK:
case SIOCGIFHWADDR:
case SIOCSIFHWADDR:
case SIOCGIFFLAGS:
case SIOCSIFFLAGS:
case SIOCGIFTXQLEN:
case SIOCSIFTXQLEN:
case SIOCGIFMTU:
case SIOCGIFCONF:
case SIOCADDMULTI:
case SIOCDELMULTI:
case SIOCGIFCOUNT:
case SIOCGIFINDEX:
case SIOCGIFNAME:
rc = dev_ioctl(cmd, argp);
break;
}

return rc;
Expand Down
2 changes: 1 addition & 1 deletion net/ax25/af_ax25.c
Original file line number Diff line number Diff line change
Expand Up @@ -1827,7 +1827,7 @@ static int ax25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
break;

default:
res = dev_ioctl(cmd, argp);
res = -ENOIOCTLCMD;
break;
}
release_sock(sk);
Expand Down
1 change: 0 additions & 1 deletion net/core/dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -3276,7 +3276,6 @@ EXPORT_SYMBOL(dev_close);
EXPORT_SYMBOL(dev_get_by_flags);
EXPORT_SYMBOL(dev_get_by_index);
EXPORT_SYMBOL(dev_get_by_name);
EXPORT_SYMBOL(dev_ioctl);
EXPORT_SYMBOL(dev_open);
EXPORT_SYMBOL(dev_queue_xmit);
EXPORT_SYMBOL(dev_remove_pack);
Expand Down
2 changes: 1 addition & 1 deletion net/decnet/af_decnet.c
Original file line number Diff line number Diff line change
Expand Up @@ -1252,7 +1252,7 @@ static int dn_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
break;

default:
err = dev_ioctl(cmd, (void __user *)arg);
err = -ENOIOCTLCMD;
break;
}

Expand Down
2 changes: 1 addition & 1 deletion net/econet/af_econet.c
Original file line number Diff line number Diff line change
Expand Up @@ -687,7 +687,7 @@ static int econet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg
break;

default:
return dev_ioctl(cmd, argp);
return -ENOIOCTLCMD;
}
/*NOTREACHED*/
return 0;
Expand Down
8 changes: 4 additions & 4 deletions net/ipv4/af_inet.c
Original file line number Diff line number Diff line change
Expand Up @@ -777,10 +777,10 @@ int inet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
err = devinet_ioctl(cmd, (void __user *)arg);
break;
default:
if (!sk->sk_prot->ioctl ||
(err = sk->sk_prot->ioctl(sk, cmd, arg)) ==
-ENOIOCTLCMD)
err = dev_ioctl(cmd, (void __user *)arg);
if (sk->sk_prot->ioctl)
err = sk->sk_prot->ioctl(sk, cmd, arg);
else
err = -ENOIOCTLCMD;
break;
}
return err;
Expand Down
8 changes: 3 additions & 5 deletions net/ipv6/af_inet6.c
Original file line number Diff line number Diff line change
Expand Up @@ -434,7 +434,6 @@ int inet6_getname(struct socket *sock, struct sockaddr *uaddr,
int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
{
struct sock *sk = sock->sk;
int err = -EINVAL;

switch(cmd)
{
Expand All @@ -453,10 +452,9 @@ int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
case SIOCSIFDSTADDR:
return addrconf_set_dstaddr((void __user *) arg);
default:
if (!sk->sk_prot->ioctl ||
(err = sk->sk_prot->ioctl(sk, cmd, arg)) == -ENOIOCTLCMD)
return(dev_ioctl(cmd,(void __user *) arg));
return err;
if (!sk->sk_prot->ioctl)
return -ENOIOCTLCMD;
return sk->sk_prot->ioctl(sk, cmd, arg);
}
/*NOTREACHED*/
return(0);
Expand Down
2 changes: 1 addition & 1 deletion net/ipx/af_ipx.c
Original file line number Diff line number Diff line change
Expand Up @@ -1884,7 +1884,7 @@ static int ipx_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
rc = -EINVAL;
break;
default:
rc = dev_ioctl(cmd, argp);
rc = -ENOIOCTLCMD;
break;
}

Expand Down
2 changes: 1 addition & 1 deletion net/irda/af_irda.c
Original file line number Diff line number Diff line change
Expand Up @@ -1822,7 +1822,7 @@ static int irda_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
return -EINVAL;
default:
IRDA_DEBUG(1, "%s(), doing device ioctl!\n", __FUNCTION__);
return dev_ioctl(cmd, (void __user *) arg);
return -ENOIOCTLCMD;
}

/*NOTREACHED*/
Expand Down
2 changes: 1 addition & 1 deletion net/llc/af_llc.c
Original file line number Diff line number Diff line change
Expand Up @@ -959,7 +959,7 @@ static int llc_ui_getname(struct socket *sock, struct sockaddr *uaddr,
static int llc_ui_ioctl(struct socket *sock, unsigned int cmd,
unsigned long arg)
{
return dev_ioctl(cmd, (void __user *)arg);
return -ENOIOCTLCMD;
}

/**
Expand Down
2 changes: 1 addition & 1 deletion net/netrom/af_netrom.c
Original file line number Diff line number Diff line change
Expand Up @@ -1215,7 +1215,7 @@ static int nr_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
return nr_rt_ioctl(cmd, argp);

default:
return dev_ioctl(cmd, argp);
return -ENOIOCTLCMD;
}

return 0;
Expand Down
2 changes: 1 addition & 1 deletion net/packet/af_packet.c
Original file line number Diff line number Diff line change
Expand Up @@ -1521,7 +1521,7 @@ static int packet_ioctl(struct socket *sock, unsigned int cmd,
#endif

default:
return dev_ioctl(cmd, (void __user *)arg);
return -ENOIOCTLCMD;
}
return 0;
}
Expand Down
2 changes: 1 addition & 1 deletion net/rose/af_rose.c
Original file line number Diff line number Diff line change
Expand Up @@ -1320,7 +1320,7 @@ static int rose_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
return 0;

default:
return dev_ioctl(cmd, argp);
return -ENOIOCTLCMD;
}

return 0;
Expand Down
7 changes: 7 additions & 0 deletions net/socket.c
Original file line number Diff line number Diff line change
Expand Up @@ -900,6 +900,13 @@ static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg)
break;
default:
err = sock->ops->ioctl(sock, cmd, arg);

/*
* If this ioctl is unknown try to hand it down
* to the NIC driver.
*/
if (err == -ENOIOCTLCMD)
err = dev_ioctl(cmd, argp);
break;
}
return err;
Expand Down
2 changes: 1 addition & 1 deletion net/unix/af_unix.c
Original file line number Diff line number Diff line change
Expand Up @@ -1859,7 +1859,7 @@ static int unix_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
}

default:
err = dev_ioctl(cmd, (void __user *)arg);
err = -ENOIOCTLCMD;
break;
}
return err;
Expand Down
2 changes: 1 addition & 1 deletion net/wanrouter/af_wanpipe.c
Original file line number Diff line number Diff line change
Expand Up @@ -1839,7 +1839,7 @@ static int wanpipe_ioctl(struct socket *sock, unsigned int cmd, unsigned long ar
#endif

default:
return dev_ioctl(cmd,(void __user *) arg);
return -ENOIOCTLCMD;
}
/*NOTREACHED*/
}
Expand Down
2 changes: 1 addition & 1 deletion net/x25/af_x25.c
Original file line number Diff line number Diff line change
Expand Up @@ -1378,7 +1378,7 @@ static int x25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
}

default:
rc = dev_ioctl(cmd, argp);
rc = -ENOIOCTLCMD;
break;
}

Expand Down

0 comments on commit b5e5fa5

Please sign in to comment.