Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 22 Jan 2000 08:39:27 -0800 (PST)
From:      peter.edwards@ireland.com
To:        freebsd-gnats-submit@FreeBSD.org
Subject:   kern/16299: nfs.ko can be unloaded when nfsd is running, leading to a panic later
Message-ID:  <20000122163927.163A614E1D@hub.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         16299
>Category:       kern
>Synopsis:       nfs.ko can be unloaded when nfsd is running, leading to a panic later
>Confidential:   no
>Severity:       serious
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sat Jan 22 08:40:01 PST 2000
>Closed-Date:
>Last-Modified:
>Originator:     Peter Edwards
>Release:        -current (~Jan 18 2000)
>Organization:
>Environment:
FreeBSD 4.0-CURRENT #0: Wed Jan 19 19:12:52 GMT 2000
>Description:
You can unload the nfs module while nfsd is running
When nfsd dies later, you will probably end up panicing.	
>How-To-Repeat:
# kldunload nfs
# ps ax | awk '/nfsd/ { print $1 }' | xargs kill -9
>Fix:
Patches: (sorry for cut-n-paste whitespace, but I've no MX available to
send a proper mail. Anyway, the change is pretty small..)

*** nfs_syscalls.c.old  Sat Jan 22 16:15:02 2000
--- nfs_syscalls.c      Sat Jan 22 16:24:36 2000
***************
*** 103,108 ****
--- 103,109 ----
  
  #ifndef NFS_NOSERVER
  int nfsd_waiting = 0;
+ int nfs_server_daemons; /* number of active nfsd processes. */
  static struct nfsdrt nfsdrt;
  static int nfs_numnfsd = 0;
  static int notstarted = 1;
***************
*** 303,309 ****
--- 304,312 ----
                }
                if ((uap->flag & NFSSVC_AUTHINFAIL) && (nfsd = nsd->nsd_nfsd))
                        nfsd->nfsd_flag |= NFSD_AUTHFAIL;
+               nfs_server_daemons++;
                error = nfssvc_nfsd(nsd, uap->argp, p);
+               nfs_server_daemons--;
        }
  #endif /* NFS_NOSERVER */
        if (error == EINTR || error == ERESTART)



*** nfs_subs.c.old      Sat Jan 22 16:15:02 2000
--- nfs_subs.c  Sat Jan 22 16:26:17 2000
***************
*** 150,155 ****
--- 150,157 ----
        NFSPROC_NOOP
  };
  
+ extern int nfs_server_daemons;
+ 
  #endif /* NFS_NOSERVER */
  /*
   * and the reverse mapping from generic to Version 2 procedure numbers
***************
*** 1183,1188 ****
--- 1185,1192 ----
        untimeout(nfs_timer, (void *)NULL, nfs_timer_handle);
        nfs_mount_type = -1;
  #ifndef NFS_NOSERVER
+       if (nfs_server_daemons)
+           return EBUSY;
        default_vnodeop_p[VOFFSET(vop_lease)] = nfs_prev_vop_lease_check;
  #endif
        lease_updatetime = nfs_prev_lease_updatetime;





>Release-Note:
>Audit-Trail:
>Unformatted:


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20000122163927.163A614E1D>