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]>

Index: linux-2.6/net/appletalk/ddp.c
===================================================================
--- linux-2.6.orig/net/appletalk/ddp.c  2005-12-25 14:12:07.000000000 +0100
+++ linux-2.6/net/appletalk/ddp.c       2005-12-25 17:16:35.000000000 +0100
@@ -1763,7 +1763,7 @@
  */
 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 @@
                        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;
Index: linux-2.6/net/packet/af_packet.c
===================================================================
--- linux-2.6.orig/net/packet/af_packet.c       2005-12-25 14:12:07.000000000 
+0100
+++ linux-2.6/net/packet/af_packet.c    2005-12-25 16:37:03.000000000 +0100
@@ -1521,7 +1521,7 @@
 #endif
 
                default:
-                       return dev_ioctl(cmd, (void __user *)arg);
+                       return -ENOIOCTLCMD;
        }
        return 0;
 }
Index: linux-2.6/net/rose/af_rose.c
===================================================================
--- linux-2.6.orig/net/rose/af_rose.c   2005-12-25 14:12:07.000000000 +0100
+++ linux-2.6/net/rose/af_rose.c        2005-12-25 18:18:20.000000000 +0100
@@ -1320,7 +1320,7 @@
                return 0;
 
        default:
-               return dev_ioctl(cmd, argp);
+               return -ENOIOCTLCMD;
        }
 
        return 0;
Index: linux-2.6/net/socket.c
===================================================================
--- linux-2.6.orig/net/socket.c 2005-12-25 14:13:26.000000000 +0100
+++ linux-2.6/net/socket.c      2005-12-25 15:27:30.000000000 +0100
@@ -904,6 +904,13 @@
                        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;
Index: linux-2.6/net/unix/af_unix.c
===================================================================
--- linux-2.6.orig/net/unix/af_unix.c   2005-12-25 14:12:07.000000000 +0100
+++ linux-2.6/net/unix/af_unix.c        2005-12-25 16:38:52.000000000 +0100
@@ -1860,7 +1860,7 @@
                }
 
                default:
-                       err = dev_ioctl(cmd, (void __user *)arg);
+                       err = -ENOIOCTLCMD;
                        break;
        }
        return err;
Index: linux-2.6/net/wanrouter/af_wanpipe.c
===================================================================
--- linux-2.6.orig/net/wanrouter/af_wanpipe.c   2005-12-25 14:12:07.000000000 
+0100
+++ linux-2.6/net/wanrouter/af_wanpipe.c        2005-12-25 14:13:42.000000000 
+0100
@@ -1839,7 +1839,7 @@
 #endif
 
                default:
-                       return dev_ioctl(cmd,(void __user *) arg);
+                       return ?ENOIOCTLCMD;
        }
        /*NOTREACHED*/
 }
Index: linux-2.6/net/x25/af_x25.c
===================================================================
--- linux-2.6.orig/net/x25/af_x25.c     2005-12-25 14:12:07.000000000 +0100
+++ linux-2.6/net/x25/af_x25.c  2005-12-25 18:18:32.000000000 +0100
@@ -1378,7 +1378,7 @@
                }
 
                default:
-                       rc = dev_ioctl(cmd, argp);
+                       rc = -ENOIOCTLCMD;
                        break;
        }
 
Index: linux-2.6/net/ax25/af_ax25.c
===================================================================
--- linux-2.6.orig/net/ax25/af_ax25.c   2005-12-25 14:12:07.000000000 +0100
+++ linux-2.6/net/ax25/af_ax25.c        2005-12-25 17:17:50.000000000 +0100
@@ -1827,7 +1827,7 @@
                break;
 
        default:
-               res = dev_ioctl(cmd, argp);
+               res = -ENOIOCTLCMD;
                break;
        }
        release_sock(sk);
Index: linux-2.6/net/core/dev.c
===================================================================
--- linux-2.6.orig/net/core/dev.c       2005-12-25 14:12:07.000000000 +0100
+++ linux-2.6/net/core/dev.c    2005-12-25 14:13:42.000000000 +0100
@@ -3276,7 +3276,6 @@
 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);
