Commit Graph

746 Commits

Author SHA1 Message Date
simonb
ad2a80f193 Move a brace that is in the wrong position when changes from FreeBSD
were added in rev 1.51.  This may fix the "N lost blocks" problem some
people have noticed.
Reviewed by fvdl.
2002-09-26 21:35:27 +00:00
jdolecek
a120eaa3ea use ufs_balloc_range() rather than local (mostly identical, but with some
bugs) ext2fs variant
2002-09-26 11:06:36 +00:00
thorpej
71404bb533 Don't include <sys/map.h>. 2002-09-25 22:21:01 +00:00
jdolecek
e305eb63e8 don't need <sys/conf.h> here 2002-09-22 19:32:54 +00:00
christos
6f3945a88d MNT_GETARGS support 2002-09-21 18:10:34 +00:00
gehenna
77a6b82b27 Merge the gehenna-devsw branch into the trunk.
This merge changes the device switch tables from static array to
dynamically generated by config(8).

- All device switches is defined as a constant structure in device drivers.

- The new grammer ``device-major'' is introduced to ``files''.

	device-major <prefix> char <num> [block <num>] [<rules>]

- All device major numbers must be listed up in port dependent majors.<arch>
  by using this grammer.

- Added the new naming convention.
  The name of the device switch must be <prefix>_[bc]devsw for auto-generation
  of device switch tables.

- The backward compatibility of loading block/character device
  switch by LKM framework is broken. This is necessary to convert
  from block/character device major to device name in runtime and vice versa.

- The restriction to assign device major by LKM is completely removed.
  We don't need to reserve LKM entries for dynamic loading of device switch.

- In compile time, device major numbers list is packed into the kernel and
  the LKM framework will refer it to assign device major number dynamically.
2002-09-06 13:18:43 +00:00
thorpej
139cdc3125 Make nbuf, nswbuf, and bufpages unsigned. Make all operations on these
variables unsigned, and update places where their values are printed.
2002-08-25 20:21:33 +00:00
itojun
8dd04cdcd7 correct range check, have overflow check, fix type mismatches,
for cmap args and some other calls.  from openbsd
2002-08-03 00:12:48 +00:00
soren
178d83d503 Die, qaddr_t, die! - mnt_data in struct mount is already effectively
a void *, so stop pretending otherwise.
2002-07-30 07:40:07 +00:00
wiz
645df36eff Spell '[Rr]ight' correctly. From Jim Bernard. 2002-07-26 14:11:34 +00:00
hannken
7de36862a8 Rename bufq_init() to bufq_alloc().
Add bufq_free() to remove a buffer queue.
Avoid MALLOC while holding a spinlock.

From Chuck Silvers.
2002-07-21 15:32:17 +00:00
hannken
d4c062b4cc Convert to new device buffer queue interface. 2002-07-19 16:26:01 +00:00
perseant
8f30dc2c9b Remove lying comment on SEGM_PROT seglock. 2002-07-11 21:09:00 +00:00
briggs
77f5558791 Fix a printf format warning. 2002-07-07 14:29:06 +00:00
fredette
10d4232908 Fixed a printf argument type. 2002-07-06 15:39:07 +00:00
perseant
32ae84b188 Deal with fragment size changes better. For each fragment that can
exist on an on-disk inode, we keep a record of its size in struct inode,
which is updated when we write the block to disk.  The cleaner routines
thus have ready access to what size is the correct size for this block,
on disk.

Fixed a related bug: if a file with fragments is being cleaned
(fragments being cleaned) at the same time it is being extended beyond
NDADDR blocks, we could write a bogus FINFO record that has a frag in the
middle; when it was cleaned this would give back bogus file data.  Don't
write the indirect blocks in this case, since there is no need.

