Date: Mon, 18 Nov 1996 11:23:23 -0800 From: Julian Elischer <julian@whistle.com> To: hackers@freebsd.org Subject: [Fwd: Device filesystem stumbling block] Message-ID: <3290B7AB.41C67EA6@whistle.com>
next in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
this time get the address right!
[-- Attachment #2 --]
Message-ID: <32903133.41C67EA6@whistle.com>
Date: Mon, 18 Nov 1996 01:49:39 -0800
From: Julian Elischer <julian@whistle.com>
Organization: Whistle Communications
X-Mailer: Mozilla 3.0Gold (X11; I; FreeBSD 2.2-CURRENT i386)
MIME-Version: 1.0
To: hackers@freebsd
CC: mckusick@vangogh.cs.berkeley.edu
Subject: Device filesystem stumbling block
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
David, John, Kirk.. HELP!
I have the device filesystem here working quite nicely..
until I try unmount a filesystem mounted from a device accessed
through devfs.
here's an example:
[IJ-julian.whistle.com] 28 mount -t devfs devfs /mnt
[IJ-julian.whistle.com] 29 mount /mnt/wd0e /data/mnt
[IJ-julian.whistle.com] 30 mount
/dev/wd0a on / (local, read-only)
/dev/wd0g on /var (local)
/dev/wd0h on /data (local)
procfs on /proc (local)
devfs on /mnt (local)
/mnt/wd0e on /data/mnt (local)
[IJ-julian.whistle.com] 31 sysctl -w debug.debugger=1
debug.debugger: 0 -> 1
{private mod to allow me to
drop into debugger to set a breakpoint at unmount(), and return}
[IJ-julian.whistle.com] 32 umount /data/mnt
at this point the process doing the unmount hangs...
tracing in the debugger gives.. (stopped at a breakpoint before
the tsleep in getblk() )
Breakpoint 2, getblk (vp=0xf0ae1880, blkno=16, size=2048, slpflag=0,
slptimeo=0) at ../../kern/vfs_bio.c:1068
(xxgdb) info stack
#0 getblk (vp=0xf0ae1880, blkno=16, size=2048, slpflag=0, slptimeo=0)
at ../../kern/vfs_bio.c:1068
#1 0xf0164544 in ffs_sbupdate (mp=0xf0b3ea00, waitfor=1) at
../../ufs/ffs/ffs_vfsops.c:1051
#2 0xf0163dfd in ffs_unmount (mp=0xf0b3ec00, mntflags=0, p=0xf0b34a00)
at ../../ufs/ffs/ffs_vfsops.c:672
#3 0xf01329f0 in dounmount (mp=0xf0b3ec00, flags=0, p=0xf0b34a00) at
../../kern/vfs_syscalls.c:309
#4 0xf0132928 in unmount (p=0xf0b34a00, uap=0xefbfff94,
retval=0xefbfff84) at ../../kern/vfs_syscalls.c:280
#5 0xf018882f in syscall (frame={tf_es = 39, tf_ds = 39, tf_edi =
-272640000, tf_esi = 161190, tf_ebp = -272638864, tf_isp = -272629788,
tf_ebx = 0, tf_edx = 1, tf_ecx = 58, tf_eax = 22, tf_trapno = 7, tf_err
= 7, tf_eip = 11413, tf_cs = 31, tf_eflags = 582, tf_esp = -272640052,
tf_ss = 39}) at ../../i386/i386/trap.c:891
#6 0xf017fddf in Xsyscall ()
the vnode in question is:
$13 = {
v_flag = 8192,
v_usecount = 2,
v_writecount = 0,
v_holdcnt = 3,
v_lastr = 0,
v_id = 1568,
v_mount = 0xf0b34800,
v_op = 0xf09c0a00,
v_freelist = {
tqe_next = 0xf0ae1800,
tqe_prev = 0xdeadb
},
v_mntvnodes = {
le_next = 0xf0ae1900,
le_prev = 0xf0b34814
},
v_cleanblkhd = {
lh_first = 0xf29ad64c
},
v_dirtyblkhd = {
lh_first = 0x0
},
v_numoutput = 0,
v_type = VBLK,
v_un = {
vu_mountedhere = 0xf09a3f50,
vu_socket = 0xf09a3f50,
vu_specinfo = 0xf09a3f50,
vu_fifoinfo = 0xf09a3f50
},
v_lease = 0x0,
v_lastw = 0,
v_cstart = 0,
v_lasta = 0,
v_clen = 0,
v_ralen = 0,
v_usage = 1,
v_maxra = 0,
v_object = 0xf0b24980,
v_tag = VT_DEVFS,
v_data = 0xf0b47b00
}
and the buf in question is the buf holding the superblock for the
filesystem. It is marked BUSY, but nothing is dealing with it so
getblk waits forever. for the life of me I can't figure out
what I need to add to devfs to make that block be handled.
If it helps, here's the buf..
$15 = {
b_hash = {
le_next = 0x0,
le_prev = 0xf01c2168
},
b_vnbufs = {
le_next = 0xf29af0cc,
le_prev = 0xf29ad654
},
b_freelist = {
tqe_next = 0xf29af0cc,
tqe_prev = 0xf29ad9ac
},
b_act = {
tqe_next = 0x0,
tqe_prev = 0xf01c91dc
},
b_proc = 0x0,
b_flags = 8454708,
b_qindex = 0,
b_usecount = 6 '\006',
b_error = 0,
b_bufsize = 2048,
b_bcount = 2048,
b_resid = 0,
b_dev = 4,
b_un = {
b_addr = 0xf0ace000 ""
},
b_saveaddr = 0x0,
b_lblkno = 16,
b_blkno = 16,
b_iodone = 0,
b_iodone_chain = 0x0,
b_vp = 0xf0ae1880,
b_dirtyoff = 0,
b_dirtyend = 0,
b_rcred = 0x0,
b_wcred = 0x0,
b_validoff = 0,
b_validend = 0,
b_pblkno = 307279,
b_savekva = 0x0,
b_driver1 = 0x0,
b_driver2 = 0x0,
b_spc = 0x0,
b_cluster = {
cluster_head = {
tqh_first = 0xf29afc64,
tqh_last = 0xf29ac994
},
cluster_entry = {
tqe_next = 0xf29afc64,
tqe_prev = 0xf29ac994
}
},
b_pages = {0x0 <repeats 16 times>},
b_npages = 0
}
I don't understand what is supposed to find it and do the write back
that it is apparently waiting for.
I've looked in the 4.4 book but unfortunatly it doesn't seem to cover
this anywhere I can see. Certainly it lacks a clear diagram of
the linking in of filesystem meta-data in the buffer system.
I don't know where this buffer is hung off.
I guess I'm going to be single stepping through 'mount'
tomorrow to try figure this out, but any hints in the meanwhile
would be gratefully accepted..
julian
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3290B7AB.41C67EA6>