Index: linux-2.6/net/decnet/af_decnet.c
===================================================================
--- linux-2.6.orig/net/decnet/af_decnet.c       2005-12-25 14:12:07.000000000 
+0100
+++ linux-2.6/net/decnet/af_decnet.c    2005-12-25 17:22:56.000000000 +0100
@@ -1252,7 +1252,7 @@
                break;
 
        default:
-               err = dev_ioctl(cmd, (void __user *)arg);
+               err = -ENOIOCTLCMD;
                break;
        }
 
Index: linux-2.6/net/econet/af_econet.c
===================================================================
--- linux-2.6.orig/net/econet/af_econet.c       2005-12-25 14:12:07.000000000 
+0100
+++ linux-2.6/net/econet/af_econet.c    2005-12-25 17:24:48.000000000 +0100
@@ -686,7 +686,7 @@
                        break;
 
                default:
-                       return dev_ioctl(cmd, argp);
+                       return -ENOIOCTLCMD;
        }
        /*NOTREACHED*/
        return 0;
Index: linux-2.6/net/ipv4/af_inet.c
===================================================================
--- linux-2.6.orig/net/ipv4/af_inet.c   2005-12-25 14:12:07.000000000 +0100
+++ linux-2.6/net/ipv4/af_inet.c        2005-12-25 16:35:15.000000000 +0100
@@ -775,10 +775,10 @@
                        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;
Index: linux-2.6/net/ipv6/af_inet6.c
===================================================================
--- linux-2.6.orig/net/ipv6/af_inet6.c  2005-12-25 14:12:07.000000000 +0100
+++ linux-2.6/net/ipv6/af_inet6.c       2005-12-25 18:17:11.000000000 +0100
@@ -431,7 +431,6 @@
 int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
 {
        struct sock *sk = sock->sk;
-       int err = -EINVAL;
 
        switch(cmd) 
        {
@@ -450,10 +449,9 @@
        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);
Index: linux-2.6/net/ipx/af_ipx.c
===================================================================
--- linux-2.6.orig/net/ipx/af_ipx.c     2005-12-25 14:12:07.000000000 +0100
+++ linux-2.6/net/ipx/af_ipx.c  2005-12-25 18:17:23.000000000 +0100
@@ -1884,7 +1884,7 @@
                rc = -EINVAL;
                break;
        default:
-               rc = dev_ioctl(cmd, argp);
+               rc = -ENOIOCTLCMD;
                break;
        }
 
Index: linux-2.6/net/irda/af_irda.c
===================================================================
--- linux-2.6.orig/net/irda/af_irda.c   2005-12-25 14:12:07.000000000 +0100
+++ linux-2.6/net/irda/af_irda.c        2005-12-25 18:17:37.000000000 +0100
@@ -1821,7 +1821,7 @@
                return -EINVAL;
        default:
                IRDA_DEBUG(1, "%s(), doing device ioctl!\n", __FUNCTION__);
-               return dev_ioctl(cmd, (void __user *) arg);
+               return -ENOIOCTLCMD;
        }
 
        /*NOTREACHED*/
Index: linux-2.6/net/llc/af_llc.c
===================================================================
--- linux-2.6.orig/net/llc/af_llc.c     2005-12-25 14:12:07.000000000 +0100
+++ linux-2.6/net/llc/af_llc.c  2005-12-25 18:17:52.000000000 +0100
@@ -960,7 +960,7 @@
 static int llc_ui_ioctl(struct socket *sock, unsigned int cmd,
                        unsigned long arg)
 {
-       return dev_ioctl(cmd, (void __user *)arg);
+       return -ENOIOCTLCMD;
 }
 
 /**
Index: linux-2.6/net/netrom/af_netrom.c
===================================================================
--- linux-2.6.orig/net/netrom/af_netrom.c       2005-12-25 14:13:41.000000000 
+0100
+++ linux-2.6/net/netrom/af_netrom.c    2005-12-25 18:18:07.000000000 +0100
@@ -1215,7 +1215,7 @@
                return nr_rt_ioctl(cmd, argp);
 
        default:
-               return dev_ioctl(cmd, argp);
+               return -ENOIOCTLCMD;
        }
 
        return 0;
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to