summaryrefslogtreecommitdiffstats
path: root/sys/ufs
Commit message (Collapse)AuthorAgeFilesLines
...
* Initialize the inode i_flag field in ffs_valloc() to clean up anytruckman2005-10-031-0/+1
| | | | | | | | | | | | | | | | | stale flag bits left over from before the inode was recycled. Without this change, a leftover IN_SPACECOUNTED flag could prevent softdep_freefile() and softdep_releasefile() from incrementing fs_pendinginodes. Because handle_workitem_freefile() unconditionally decrements fs_pendinginodes, a negative value could be reported at file system unmount time with a message like: unmount pending error: blocks 0 files -3 The pending block count in fs_pendingblocks could also be negative for similar reasons. These errors can cause the data returned by statfs() to be slightly incorrect. Some other cleanup code in softdep_releasefile() could also be incorrectly bypassed. MFC after: 3 days
* Correct previous commit to fix the sense of the TDP_NORUNNINGBUFtruckman2005-10-011-1/+1
| | | | | | | | | check in ffs_copyonwrite() that is a precondition for calling waitrunningbufspace(). Pointed out by: tegge Pointy hat to: truckman MFC after: 3 days
* Un-staticize waitrunningbufspace() and call it before returning fromtruckman2005-09-301-1/+13
| | | | | | | ffs_copyonwrite() if any async writes were launched. Restore the threads previous TDP_NORUNNINGBUF state before returning from ffs_copyonwrite().
* Un-staticize runningbufwakeup() and staticize updateproc.truckman2005-09-301-4/+16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Add a new private thread flag to indicate that the thread should not sleep if runningbufspace is too large. Set this flag on the bufdaemon and syncer threads so that they skip the waitrunningbufspace() call in bufwrite() rather than than checking the proc pointer vs. the known proc pointers for these two threads. A way of preventing these threads from being starved for I/O but still placing limits on their outstanding I/O would be desirable. Set this flag in ffs_copyonwrite() to prevent bufwrite() calls from blocking on the runningbufspace check while holding snaplk. This prevents snaplk from being held for an arbitrarily long period of time if runningbufspace is high and greatly reduces the contention for snaplk. The disadvantage is that ffs_copyonwrite() can start a large amount of I/O if there are a large number of snapshots, which could cause a deadlock in other parts of the code. Call runningbufwakeup() in ffs_copyonwrite() to decrement runningbufspace before attempting to grab snaplk so that I/O requests waiting on snaplk are not counted in runningbufspace as being in-progress. Increment runningbufspace again before actually launching the original I/O request. Prior to the above two changes, the system could deadlock if enough I/O requests were blocked by snaplk to prevent runningbufspace from falling below lorunningspace and one of the bawrite() calls in ffs_copyonwrite() blocked in waitrunningbufspace() while holding snaplk. See <http://www.holm.cc/stress/log/cons143.html>
* After a rmdir()ed directory has been truncated, force an update oftruckman2005-09-291-0/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | the directory's inode after queuing the dirrem that will decrement the parent directory's link count. This will force the update of the parent directory's actual link to actually be scheduled. Without this change the parent directory's actual link count would not be updated until ufs_inactive() cleared the inode of the newly removed directory, which might be deferred indefinitely. ufs_inactive() will not be called as long as any process holds a reference to the removed directory, and ufs_inactive() will not clear the inode if the link count is non-zero, which could be the result of an earlier system crash. If a background fsck is run before the update of the parent directory's actual link count has been performed, or at least scheduled by putting the dirrem on the leaf directory's inodedep id_bufwait list, fsck will corrupt the file system by decrementing the parent directory's effective link count, which was previously correct because it already took the removal of the leaf directory into account, and setting the actual link count to the same value as the effective link count after the dangling, removed, leaf directory has been removed. This happens because fsck acts based on the actual link count, which will be too high when fsck creates the file system snapshot that it references. This change has the fortunate side effect of more quickly cleaning up the large number dirrem structures that linger for an extended time after the removal of a large directory tree. It also fixes a potential problem with the shutdown of the syncer thread timing out if the system is rebooted immediately after removing a large directory tree. Submitted by: tegge MFC after: 3 days
* Back out alpha/alpha/trap.c:1.124, osf1_ioctl.c:1.14, osf1_misc.c:1.57,rwatson2005-09-281-6/+0
| | | | | | | | | | | | | | | | | | | | osf1_signal.c:1.41, amd64/amd64/trap.c:1.291, linux_socket.c:1.60, svr4_fcntl.c:1.36, svr4_ioctl.c:1.23, svr4_ipc.c:1.18, svr4_misc.c:1.81, svr4_signal.c:1.34, svr4_stat.c:1.21, svr4_stream.c:1.55, svr4_termios.c:1.13, svr4_ttold.c:1.15, svr4_util.h:1.10, ext2_alloc.c:1.43, i386/i386/trap.c:1.279, vm86.c:1.58, unaligned.c:1.12, imgact_elf.c:1.164, ffs_alloc.c:1.133: Now that Giant is acquired in uprintf() and tprintf(), the caller no longer leads to acquire Giant unless it also holds another mutex that would generate a lock order reversal when calling into these functions. Specifically not backed out is the acquisition of Giant in nfs_socket.c and rpcclnt.c, where local mutexes are held and would otherwise violate the lock order with Giant. This aligns this code more with the eventual locking of ttys. Suggested by: bde
* Use the refcount API to manage the reference count for user credentialsjhb2005-09-271-2/+3
| | | | | | rather than using pool mutexes. Tested on: i386, alpha, sparc64
* Restore a historical ufs_inactive behavior that has been changeddelphij2005-09-231-1/+1
| | | | | | | | | | | | | | | | | | | in rev. 1.40 of ufs_inode.c, which allows an inode being truncated even when the filesystem itself is marked RDONLY. A subsequent call of UFS_TRUNCATE (ffs_truncate) would panic the system as it asserts that it can only be called when the filesystem is mounted read-write (same changeset, rev. 1.74 of sys/ufs/ffs/ffs_inode.c). Because ffs_mount() already takes care of sync'ing the filesystem to disk before being downgraded to readonly, it appears to be more desirable that we should not permit this sort of writes to disk. This change would fix a panic that occours when read-only mounted a corrupted filesystem and doing some file operations. MT6/5/4 candidate Reviewed by: mckusick
* Add GIANT_REQUIRED and WITNESS sleep warnings to uprintf() and tprintf(),rwatson2005-09-191-0/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | as they both interact with the tty code (!MPSAFE) and may sleep if the tty buffer is full (per comment). Modify all consumers of uprintf() and tprintf() to hold Giant around calls into these functions. In most cases, this means adding an acquisition of Giant immediately around the function. In some cases (nfs_timer()), it means acquiring Giant higher up in the callout. With these changes, UFS no longer panics on SMP when either blocks are exhausted or inodes are exhausted under load due to races in the tty code when running without Giant. NB: Some reduction in calls to uprintf() in the svr4 code is probably desirable. NB: In the case of nfs_timer(), calling uprintf() while holding a mutex, or even in a callout at all, is a bad idea, and will generate warnings and potential upset. This needs to be fixed, but was a problem before this change. NB: uprintf()/tprintf() sleeping is generally a bad ideas, as is having non-MPSAFE tty code. MFC after: 1 week
* Giant is no longer needed here.tegge2005-09-121-3/+0
|
* Convert the primary ACL allocator from malloc(9) to using a UMA zone instead.csjp2005-09-061-19/+19
| | | | | | | | Also introduce an aclinit function which will be used to create the UMA zone for use by file systems at system start up. MFC after: 1 month Discussed with: rwatson
* Retain generation count when writing zeroes instead of an inode to disk.tegge2005-09-051-4/+42
| | | | | | | | | Don't free a struct inodedep if another process is allocating saved inode memory for the same struct inodedep in initiate_write_inodeblock_ufs[12](). Handle disappearing dependencies in softdep_disk_io_initiation(). Reviewed by: mckusick
* ffs_mountfs() needs devvp to be locked, so lock it.ssouhlal2005-09-021-5/+3
| | | | | | Glanced at by: phk Tested by: pjd MFC after: 3 days
* Set the mountpoint path in the superblock (fs_fsmnt) at mount-timessouhlal2005-08-211-1/+2
| | | | | so that it appears in the various messages (not cleanly unmounted, filesystem full, etc). This has been broken since rev 1.261.
* Don't set the COMPLETE flag in an inodedep structure before the relatedtegge2005-08-211-1/+1
| | | | inode has been written.
* In the ufsdirhash_build() failure case for corrupted directoriesiedowse2005-08-171-2/+3
| | | | | | | | | or unreadable blocks, make sure to destroy the mutex we created. Also fix an unrelated typo in a comment. Found by: Peter Holm's stress tests Reviewed by: dwmalone MFC after: 3 days
* Delay freeing disk space for file system blocks until all dirty buffersups2005-07-312-0/+20
| | | | | | | | | are safely released. This fixes softdep problems on truncation (deletion) of files with dirty buffers. Reviewed by: jeff@, mckusick@, ps@, tegge@ Tested by: glebius@, ps@ MFC after: 3 weeks
* Eliminate inconsistency in the setting of the B_DONE flag. Specifically,alc2005-07-201-1/+1
| | | | | | | | | | | | | | | | make the b_iodone callback responsible for setting it if it is needed. Previously, it was set unconditionally by bufdone() without holding whichever lock is shared by the b_iodone callback and the corresponding top-half function. Consequently, in a race, the top-half function could conclude that operation was done before the b_iodone callback finished. See, for example, aio_physwakeup() and aio_fphysio(). Note: I don't believe that the other, more widely-used b_iodone callbacks are affected. Discussed with: jeff Reviewed by: phk MFC after: 2 weeks
* Allow EVFILT_VNODE events to work on every filesystem type, not justssouhlal2005-06-092-129/+2
| | | | | | | | | | | | | | | UFS by: - Making the pre and post hooks for the VOP functions work even when DEBUG_VFS_LOCKS is not defined. - Moving the KNOTE activations into the corresponding VOP hooks. - Creating a MNTK_NOKNOTE flag for the mnt_kern_flag field of struct mount that permits filesystems to disable the new behavior. - Creating a default VOP_KQFILTER function: vfs_kqfilter() My benchmarks have not revealed any performance degradation. Reviewed by: jeff, bde Approved by: rwatson, jmg (kqueue changes), grehan (mentor)
* This patch addresses a standards violation issue. The standards say akensmith2005-05-311-0/+11
| | | | | | | | | | | | | | | | | | | | | | file's access time should be updated when it gets executed. A while ago the mechanism used to exec was changed to use a more mmap based mechanism and this behavior was broken as a side-effect of that. A new vnode flag is added that gets set when the file gets executed, and the VOP_SETATTR() vnode operation gets called. The underlying filesystem is expected to handle it based on its own semantics, some filesystems don't support access time at all. Those that do should handle it in a way that does not block, does not generate I/O if possible, etc. In particular vn_start_write() has not been called. The UFS code handles it the same way as it would normally handle the access time if a file was read - the IN_ACCESS flag gets set in the inode but no other action happens at this point. The actual time update will happen later during a sync (which handles all the necessary locking). Got me into this: cperciva Discussed with: a lot with bde, a little with kan Showed patches to: phk, jeffr, standards@, arch@ Minor discussion on: arch@
* - Don't set our bio op to be a READ when we've just completed a write. Therejeff2005-05-301-10/+10
| | | | | | | | | are subtle differences in the read and write completion path. Instead, grab an extra write ref so the write path can drop it when we recursively call bufdone(). I believe this may be the source of the wrong bufobj panics. Reported by: pho, kkenn
* Allow removal of empty directories with high link counts. These canmckusick2005-05-181-3/+2
| | | | | | | | | occur on a filesystem running with soft updates after a crash and before a background fsck has been run. To prevent discrepancies from arising in a background fsck that may already be running, the directory is removed but its inode is not freed and is left with the residual reference count. When encountered by the background fsck it will be reclaimed.
* - Don't restrict the softdep stats to DEBUG kernels, they cost nothing tojeff2005-05-031-11/+7
| | | | | | | | | export. This was happening anyway since this file manually sets DEBUG. - Add a sysctl for the number of items on the worklist. - Use a more canonical loop restart in softdep_fsync_mountdev, it saves some code at the expense of a goto and makes me worry less about modifying a variable that should be private to the TAILQ_FOREACH_SAFE macro.
* - Use bdone() directly instead of calling it indirectly throughjeff2005-04-301-11/+1
| | | | | | ffs_rawreaddone(). Sponsored by: Isilon Systems, Inc.
* - Plug memory leak.pjd2005-04-161-3/+10
| | | | | | | | - Fix two style nits. Found by: Coverity Prevent analysis tool Reviewed by: rwatson MFC after: 1 week
* - Change all filesystems and vfs_cache to relock the dvp once the child isjeff2005-04-131-3/+2
| | | | | | locked in the ISDOTDOT case. Se vfs_lookup.c r1.79 for details. Sponsored by: Isilon Systems, Inc.
* - Consistently call 'vp' vp rather than ovp sometimes in ffs_truncate().jeff2005-04-051-105/+104
| | | | | | Do the same for oip. Pointed out by: glebius
* - Use M_ZERO rather than explicitly calling bzero().jeff2005-04-031-13/+13
| | | | | | | | | - Don't intermingle direct calls to lockmgr and indirect calls through VOPs. This will be important in the future. - Dont lock the devvp's interlock just to release it on the next line by passing LK_INTERLOCK to lockmgr. - Restructure ffs_snapshot_unmount so we don't call free() with the devvp's interlock locked.
* - In ffs_sync we need to pass LK_SLEEPFAIL in when we lock the vnodejeff2005-04-031-4/+3
| | | | | | | because it may change identities while we're sleeping on the lock. Otherwise we may bail out of ffs_sync() early due to an error from deadfs. - Collapse a VOP_UNLOCK, vrele into a single vput().
* - Move the contents of softdep_disk_prewrite into ffs_geom_strategy to fixjeff2005-04-033-32/+21
| | | | | | | | | | | | | | | | | two bugs. - ffs_disk_prewrite was pulling the vp from the buf and checking for COPYONWRITE, when really it wanted the vp from the bufobj that we're writing to, which is the devvp. This lead to us skipping the copy on write to all file data, which significantly broke snapshots for the last few months. - When the SOFTUPDATES option was not included in the kernel config we would also skip the copy on write check, which would effectively disable snapshots. - Remove an invalid mp_fixme(). Debugging tips from: mckusick Reported by: iedowse, others Discussed with: phk
* - Fix botched LK_NOWAIT removal. I mistakenly thought this compiled asjeff2005-03-311-1/+1
| | | | part of GENERIC.
* - FFS supports shared locks, clear LK_NOSHARE from our vnode locks.jeff2005-03-311-1/+2
| | | | Sponsored by: Isilon Systems, Inc.
* - Set LK_NOSHARE for snapshot locks. snapshots require exclusive onlyjeff2005-03-312-22/+2
| | | | | | | | access. - Remove the hack from ffs_lock() to implement LK_NOSHARE in a ffs specific way. Sponsored by: Isilon Systems, Inc.
* - LK_NOPAUSE is a nop now.jeff2005-03-313-8/+8
| | | | Sponsored by: Isilon Systems, Inc.
* - Remove wantparent, it is no longer necessary. An assert in vfs_lookup.cjeff2005-03-291-7/+1
| | | | | | prevents any callers from doing a modifying op without LOCKPARENT or WANTPARENT. It wasn't even properly used in the CREATE or DELETE cases.
* - Upgrade a shared lock request to exclusive in ffs_vget() if we havejeff2005-03-291-0/+9
| | | | | | to create the vnode. Sponsored by: Isilon Systems, Inc.
* - Honor the cn_lkflags passed from namei() when locking the leaf.jeff2005-03-291-2/+3
| | | | Sponsored by: Isilon Systems, Inc.
* - UFS no longer uses PDIRUNLOCK to track the parent state. Instead, we nowjeff2005-03-281-12/+7
| | | | | | | rely on ufs to always leave the parent locked except in the ISDOTDOT case. Adjust asserts to deal with these changes. Sponsored by: Isilon Systems, Inc.
* - We no longer have to bother with PDIRUNLOCK, lookup() handles it for us.jeff2005-03-281-30/+5
| | | | Sponsored by: Isilon Systems, Inc.
* When the softupdates worklist gets too long, threads that attempt todas2005-03-251-2/+5
| | | | | | | | | | | | add more work are forced to process two worklist items first. However, processing an item may generate additional work, causing the unlucky thread to recursively process the worklist. Add a per-thread flag to detect this situation and avoid the recursion. This should fix the stack overflows that could occur while removing large directory trees. Tested by: kris Reviewed by: mckusick
* - Call VFS_ROOT() with LK_EXCLUSIVE.jeff2005-03-241-1/+1
| | | | Sponsored by: Isilon Systems, Inc.
* - Update the ufs_root() prototype.jeff2005-03-241-2/+3
| | | | | | | - Pass the ufs_root() flags argument to VFS_VGET() to allow callers to specify shared locks. Sponsored by: Isilon Systems, Inc.
* - Lock the clearing of v_data in ufs_reclaim() to prevent a pagefaultjeff2005-03-171-1/+7
| | | | | | in ffs_lock() when it acesses v_data without the vnlock. Sponsored by: Isilon Systems, Inc.
* Add two arguments to the vfs_hash() KPI so that filesystems which dophk2005-03-161-2/+2
| | | | not have unique hashes (NFS) can also use it.
* Don't hold a reference on the disk vnode for each inode.phk2005-03-152-2/+2
|
* Improve the vfs_hash() API: vput() the unneeded vnode centrally tophk2005-03-151-3/+1
| | | | avoid replicating the vput in all the filesystems.
* Simplify the vfs_hash calling convention.phk2005-03-151-23/+3
|
* - Destroy the vnode object earlier in VOP_RECLAIM as we need more ofjeff2005-03-151-3/+4
| | | | | | | the vnode valid before the vm flushes pages. - Get rid of some extraneous uses of the vnode interlock. Sponsored by: Isilon Systems, Inc.
* Use vfs_hash instead of home-rolled.phk2005-03-146-191/+13
|
* - It is not legal to access v_data without the vnode lock or interlockjeff2005-03-131-1/+11
| | | | | | | held. Grab the vnode interlock if LK_INTERLOCK has not been passed in so that we can inspect v_data in ffs_lock(). Sponsored by: Isilon Systems, Inc.
OpenPOWER on IntegriCloud