nfs on zfs panic

Philippe Pegon Philippe.Pegon at crc.u-strasbg.fr
Wed Jun 27 06:54:49 UTC 2007


Doug Rabson wrote:
> It looks like nvp is NULL at the point where it crashed. Looking at the 
> zfs code, zfs_vget always returns zero, even if it failed to find a 
> vnode which matches the given 'inode' number. Try changing the return 
> statement in zfs_vget from 'return (0)' to 'return (err)'.

That seems to fix the problem :-)

thanks

> 
> PS. the code is in 
> src/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c - it took me 
> a while to find it.
> 
> On 26 Jun 2007, at 17:12, Philippe Pegon wrote:
> 
>> Hi,
>>
>> I'm playing with zfs on vmware on FreeBSD current (world and kernel of 
>> today with GENERIC kernel). I have 3 disks (virtuals) in raidz :
>>
>> # zpool status
>>   pool: tank
>>  state: ONLINE
>>  scrub: none requested
>> config:
>>
>>         NAME        STATE     READ WRITE CKSUM
>>         tank        ONLINE       0     0     0
>>           raidz1    ONLINE       0     0     0
>>             da0     ONLINE       0     0     0
>>             da1     ONLINE       0     0     0
>>             da2     ONLINE       0     0     0
>>
>> errors: No known data errors
>>
>> with this zfs configuration :
>>
>> # zfs list
>> NAME         USED  AVAIL  REFER  MOUNTPOINT
>> tank         844M  8.93G  25.3K  none
>> tank/nfs    24.0K  8.93G  24.0K  /mnt/nfs
>> tank/obj     436M  8.93G   436M  /usr/obj
>> tank/ports   244M  8.93G   244M  /usr/ports
>> tank/src     162M  8.93G   162M  /usr/src
>>
>> /mnt/nfs is nfs exported (zfs set sharenfs=on tank/nfs) and when I 
>> mount it on a Linux box and try a ls from Linux, FreeBSD panic.
>>
>> panic and debug informations :
>>
>> # kgdb kernel.debug /var/crash/vmcore.0
>> [GDB will not be able to debug user-mode threads: 
>> /usr/lib/libthread_db.so: Undefined symbol "ps_pglobal_lookup"]
>> GNU gdb 6.1.1 [FreeBSD]
>> Copyright 2004 Free Software Foundation, Inc.
>> GDB is free software, covered by the GNU General Public License, and 
>> you are
>> welcome to change it and/or distribute copies of it under certain 
>> conditions.
>> Type "show copying" to see the conditions.
>> There is absolutely no warranty for GDB.  Type "show warranty" for 
>> details.
>> This GDB was configured as "i386-marcel-freebsd".
>>
>>
>> Unread portion of the kernel message buffer:
>>
>>
>> Fatal trap 12: page fault while in kernel mode
>> cpuid = 0; apic id = 00
>> fault virtual address   = 0x10
>> fault code              = supervisor read, page not present
>> instruction pointer     = 0x20:0xc08d088d
>> stack pointer           = 0x28:0xd61f88f0
>> frame pointer           = 0x28:0xd61f8bec
>> code segment            = base 0x0, limit 0xfffff, type 0x1b
>>                         = DPL 0, pres 1, def32 1, gran 1
>> processor eflags        = interrupt enabled, resume, IOPL = 0
>> current process         = 722 (nfsd)
>> panic: from debugger
>> cpuid = 0
>> Uptime: 3h46m48s
>> Physical memory: 499 MB
>> Dumping 52 MB: 37 21 5
>>
>> #0  doadump () at pcpu.h:195
>> 195             __asm __volatile("movl %%fs:0,%0" : "=r" (td));
>> (kgdb) backtrace
>> #0  doadump () at pcpu.h:195
>> #1  0xc074997e in boot (howto=260) at 
>> /usr/src/sys/kern/kern_shutdown.c:409
>> #2  0xc0749c3b in panic (fmt=Variable "fmt" is not available.
>> ) at /usr/src/sys/kern/kern_shutdown.c:563
>> #3  0xc048bf87 in db_panic (addr=Could not find the frame base for 
>> "db_panic".
>> ) at /usr/src/sys/ddb/db_command.c:433
>> #4  0xc048c975 in db_command_loop () at /usr/src/sys/ddb/db_command.c:401
>> #5  0xc048e0e5 in db_trap (type=12, code=0) at 
>> /usr/src/sys/ddb/db_main.c:222
>> #6  0xc07703d6 in kdb_trap (type=12, code=0, tf=0xd61f88b0) at 
>> /usr/src/sys/kern/subr_kdb.c:502
>> #7  0xc09f31bc in trap_fatal (frame=0xd61f88b0, eva=16) at 
>> /usr/src/sys/i386/i386/trap.c:861
>> #8  0xc09f33f3 in trap_pfault (frame=0xd61f88b0, usermode=0, eva=16) 
>> at /usr/src/sys/i386/i386/trap.c:784
>> #9  0xc09f3d92 in trap (frame=0xd61f88b0) at 
>> /usr/src/sys/i386/i386/trap.c:462
>> #10 0xc09d9a0b in calltrap () at /usr/src/sys/i386/i386/exception.s:139
>> #11 0xc08d088d in nfsrv_readdirplus (nfsd=0xc3bb4500, slp=0xc3d31900, 
>> td=0xc3b0be00, mrq=0xd61f8c58) at /usr/src/sys/nfsserver/nfs_serv.c:3640
>> #12 0xc08de4b4 in nfssvc (td=0xc3b0be00, uap=0xd61f8cfc) at 
>> /usr/src/sys/nfsserver/nfs_syscalls.c:469
>> #13 0xc09f36d3 in syscall (frame=0xd61f8d38) at 
>> /usr/src/sys/i386/i386/trap.c:1006
>> #14 0xc09d9a70 in Xint0x80_syscall () at 
>> /usr/src/sys/i386/i386/exception.s:196
>> #15 0x00000033 in ?? ()
>> Previous frame inner to this frame (corrupt stack?)
>> (kgdb) list *0xc08d088d
>> 0xc08d088d is in nfsrv_readdirplus 
>> (/usr/src/sys/nfsserver/nfs_serv.c:3640).
>> 3635                             */
>> 3636                            if (VFS_VGET(vp->v_mount, 
>> dp->d_fileno, LK_EXCLUSIVE,
>> 3637                                &nvp))
>> 3638                                    goto invalid;
>> 3639                            bzero((caddr_t)nfhp, NFSX_V3FH);
>> 3640                            nfhp->fh_fsid =
>> 3641                                    nvp->v_mount->mnt_stat.f_fsid;
>> 3642                            /*
>> 3643                             * XXXRW: Assert the mountpoints are 
>> the same so that
>> 3644                             * we know that acquiring Giant based 
>> on the
>> _______________________________________________
>> freebsd-current at freebsd.org mailing list
>> http://lists.freebsd.org/mailman/listinfo/freebsd-current
>> To unsubscribe, send any mail to 
>> "freebsd-current-unsubscribe at freebsd.org"
> 



More information about the freebsd-current mailing list