Skip site navigation (1)Skip section navigation (2)
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>