Using a file-backed swap via md0 results in panic on reboot..
Pawel Jakub Dawidek
pjd at FreeBSD.org
Tue Sep 23 20:15:06 UTC 2008
On Tue, Sep 23, 2008 at 03:09:40PM -0400, John Baldwin wrote:
> So if you attach an md device to a file and then use that md0 device for swap,
> you will get a panic on shutdown if the swap file was in use. The reason is
> that we remove swap devices _after_ unmounting the filesystems in boot():
>
> if (nbusy) {
> /*
> * Failed to sync all blocks. Indicate this and don't
> * unmount filesystems (thus forcing an fsck on reboot).
> */
> printf("Giving up on %d buffers\n", nbusy);
> DELAY(5000000); /* 5 seconds */
> } else {
> if (!first_buf_printf)
> printf("Final sync complete\n");
> /*
> * Unmount filesystems
> */
> if (panicstr == 0)
> vfs_unmountall();
> }
> swapoff_all();
> DELAY(100000); /* wait for console output to finish */
>
> Is there any reason we can't move the swapoff_all()? Should we perhaps only
> do it in "clean" case? Alternatively, should the swapoff_all() during
> shutdown have a special flag so that it doesn't actually read in any data
> from disk and just throws away the data instead? Sample panic:
>
> Waiting (max 60 seconds) for system process `vnlru' to stop...done
> Waiting (max 60 seconds) for system process `syncer' to stop...
> Syncing disks, vnodes remaining...2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
> 0 0 done
> Waiting (max 60 seconds) for system process `bufdaemon' to stop...done
> All buffers synced.
> Swap device ad0s1b removed.
> swap_pager: I/O error - pagein failed; blkno 2097177,size 4096, error 5
> panic: swap_pager_force_pagein: read from swap failed
> cpuid = 0
> KDB: stack backtrace:
> panic() at panic+0x2c5
> swapoff_one() at swapoff_one+0x5bb
> swapoff_all() at swapoff_all+0xe4
> boot() at boot+0x871
> reboot() at reboot+0x45
> syscall() at syscall+0x642
> Xfast_syscall() at Xfast_syscall+0xa8
The problem is this: sometimes we want to first unmount file systems and
sometimes we want to first remove swap devices.
In your case you have swap device residing on a file system. Imagine the
opposite situation where you have a file system residing on swap device:
mdconfig -t swap; newfs /dev/mdX; mount /dev/mdX
The solution I have been thinking about is to call vfs_unmountall() and
swapoff_all() in a loop and changed them to return number of file system
unmounted or swap devices removed respectively:
do {
i = vfs_unmountall();
j = swapoff_all();
} while (i > 0 || j > 0);
Something like that would cover both situations and even more complex
(although not very realistic) situations: FS on SWAP on FS on SWAP, etc.
Of course vfs_unmountall() and swapoff_all() would have to skip busy
file systems/swap devices.
--
Pawel Jakub Dawidek http://www.wheel.pl
pjd at FreeBSD.org http://www.FreeBSD.org
FreeBSD committer Am I Evil? Yes, I Am!
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-arch/attachments/20080923/7d3221f1/attachment.pgp
More information about the freebsd-arch
mailing list