summaryrefslogtreecommitdiffstats
path: root/sys/nfsserver
Commit message (Collapse)AuthorAgeFilesLines
* When parsing an RPC request in nfsrv_dorec(), KASSERT that theresimon2006-03-081-0/+1
| | | | | | | | | actually is an mbuf to process. This catches the missing mbuf before it would otherwise causes a NULL pointer dereference, which could be triggered by a 0 length RPC record before the check for such records was added in rev 1.97. Approved by: cperciva (mentor)
* Correct a remote kernel panic when processing zero-length RPC recordssimon2006-03-011-1/+1
| | | | | | | via TCP. [06:10] Security: FreeBSD-SA-06:10.nfs Approved by: cperciva
* - Reorder calls to vrele() after calls to vput() when the vrele is ajeff2006-02-012-39/+38
| | | | | | | | | | | | directory. vrele() may lock the passed vnode, which in these cases would give an invalid lock order of child -> parent. These situations are deadlock prone although do not typically deadlock because the vrele is typically not releasing the last reference to the vnode. Users of vrele must consider it as a call to vn_lock() and order it appropriately. MFC After: 1 week Sponsored by: Isilon Systems, Inc. Tested by: kkenn
* Manage the ucred for the NFS server using the crget/crfree API defined incsjp2006-01-284-39/+47
| | | | | | | | | | | | | | | | | | | | kern_prot.c. This API handles reference counting among many other things. Notably, if MAC is compiled into the kernel, it will properly initialize the MAC labels when the ucred is allocated. This work is in preparation for a new MAC entry point which will be responsible for properly initializing policy specific labels for the NFS server credential. Utilization of the crfree/crget APIs reduce the complexity associated with this label's management. Submitted by: green (with changes) [1] Obtained from: TrustedBSD Project Discussed with: rwatson, alfred [1] I moved the ucred allocation outside the scope of the NFS server lock to prevent M_WAIKOK allocations from occurring with non-sleep-able locks held. Additionally, to reduce complexity, the ucred persist as long as the NFS server descriptor.
* Revert my previous commit.trhodes2006-01-231-0/+11
| | | | Proved I'm not that bright at times: jhb
* Fix indentation.trhodes2006-01-231-7/+7
| | | | Prodded by: stefanf, ru, njl (in that order)
* Remove some dead code.trhodes2006-01-211-18/+7
| | | | Found with: Coverity Prevent(tm)
* Normalize a significant number of kernel malloc type names:rwatson2005-10-311-3/+3
| | | | | | | | | | | | | | | | | | | - Prefer '_' to ' ', as it results in more easily parsed results in memory monitoring tools such as vmstat. - Remove punctuation that is incompatible with using memory type names as file names, such as '/' characters. - Disambiguate some collisions by adding subsystem prefixes to some memory types. - Generally prefer lower case to upper case. - If the same type is defined in multiple architecture directories, attempt to use the same name in additional cases. Not all instances were caught in this change, so more work is required to finish this conversion. Similar changes are required for UMA zone names.
* Keep locks consistent before goto.glebius2005-10-271-0/+4
| | | | | Reported by: pho Reviewed by: mohans
* Use the refcount API to manage the reference count for user credentialsjhb2005-09-272-5/+6
| | | | | | rather than using pool mutexes. Tested on: i386, alpha, sparc64
* NFS write gathering defers execution of NFS server write requests to waitrwatson2005-04-172-5/+23
| | | | | | | | | | | | | | | | | | to see if additional write requests will arrive that can be coalesced and clustered with earlier ones. When doing so, it must determine whether the two requests are made by credentials with the same access writes, so as not to coalesce improperly. NFSW_SAMECRED() implements a test of two credentials using a binary compare. Replace NFSW_SAMECRED() macro with nfsrv_samecred() function, which is aware of the contents and layout of a struct ucred, rather than a simple binary compare. While the binary compare works when ucred is simply a zero'd and embedded 'struct ucred' in the NFS descriptor, it will work less well when the ucred associated with an NFS descriptor is "real", so has defined and populated reference count, mutex, etc. MFC after: 1 week Obtained from: TrustedBSD Project
* avoid potential null ptr deref by free'ing excess mbufs instead ofsam2005-03-281-2/+4
| | | | | | | zero'ing their length (copied from m_adj where this code came from after the equivalent change there has had time to soak) Noticed by: Coverity Prevent analysis tool
* Do not do write gathering for NFSv3, since it makes no sense unlessdelphij2005-03-261-1/+2
| | | | | | | the client is broken and does sync writes all the time. Obtained from: NetBSD (sys/nfs/nfs_syscalls.c,v 1.44) Reviewed by: -arch (bde)
* Don't try to create vnode_pager objects on other filesystems vnodes,phk2005-01-243-18/+0
| | | | either they did it themselves or it won't happen.
* Now that we have a non blocking version of nfsm_dissect(), change all theps2005-01-193-41/+41
| | | | | | nfsm_dissect() calls (done under the NFSD lock) to nfsm_dissect_nonblock(). Submitted by: Mohan Srinivasan
* Ditch vfs_object_create() and make the callers call VOP_CREATEVOBJECT()phk2005-01-131-1/+1
| | | | directly.
* Remove the unused credential argument from VOP_FSYNC() and VFS_SYNC().phk2005-01-111-1/+1
| | | | | | | | | | | | | | | | | | I'm not sure why a credential was added to these in the first place, it is not used anywhere and it doesn't make much sense: The credentials for syncing a file (ability to write to the file) should be checked at the system call level. Credentials for syncing one or more filesystems ("none") should be checked at the system call level as well. If the filesystem implementation needs a particular credential to carry out the syncing it would logically have to the cached mount credential, or a credential cached along with any delayed write data. Discussed with: rwatson
* /* -> /*- for license, minor formatting changesimp2005-01-079-9/+9
|
* Correct a bug in nfsrv_create() where a call to nfsrv_access() mightrwatson2004-11-111-38/+52
| | | | | | | | | | | | | be made holding the NFS server mutex. To clean this up, introduce a version of the function, nfsrv_access_withgiant(), that expects the NFS server mutex to already have been dropped and Giant acquired. Wrap nfsrv_access() around this. This permits callers to more efficiently check access if they're in a code block performing VFS operations, and can be substitited for the nfsrv_access() call that triggered this bug. PR: 73807, 73208 MFC after: 1 week
* Add b_bufobj to struct buf which eventually will eliminate the need for b_vp.phk2004-10-221-1/+1
| | | | | | | | | | | | | | | | | | Initialize b_bufobj for all buffers. Make incore() and gbincore() take a bufobj instead of a vnode. Make inmem() local to vfs_bio.c Change a lot of VI_[UN]LOCK(bp->b_vp) to BO_[UN]LOCK(bp->b_bufobj) also VI_MTX() to BO_MTX(), Make buf_vlist_add() take a bufobj instead of a vnode. Eliminate other uses of bp->b_vp where bp->b_bufobj will do. Various minor polishing: remove "register", turn panic into KASSERT, use new function declarations, TAILQ_FOREACH_SAFE() etc.
* Correct several instances where calls to vfs_getvfs() resulting inrwatson2004-10-181-13/+61
| | | | | | | | | | | failure in the NFS server would result in a leaked instance of the NFS server subsystem lock. Liberally sprinkle assertions in all target labels for error unwinding to assert the desired locking state. RELENG_5_3 candidate. MFC after: 3 days Reported by: Wilkinson, Alex <alex dot wilkinson at dsto dot defence dot gov dot au>
* Convert a mtx_lock(&Giant) to a mtx_unlock(&Giant) in nfsrv_link() torwatson2004-08-251-1/+1
| | | | | | | | | prevent leakage of Giant. With INVARIANTS, this results in an assertion failure following execution of the RPC. Without INVARIANTS, it could result in problems if the NFS server is killed causing nfsd to return to user space holding Giant. Feet provided by: brueffer
* If debug.mpsafenet is non-zero, run the NFS server callout withoutrwatson2004-07-241-1/+4
| | | | Giant.
* Remove spl() use from nfsrv_timer.rwatson2004-07-241-3/+0
|
* Do a pass over all modules in the kernel and make them return EOPNOTSUPPphk2004-07-151-5/+8
| | | | | | | | for unknown events. A number of modules return EINVAL in this instance, and I have left those alone for now and instead taught MOD_QUIESCE to accept this as "didn't do anything".
* Do not call sorecieve() in the context of a socket callback as it causesalfred2004-07-131-3/+5
| | | | | lock order reversals so->inpcb since we're called with the socket lock held.
* Change M_WAITOK argument to sodupsockaddr() to M_NOWAIT. When the callrwatson2004-07-031-1/+5
| | | | | | | | | | | | | to dup_sockaddr() was renamed to sodupsockaddr(), the argument was changed from '1' to 'M_WAITOK', which changed the semantics. This resulted in a WITNESS warning about a potential sleep while holding the NFS server mutex. Now this will no longer happen, restoring a possible bug present in the original code (setting RC_NAM even though the malloc to copy the addres may fail). bde observes that the flag names here should probably not be the same as the malloc flags for name space reasons. Bumped into by: kuriyama
* Merge additional socket buffer locking from rwatson_netperf:rwatson2004-06-171-0/+8
| | | | | | | | | | | | | | | | | | | | | | | | | - Lock down low hanging fruit use of sb_flags with socket buffer lock. - Lock down low hanging fruit use of so_state with socket lock. - Lock down low hanging fruit use of so_options. - Lock down low-hanging fruit use of sb_lowwat and sb_hiwat with socket buffer lock. - Annotate situations in which we unlock the socket lock and then grab the receive socket buffer lock, which are currently actually the same lock. Depending on how we want to play our cards, we may want to coallesce these lock uses to reduce overhead. - Convert a if()->panic() into a KASSERT relating to so_state in soaccept(). - Remove a number of splnet()/splx() references. More complex merging of socket and socket buffer locking to follow.
* Second half of the dev_t cleanup.phk2004-06-171-1/+1
| | | | | | | | | | | The big lines are: NODEV -> NULL NOUDEV -> NODEV udev_t -> dev_t udev2dev() -> findcdev() Various minor adjustments including handling of userland access to kernel space struct cdev etc.
* Giant wasn't dropped here if we have to return EBUSY. This is bad.bmilekic2004-05-311-1/+3
|
* Release NFS subsystem lock and acquire Giant when calling intorwatson2004-05-311-0/+4
| | | | vn_start_write().
* Add an assertion that nfssvc() isn't called with Giant.rwatson2004-05-311-0/+10
| | | | | | | | | Add two additional pairs of assertions, one at the end of the NFS server event loop, and one one exit from the NFS daemon, that assert that if debug.mpsafenet is enabled, Giant is not held, and that if it is not enabled, Giant will be held. This is intended to support debugging scenarios where Giant is "leaked" during NFS processing.
* The NFS server modevent code manually patches the system call table torwatson2004-05-311-1/+1
| | | | | | | | | | | install nfssvc(). It also updates the argument count, but did so without setting SYF_MPSAFE, effectively removing the MPSAFE flag even when syscalls.master indicates it doesn't require Giant. This change forces the modevent to set MPSAFE as a flag to its internal notion of an argument coutn. Note: this duplication of information is a bad thing, but is a more general problem I'm not currently willing to address.
* One more case where we want to drop the NFS server lock and acquirerwatson2004-05-301-1/+6
| | | | | | | Giant when entering VFS. Discovered by code inspection; still not hit without debug.mpsafenet=1. Reported by: bmilekic
* Acquire Giant around two more cases when calling into VFS to vput()rwatson2004-05-301-13/+22
| | | | | | | | | a vnode. Not bumped into with asserts in the main tree because we run the NFS server with Giant by default. Discovered by inspection. Complete annotations of Giant acquisition/release to note that it's only because of VFS that we acquire Giant in most places in the NFS server.
* Don't release Giant until after the call to vput() in nfsrv_setattr().rwatson2004-05-291-1/+1
| | | | Unless running with debug.mpsafenet=1, this was not actually a problem.
* No need to conditionally acquire Giant in nfssvc_nfsd() because itrwatson2004-05-291-2/+0
| | | | | | | is acquired by the caller. Should not cause problems, but causes an unnecessary recursion on Giant. Pointed out by: bmilekic
* Call nfsm_clget_nolock() instead of nfsm_clget() when holding the NFSrwatson2004-05-271-1/+1
| | | | | | subsystem lock to avoid tripping over an assertion regarding whether the lock is held or not. This is likely to be the cause of a panic tripped over by Andrea Campi.
* The socket code upcalls into the NFS server using the so_upcallrwatson2004-05-247-84/+642
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | mechanism so that early processing on mbufs can be performed before a context switch to the NFS server threads. Because of this, if the socket code is running without Giant, the NFS server also needs to be able to run the upcall code without relying on the presence on Giant. This change modifies the NFS server to run using a "giant code lock" covering operation of the whole subsystem. Work is in progress to move to data-based locking as part of the NFSv4 server changes. Introduce an NFS server subsystem lock, 'nfsd_mtx', and a set of macros to operate on the lock: NFSD_LOCK_ASSERT() Assert nfsd_mtx owned by current thread NFSD_UNLOCK_ASSERT() Assert nfsd_mtx not owned by current thread NFSD_LOCK_DONTCARE() Advisory: this function doesn't care NFSD_LOCK() Lock nfsd_mtx NFSD_UNLOCK() Unlock nfsd_mtx Constify a number of global variables/structures in the NFS server code, as they are not modified and contain constants only: nfsrvv2_procid nfsrv_nfsv3_procid nonidempotent nfsv2_repstat nfsv2_type nfsrv_nfsv3_procid nfsrvv2_procid nfsrv_v2errmap nfsv3err_null nfsv3err_getattr nfsv3err_setattr nfsv3err_lookup nfsv3err_access nfsv3err_readlink nfsv3err_read nfsv3err_write nfsv3err_create nfsv3err_mkdir nfsv3err_symlink nfsv3err_mknod nfsv3err_remove nfsv3err_rmdir nfsv3err_rename nfsv3err_link nfsv3err_readdir nfsv3err_readdirplus nfsv3err_fsstat nfsv3err_fsinfo nfsv3err_pathconf nfsv3err_commit nfsrv_v3errmap There are additional structures that should be constified but due to their being passed into general purpose functions without const arguments, I have not yet converted. In general, acquire nfsd_mtx when accessing any of the global NFS structures, including struct nfssvc_sock, struct nfsd, struct nfsrv_descript. Release nfsd_mtx whenever calling into VFS, and acquire Giant for calls into VFS. Giant is not required for any part of the operation of the NFS server with the exception of calls into VFS. Giant will never by acquired in the upcall code path. However, it may operate entirely covered by Giant, or not. If debug.mpsafenet is set to 0, the system calls will acquire Giant across all operations, and the upcall will assert Giant. As such, by default, this enables locking and allows us to test assertions, but should not cause any substantial new amount of code to be run without Giant. Bugs should manifest in the form of lock assertion failures for now. This approach is similar (but not identical) to modifications to the BSD/OS NFS server code snapshot provided by BSDi as part of their SMPng snapshot. The strategy is almost the same (single lock over the NFS server), but differs in the following ways: - Our NFS client and server code bases don't overlap, which means both fewer bugs and easier locking (thanks Peter!). Also means NFSD_*() as opposed to NFS_*(). - We make broad use of assertions, whereas the BSD/OS code does not. - Made slightly different choices about how to handle macros building packets but operating with side effects. - We acquire Giant only when entering VFS from the NFS server daemon threads. - Serious bugs in BSD/OS implementation corrected -- the snapshot we received was clearly a work in progress. Based on ideas from: BSDi SMPng Snapshot Reviewed by: rick@snowhite.cis.uoguelph.ca Extensive testing by: kris
* Don't send the available space as is in the FSSTAT call. Undermux2004-04-121-2/+14
| | | | | | | | | FreeBSD, we can have a negative available space value, but the corresponding fields in the NFS protocol are unsigned. So trnucate the value to 0 if it's negative, so that the client doesn't receive absurdly high values. Tested by: cognet
* Don't let the NFS server module be unloaded as long as there arepeadar2004-04-113-3/+6
| | | | | | | nfsd processes running Reviewed By: iedowse PR: 16299
* Remove advertising clause from University of California Regent'simp2004-04-079-36/+0
| | | | | | | license, per letter dated July 22, 1999 and email from Peter Wemm, Alan Cox and Robert Watson. Approved by: core, peter, alc, rwatson
* Add imperfect comments identifying the function of various nfs socketrwatson2004-04-061-6/+6
| | | | condition flags. Corrections, if appropriate, welcome.
* Spell 2 as SHUT_RDWR when used as an argument to soshutdown().rwatson2004-04-041-1/+1
|
* Explicitly compare pointers with NULL rather than treating a pointer asrwatson2004-04-042-6/+9
| | | | a boolean directly, use NULL instead of 0.
* Calculate NFS timeouts in units of 10ms, not 5ms. This matches the defaultpeter2004-03-141-1/+1
| | | | | | clock precision on i386. This is a NOP change on i386. But this stops the mount_nfs units from suddenly changing to units of 1/20 of a second (vs the normal 1/10 of a second) if HZ is increased.
* Properly vector all bwrite() and BUF_WRITE() calls through the same pathphk2004-03-111-1/+1
| | | | and s/BUF_WRITE()/bwrite()/ since it now does the same as bwrite().
* Convert from timeout to callout API.kan2004-03-073-4/+5
| | | | Submitted by: rwatson
* Rename dup_sockaddr() to sodupsockaddr() for consistency with otherrwatson2004-03-011-2/+2
| | | | | | | | | | | | functions in kern_socket.c. Rename the "canwait" field to "mflags" and pass M_WAITOK and M_NOWAIT in from the caller context rather than "1" or "0". Correct mflags pass into mac_init_socket() from previous commit to not include M_ZERO. Submitted by: sam
* Fix some becuase -> because typos.jhb2003-12-171-1/+1
| | | | Reported by: Marco Wertejuk <wertejuk@mwcis.com>
OpenPOWER on IntegriCloud