lfs_fragextend and lfs_truncate no longer require the seglock, but instead
take a shared lock, which the seglock locks exclusively.
2002-07-06 01:30:11 +00:00
scw
881a4dcac0 Cast pointers first to uintptr_t before casting to register_t.
On SH-5, sizeof(register_t) is always 8, even if sizeof(void *) is 4
as is the case when compiling for ILP32.
2002-07-05 13:49:26 +00:00
yamt
d566a58b5e fix printf format for DEBUG_LFS. 2002-07-02 19:07:03 +00:00
perseant
0418a2c352 Fix miscalculation in lfs_fits found by Trevin Beattie <trevin@xmission.com>.
Change some of the variable names from "nb", "db" to "fsb" to reflect their
calling conventions.
2002-06-20 22:10:24 +00:00
perseant
ae37d9d186 Don't bomb out of lfs_bmapv if the caller is requesting blocks that
live in the current segment.  There's nothing wrong with this, and
it is necessary for the correct operation of the coaleascer.
2002-06-20 20:43:17 +00:00
jdolecek
20644ff75f clear_inodedeps(): use CIRCLEQ_FOREACH() appropriately 2002-06-18 20:24:31 +00:00
perseant
ddfb1dbb92 For synchronous writes, keep separate i/o counters for each write, so
processes don't have to wait for one another to finish (e.g., nfsd seems
to be a little happier now, though I haven't measured the difference).
Synchronous checkpoints, however, must always wait for all i/o to finish.

Take the contents of the callback functions and have them run in thread
context instead (aiodoned thread).  lfs_iocount no longer has to be
protected in splbio(), and quite a bit less of the segment construction
loop needs to be in splbio() as well.

If lfs_markv is handed a block that is not the correct size according to
the inode, refuse to process it.  (Formerly it was extended to the "correct"
size.)  This is possibly more prone to deadlock, but less prone to corruption.

lfs_segclean now outright refuses to clean segments that appear to have live
bytes in them.  Again this may be more prone to deadlock but avoids
corruption.

Replace ufsspec_close and ufsfifo_close with LFS equivalents; this means
that no UFS functions need to know about LFS_ITIMES any more.  Remove
the reference from ufs/inode.h.

Tested on i386, test-compiled on alpha.
2002-06-16 00:13:15 +00:00
chs
ea4c4a989f allow read-only mounts even if we can't read the last fragment of the fs.
this enables one to recover data from a failing disk (where the read failure
is a hardware problem) while avoiding corrupting the fs further (in the case
where the read failure is due to a misconfiguration).
2002-06-09 16:46:49 +00:00
perseant
c13ae45a2a Let lfs_bmapv fill in the bi_size member of the BLOCK_INFO structure,
as well as bi_daddr.  This lets the cleaner have an idea of what the size
of this block was at the time it was written without having to refer to
a segment header (e.g., in the file coalescing case).

Tested on i386.
2002-06-06 00:46:24 +00:00
chs
fffb1de109 get the units right when computing a blkno in the ENOSPC path
for allocations involving indirect blocks.
spotted by Trevin Beattie <trevin@xmission.com>.
2002-06-05 05:23:51 +00:00
thorpej
7903aba812 #if 0 a test that is always false (and the XXX comment above it
indicates so).
2002-05-30 18:54:55 +00:00
perseant
d67a5bbb21 Fix a couple of instances where reassignbuf() was not done at splbio.
Tested on i386.
2002-05-24 22:13:57 +00:00
perseant
43ca783b4a Back out rev 1.174 of vfs_subr.c, because the splbio() wasn't protecting
enough to be useful, and broadening it so that it did would have meant
that operations possibly requiring synchronous disk activity would have
to be done in splbio().  This clearly was not going to work.

Worked around this in the LFS case by having lfs_cluster_callback put an
extra hold on the vnode before calling biodone(), and taking the hold
off without HOLDRELE's problematic list swapping.  lfs_vunref() will take
care of that---in thread context---on the next write if need be.

Also, ensure that the list walking in lfs_{writevnodes,segunlock,gather}
takes into account the possibility that the list may change
underneath it (possibly because it itself deleted an element).

Tested on i386, test-compiled on alpha.
2002-05-23 23:05:25 +00:00
perseant
ec0ca919be Protect v_freelist with splbio(), since HOLDRELE can be called in
interrupt context (through brelvp).  (LFS may be the only subsystem
affected by this problem.)

Tested on i386.
2002-05-20 22:50:57 +00:00
perseant
36efaa3565 use macros from <sys/queue.h> 2002-05-17 21:42:38 +00:00
thorpej
6c1654256e Fix LP64 printf format warning. 2002-05-16 02:23:55 +00:00
perseant
8886b0f4b2 Phase one of my three-phase plan to make LFS play nice with UBC, and bug-fixes
I found while making sure there weren't any new ones.

