[NET]: Add a dev_ioctl() fallback to sock_ioctl()
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 <hch@lst.de> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
5ff7630e4a
commit
b5e5fa5e09
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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*/
|
||||
|
|
|
@ -959,7 +959,7 @@ out:
|
|||
static int llc_ui_ioctl(struct socket *sock, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
return dev_ioctl(cmd, (void __user *)arg);
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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*/
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue