After this mechanical move, I can unlock the individual SIOCG* in there.

OK?

Index: if.c
===================================================================
RCS file: /cvs/src/sys/net/if.c,v
retrieving revision 1.667
diff -u -p -r1.667 if.c
--- if.c        8 Nov 2022 15:20:24 -0000       1.667
+++ if.c        8 Nov 2022 15:26:07 -0000
@@ -2426,33 +2426,43 @@ ifioctl_get(u_long cmd, caddr_t data)
        size_t bytesdone;
        const char *label;
 
-       KERNEL_LOCK();
-
        switch(cmd) {
        case SIOCGIFCONF:
+               KERNEL_LOCK();
                NET_LOCK_SHARED();
                error = ifconf(data);
                NET_UNLOCK_SHARED();
+               KERNEL_UNLOCK();
                return (error);
        case SIOCIFGCLONERS:
+               KERNEL_LOCK();
                error = if_clone_list((struct if_clonereq *)data);
+               KERNEL_UNLOCK();
                return (error);
        case SIOCGIFGMEMB:
+               KERNEL_LOCK();
                NET_LOCK_SHARED();
                error = if_getgroupmembers(data);
                NET_UNLOCK_SHARED();
+               KERNEL_UNLOCK();
                return (error);
        case SIOCGIFGATTR:
+               KERNEL_LOCK();
                NET_LOCK_SHARED();
                error = if_getgroupattribs(data);
                NET_UNLOCK_SHARED();
+               KERNEL_UNLOCK();
                return (error);
        case SIOCGIFGLIST:
+               KERNEL_LOCK();
                NET_LOCK_SHARED();
                error = if_getgrouplist(data);
                NET_UNLOCK_SHARED();
+               KERNEL_UNLOCK();
                return (error);
        }
+
+       KERNEL_LOCK();
 
        ifp = if_unit(ifr->ifr_name);
        if (ifp == NULL) {

Reply via email to