* Make the write clusters keep track of the buffers whose blocks they contain.
  This should make it possible to (1) write clusters using a page mapping
  instead of malloc, if desired, and (2) schedule blocks for rewriting
  (somewhere else) if a write error occurs.  Code is present to use
  pagemove() to construct the clusters but that is untested and will go away
  anyway in favor of page mapping.
* DEBUG now keeps a log of Ifile writes, so that any lingering instances of
  the "dirty bufs" problem can be properly debugged.
* Keep track of whether the Ifile has been dirtied by various routines that
  can be called by lfs_segwrite, and loop on that until it is clean, for
  a checkpoint.  Checkpoints need to be squeaky clean.
* Warn the user (once) if the Ifile grows larger than is reasonable for their
  buffer cache.  Both lfs_mountfs and lfs_unmount check since the Ifile can
  grow.
* If an inode is not found in a disk block, try rereading the block, under
  the assumption that the block was copied to a cluster and then freed.
* Protect WRITEINPROG() with splbio() to fix a hang in lfs_update.
2002-05-14 20:03:53 +00:00
mycroft
1523c4c12f In ufs_mkdir(), write the data block *before* updating the inode with the
block pointer, to prevent "DIRECTORY CORRUPTED" errors from fsck(8).
Note: The behavior in the softdep case is unchanged, but needs to be fixed.
2002-05-14 17:37:52 +00:00
matt
fed7110558 Commit out code that's no longer used. 2002-05-14 02:46:22 +00:00
matt
0cb85bc7b9 Eliminate commons. 2002-05-12 23:06:27 +00:00
enami
b86c56a0b6 Add comment that getblk() in ufs_bmaparray() returns an error only if
we are pagedaemon.
2002-05-11 12:23:53 +00:00
chs
e926e6ec99 use the correct size when zeroing an array. 2002-05-05 17:01:41 +00:00
chs
dcc6963777 for softdep vnodes, always write together the pages for any block that
might have a dependency , since the accounting doesn't work otherwise.
fixes PRs 15364 16336 16448.
2002-05-05 17:00:06 +00:00
perseant
76d2795556 Make exported LFSes not panic on the first file create. 2002-04-27 01:00:46 +00:00
thorpej
37dc008ca3 Cleanup how file system configuration information is declared, grouping
related information together, with the file system code itself.

This is just low-hanging fruit -- more to come.
2002-04-16 23:14:05 +00:00
mycroft
fd303c4dc5 Add a special case for nrpos=1 to cbtorpos(). This massively reduces CPU usage
by newfs(8) -- and fsck_ffs(8) on a relatively empty file system.  There is
still one divide left in the inner loops, to calculate cylno values.
2002-04-10 14:31:07 +00:00
mycroft
afc5d40400 Use blkstofrags() and fragstoblks(). Use &(NBBY-1) rather than %NBBY.
Switch off of fs_fragshift rather than fs_frag (generates better jump tables).
2002-04-10 08:05:11 +00:00
mycroft
0a9b835878 Use fsbtodb() rather than multiplying by NSPF(). 2002-04-10 07:46:10 +00:00
enami
89cf6e2727 Hold an extra reference if updating and args.fspec == NULL. 2002-04-01 07:51:58 +00:00
christos
e356d686bb Fixes from enami:
- If VOP_ACCESS fails when updating mount, we will vrele() twice.

- The check for update-only flags in mp->mnt_flag when not updating
  case is bogus.  If we really want to check, we need to see flags in
  ufs_args, but I'm not sure if it is really necessary.

- The credential passed to ffs_reload was credential of when looking
  up mount point, but now it is credential of when looking up device
  node.  Anyway, it may be current process's credential.
2002-04-01 01:52:44 +00:00
christos
919d9f5617 PR/16136: Chris Jepeway: Bogus entry in /etc/fstab can panic kernel. 2002-03-31 20:53:25 +00:00
chs
fe10bac175 if the size argument to write(2) is 0, do not modify the file in any way,
including updating timestamps.  required for standards conformance.
2002-03-25 02:23:55 +00:00
chs
0f2018fc31 in lfs_write(), flush and invalidate any page cache pages in the range
that we're about to modify.  this weak attempt at coherency is enough
to make some applications (eg. "tail -f") happy, so it's worth having.
2002-03-22 03:57:35 +00:00
wiz
358ed3f6d4 Fix a typo, a KNF-nit, and simplify a printf format string. 2002-03-18 13:38:52 +00:00
chs
79c365e60e don't do any flush-behind for async mounts.
this matches the traditional behaviour.
2002-03-17 23:58:09 +00:00
chs
c1d184702f when mounting a filesystem, read the last block in the filesystem
to verify that the device is at least as big as the superblock claims
the filesystem is supposed to be, and if it's not then fail the mount.
this should help reduce the type of confusion reported in PR 13228.
2002-03-17 00:02:34 +00:00
thorpej
a180cee23b Pool deals fairly well with physical memory shortage, but it doesn't
deal with shortages of the VM maps where the backing pages are mapped
(usually kmem_map).  Try to deal with this:

* Group all information about the backend allocator for a pool in a
  separate structure.  The pool references this structure, rather than
  the individual fields.
* Change the pool_init() API accordingly, and adjust all callers.
* Link all pools using the same backend allocator on a list.
* The backend allocator is responsible for waiting for physical memory
  to become available, but will still fail if it cannot callocate KVA
  space for the pages.  If this happens, carefully drain all pools using
  the same backend allocator, so that some KVA space can be freed.
* Change pool_reclaim() to indicate if it actually succeeded in freeing
  some pages, and use that information to make draining easier and more
  efficient.
* Get rid of PR_URGENT.  There was only one use of it, and it could be
  dealt with by the caller.

From art@openbsd.org.
2002-03-08 20:48:27 +00:00
simonb
9a942a34e0 Don't use local extern declarations for the mountroot variable or
declare local prototypes for nfs_mountroot() or md_root_setconf().
2002-03-04 02:25:21 +00:00
pooka
360cafaddb Don't add fs->fs_pendingblocks to f_bavail twice. It's already included
in f_bfree, which is added to f_bavail.

Fixes problem with statfs reporting too much free space for filesystems
which have files pending to be freed by softdeps.
2002-02-28 21:59:23 +00:00
enami
70ca5d5195 Record some page cache related information into ubchist. 2002-02-22 08:23:16 +00:00
wiz
c809c3243b Fix two problems with softdep_typenames (missing entry, wrong boundary check).
Okayed by fvdl.
2002-02-14 00:49:56 +00:00
perseant
f41358613c Include the space taken by inodes in the count made by lfs_check();
make VOP_SETATTR call lfs_check.  This prevents large numbers of inode
changes (say, at the end of tar(1)) from filling the buffer cache.
2002-02-11 02:47:29 +00:00
chs
94cfc87907 bring in the change from FreeBSD's rev. 1.107 of this file:
date: 2002/02/07 00:54:32;  author: mckusick;  state: Exp;  lines: +10 -7
  Occationally deleted files would hang around for hours or days
  without being reclaimed. This bug was introduced in revision 1.95
  dealing with filenames placed in newly allocated directory blocks,
  thus is not present in 4.X systems. The bug is triggered when a
  new entry is made in a directory after the data block containing
  the original new entry has been written, but before the inode
  that references the data block has been written.

  Submitted by:   Bill Fenner <fenner@research.att.com>

This should fix NetBSD PR 15531.
2002-02-10 18:06:03 +00:00
lukem
caa29fae38 #undef DIRBLKSIZ before #define-ing it 2002-02-06 15:44:49 +00:00
perseant
8ded9a2c7d Correct free list tail pointer, when adding blocks of new inodes to v2
filesystems.  Should fix PR #14408.
2002-02-04 03:32:16 +00:00
chs
eecf9e208a fix PR 15299 by making MFS filesystems not be "async".
in the longer term, MFS needs to be made a lot more VM-friendly.
2002-02-03 03:51:57 +00:00
tv
880a2cf970 These sources are pulled into makefs(8), so we need config.h and protection
for __KERNEL_RCSID().
2002-01-31 19:19:22 +00:00
tv
5d28098c5b Revert previous. This is actually being done a better way. 2002-01-31 19:18:18 +00:00
tv
8ec192426e For makefs, only include <machine/bswap.h> if it exists. 2002-01-31 19:17:02 +00:00
tv
af3dca1ea8 #undef MAXNAMLEN before defining it; this lets ufs/ufs/dir.h be used
properly on non-NetBSD hosts with makefs(8).
2002-01-31 19:16:34 +00:00
chs
1b454dbb4f fix an error case. 2002-01-26 08:32:05 +00:00
enami
ac35ac58f5 - For CIRCLEQ, comparing the loop variable against NULL doesn't make sense.
- Minor KNF while I'm here.

# This doesn't fix real problems though.
2002-01-18 00:30:03 +00:00
enami
9ad4436bc2 Fix typo which prevents diagnostic test from working. 2002-01-16 08:33:12 +00:00
lukem
25ca00a979 Only pull in <sys/systm.h> #ifdef _KERNEL, since it's a kernel only header.
In the ! _KERNEL case, provide own prototype for panic() instead.
2002-01-09 23:51:00 +00:00
lukem
202e920175 revert part of rev 1.14 - #include <ufs/ufs/dinode.h> - because that
makes it MUCH more difficult to reference this file stand-alone.
2002-01-07 15:25:22 +00:00
thorpej
fdb5b56e5f Do not compare an integer to NULL. 2001-12-31 21:37:22 +00:00
fvdl
a833eaf1fe XXXX temporary measure: in the case of a softdep 'unmount pending error',
do not mark the filesystem clean, as this will mean that one or more
     files were likely not completely removed (will show up as unconnected
     in fsck). Prevents filesystems from being marked clean while they're
     not until this problem has been figured out.
2001-12-30 15:46:53 +00:00
fvdl
d0f7c6fb96 Use softdep_change_linkcnt to note that the inode mode was set to 0.
From FreeBSD.
2001-12-27 01:48:38 +00:00
fvdl
c9218f8686 The softdep code sometimes use vfs_vget .. vput. For removals, these
would result in a vop_inactive call for the vnode each time, resulting
in vinvalbuf->fsync. The original softdep code avoided the fsync
in vinvalbuf by not calling it if there were no dirty blocks. This
was changed in NetBSD. Also, flush_inodedeps was changed to mark
the inode as modified so that it would do an inode update and flush the
last one. This combination basically caused a sync write for each removed
file in an rm -rf (showing up delayed from the syncer a lot of the time).

If called from vinvalbuf (FSYNC_RECLAIM), and there were no dirty blocks
or pages to begin with, still do everything as normal, so that possible dirty
blocks in transit to disk are properly waited for, etc, but don't pass
UPDATE_WAIT to VOP_UPDATE, since there is no need for it in that case.
2001-12-27 01:44:59 +00:00
fvdl
2b5fe12a98 Pull over one missed fix from FreeBSD wrt. running out of quota. Also
reshuffle some code a bit to make it look more similar (no functional
change).
2001-12-27 01:29:05 +00:00
fvdl
08f29df58c As pointed out by mycroft and reflected in the comment, update the
directory inode before creating the new entry (not the freshly alloced
directory which isn't linked anywhere yet).
2001-12-23 16:16:59 +00:00
fvdl
983d322c7c Fix botch in my original softdep code merge: remove redundant (and
synchronous to boot) VOP_UPDATE call.
2001-12-23 14:00:21 +00:00
fvdl
f1db177e10 Fix from FreeBSD that I missed: speed up handling of short-lived
files a bit.
2001-12-23 11:54:46 +00:00
chs
2ddcad30f6 process the delayed-free queue more often. 2001-12-23 08:53:46 +00:00
fvdl
68728c0901 ffs_reload may be called after an old fsck has run, and the pending*
fields may not be zero. Just reset them silently, it's not an error.
2001-12-19 15:20:19 +00:00
fvdl
3d8b2ffe36 Bring over fixes from FreeBSD that weren't incorporated yet, mainly
from Kirk McKusick. They implement taking pending block/inode frees
into account for the sake of correct statfs() numbers, and adding
a new softdep type (newdirblk) to correctly handle newly allocated
directory blocks.

Minor additional changes: 1) swap the newly introduced fs_pendinginodes
and fs_pendingblock fields in ffs_sb_swap, and 2) declare lkt_held
in the debug version of the softdep lock structure volatile, as it
can be modified from interrupt context #ifdef DEBUG.
2001-12-18 10:57:21 +00:00
chs
0d70d731c2 use the new compatibility routines to allow mmap() to work
(in the same non-coherent fashion that it worked pre-UBC)
until someone has time to do it the right way.
2001-12-18 07:51:16 +00:00
chs
03dd7ce1e8 when truncating a file, make sure the last block of the file is actually
allocated, since other parts of the code assume this.
2001-12-18 06:50:28 +00:00
chs
5a690c92a1 add a VOP_PUTPAGES method for all the filesystems that don't have pages,
just unlock the interlock.
2001-12-06 04:27:40 +00:00
chs
a4f1bc813a pick up changes from ufs_balloc_range(). 2001-11-30 07:06:19 +00:00
chs
9958c29316 VOP_PUTPAGES() requires page-aligned offsets, so be sure to provide such.
fixes PR 14759.

(while I'm here, call VOP_PUTPAGES() directly instead of indirecting through
the UVM pager op vector.)
2001-11-30 07:05:53 +00:00
chs
a106161b5a add spaces for KNF. confirmed to produce identical objects. 2001-11-23 21:44:25 +00:00
chs
3f9a8628df we need to hold the pageq lock while calling uvm_page_unbusy() on
pages that uvm_page_unbusy() will free.
2001-11-22 02:42:37 +00:00
lukem
4a269de9a1 fix compile error noted by itojun in [kern/14638] 2001-11-19 11:56:50 +00:00
lukem
5b0ef8ec1a be consistent and cache UFS_*NEEDSWAP results in more functions 2001-11-19 07:00:21 +00:00
simonb
f809eb7333 Set `flags' before being used in the WRITE() function. 2001-11-17 07:22:34 +00:00
lukem
2ee0a3f232 move code to calculate size of direct for a given namlen to separate
DIRECTSIZ() macro, and use this to implement a (now shorter) DIRSIZ().
inspired by freebsd
2001-11-16 16:09:17 +00:00
lukem
2565646230 don't need <sys/types.h> when including <sys/param.h> 2001-11-15 09:47:59 +00:00
chs
4b4425d13b some callers of ufs_bmaparray() in LFS depend on *nump being set to 0 for
direct blocks, so restore that behaviour.
2001-11-13 06:23:17 +00:00
chs
dc4cf974e0 track some changes in the ufs code:
update UVM's notion of the file size in *_write() rather than
*_balloc().
2001-11-10 17:48:02 +00:00
chs
c237f81065 update to track ufs_bmap.c:
don't call ufs_getlbns() for direct blocks.
2001-11-10 17:46:23 +00:00
chs
9f52e62b73 fix the previous change: use the correct test for a block number
referring to a direct block.
2001-11-10 07:11:00 +00:00
chs
81625d675b the previous fix (in rev. 1.26) for hangs when the filesystem is full
was wrong, so fix it right this time.  undo the previous change and
instead, replace the troublesome VOP_FSYNC()s with code that just flushes
the particular indirect blocks that we allocated.  this resolves the
softdeps for those blocks.  then we can change the pointer for
the first indirect block we allocated to zero, write that, and finally
invalidate all the indirect blocks we've touched.  also, wait until
after we finish all this before freeing any blocks we allocated.
fixes PRs 14413 and 14423.
2001-11-08 05:27:25 +00:00
chs
df71d3fadc in both paths that can cause fragments to be expanded (write and truncate-up),
deal with the fragment expansion separately before the rest of the operation.
this allows us to simplify ufs_balloc_range() by not worrying about implicit
fragment expansion.

call VOP_PUTPAGES() directly for vnodes instead of
going through the UVM pager "put" vector.
2001-11-08 05:24:52 +00:00
chs
0de5f1ba39 only call ufs_getlbns() for blocks which involve indirects, and assert
that this is so.  use a shift instead of a multiply in one place.
2001-11-08 05:00:51 +00:00