Date: Thu, 21 Apr 2011 13:25:29 +0900 From: Daichi GOTO <daichi@freebsd.org> To: Daichi GOTO <daichi@freebsd.org> Cc: freebsd-fs@freebsd.org Subject: Re: unionfs kernel panic while mounting (i386, R8.2) Message-ID: <20110421132529.4c0aa749.daichi@freebsd.org> In-Reply-To: <20110421124919.5dc64403.daichi@freebsd.org> References: <1303118948.2112.40.camel@localhost> <20110421124919.5dc64403.daichi@freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, 21 Apr 2011 12:49:19 +0900 Daichi GOTO <daichi@freebsd.org> wrote: > Hi Alex > > I have tried to reproduce your panic, but couldn't > get a panic. Would you please try unionfs on 8-stable? Now I got a panic, ok ;) > ps. > I do refreshing my patch to get merged into current. > After some tests, I'll open my new patch for public test. > thanks :) > > On Mon, 18 Apr 2011 13:29:08 +0400 > Alex Zimnitsky <aavzz@yandex.ru> wrote: > > Hi everyone! > > > > > > There is a problem with unionfs mount procedure > > which consistently causes system crash. I observed > > this behavior (freshly installed release 8.2) on > > two i386 boxes one of which was an ancient laptop > > with 256MB RAM and the other was a not-so-old > > desktop with more than 4GB jf RAM. > > > > ******* How to reproduce: ************** > > > > mkdir /var/ftp > > > > mkdir /var/ftpdata1 > > mkdir /var/ftpdata2 > > ... > > mkdir /var/ftpdata15 > > > > mount -t unionfs /var/ftpdata1 /var/ftp > > mount -t unionfs /var/ftpdata2 /var/ftp > > ... > > mount -t unionfs /var/ftpdata15 /var/ftp > > > > mounting /var/ftpdata12 reliably caused > > kernel panic on the laptop in my case > > (desktop reliably crashed while mounting ftpdata10-12) > > > > ************ Possible cause **************** > > > > A little investigation revealed that this crash > > happens in unionfs_statfs which lives > > in /usr/src/sys/fs/unionfs/union_vfsops.c > > > > Debug printing showed that it calls itself > > recursively n+1 times depending on the > > quantity of previously mounted dirs: > > > > mount -t unionfs /var/ftpdata1 /var/ftp - 2 times > > mount -t unionfs /var/ftpdata2 /var/ftp - 3 times > > ... > > mount -t unionfs /var/ftpdata10 /var/ftp - 11 times > > ... > > > > It appears that the crash is caused by lack of system > > resources (stack I guess) > > > > The crash itself writes something like "double fault" > > or "double error" (I'm sure about that "double") > > > > > > **************** Workaround ************************ > > > > Reducing recursion eliminates the problem. > > > > unionfs_statfs part: > > > > old (with the problem): > > --------------------------------------------------------------- > > > > struct unionfs_mount *ump; > > int error; > > struct statfs mstat; > > uint64_t lbsize; > > > > ump = MOUNTTOUNIONFSMOUNT(mp); > > > > UNIONFSDEBUG("unionfs_statfs(mp = %p, lvp = %p, uvp = %p)\n", > > (void *)mp, (void *)ump->um_lowervp, (void > > *)ump->um_uppervp); > > > > bzero(&mstat, sizeof(mstat)); > > > > error = VFS_STATFS(ump->um_lowervp->v_mount, &mstat); > > > > ----------------------------------------------------------------------- > > > > new (without crashes): > > ----------------------------------------------------------------------- > > struct unionfs_mount *ump; > > int error; > > struct statfs mstat; > > uint64_t lbsize; > > > > struct unionfs_mount *ump_aavzz; /*AAVZZ*/ > > > > /*ump = MOUNTTOUNIONFSMOUNT(mp);*/ /*AAVZZ*/ > > ump_aavzz = MOUNTTOUNIONFSMOUNT(mp); /*AAVZZ*/ > > > > > > UNIONFSDEBUG("unionfs_statfs(mp = %p, lvp = %p, uvp = %p)\n", > > (void *)mp, (void *)ump->um_lowervp, (void > > *)ump->um_uppervp); > > > > bzero(&mstat, sizeof(mstat)); > > > > /*Dirty hack to fast forward*/ > > while (! > > strcmp(ump_aavzz->um_lowervp->v_mount->mnt_stat.f_fstypename, > > "unionfs")) { > > > > ump_aavzz=MOUNTTOUNIONFSMOUNT(ump_aavzz->um_lowervp->v_mount); > > } > > ump=ump_aavzz; > > /*end of dirty hack*/ > > > > error = VFS_STATFS(ump->um_lowervp->v_mount, &mstat); > > > > ------------------------------------------------------------------------------- > > > > > > **************************** Considerations ************************** > > > > I'm sure that the above is not the way to treat the problem. But > > I do not have deep understanding of the internal workings of filesystems > > in general and unionfs in particular and cannot come up with anything > > better. > > > > Probably this growing recursion should not take place at all, which > > requires defferent handling of ump->um_lowervp->v_mount during list > > creation (mount?). > > > > > > > > Regards, > > > > Alex > > > > _______________________________________________ > > freebsd-fs@freebsd.org mailing list > > http://lists.freebsd.org/mailman/listinfo/freebsd-fs > > To unsubscribe, send any mail to "freebsd-fs-unsubscribe@freebsd.org" > > -- > Daichi GOTO > _______________________________________________ > freebsd-fs@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-fs > To unsubscribe, send any mail to "freebsd-fs-unsubscribe@freebsd.org" -- Daichi GOTO 81-42-316-7945 | daichi@ongs.co.jp | http://www.ongs.co.jp LinkedIn: http://linkedin.com/in/daichigoto
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20110421132529.4c0aa749.daichi>