Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 2 Feb 2011 17:04:03 -0500
From:      John Baldwin <jhb@freebsd.org>
To:        Doug Barton <dougb@freebsd.org>
Cc:        freebsd-fs@freebsd.org
Subject:   Re: ext2fs crash in -current (r218056)
Message-ID:  <201102021704.04274.jhb@freebsd.org>
In-Reply-To: <4D49C90C.2090003@FreeBSD.org>
References:  <4D47B954.3010600@FreeBSD.org> <20110202014252.GA1574@earth> <4D49C90C.2090003@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wednesday, February 02, 2011 04:13:48 pm Doug Barton wrote:
> I haven't had a chance to test this patch yet, but John's did not work
> (sorry):
> 
> http://dougbarton.us/ext2fs-crash-dump-2.jpg
> 
> No actual dump this time either.
> 
> I'm happy to test the patch below on Thursday if there is consensus that
> it will work.

Err, this is a different panic than what you reported earlier.  Your disk died 
and spewed a bunch of EIO errors.  I can look at the locking assertion failure 
tomorrow, but this is a differnt issue.  Even UFS needed a good bit of work to 
handle disks dying gracefully.

> Doug
> 
> On 02/01/2011 17:42, Aditya Sarawgi wrote:
> > Hi John,
> > 
> > I can see what you are saying. Can't we check
> > the number of free blocks in the given cg without
> > locking the fs.
> > This way
> > 
> >    		EXT2_LOCK(ump);
> >    		return (0);
> >    	
> >    	}
> >   
> >   +	if (fs->e2fs_gd[cg].ext2bgd_nbfree == 0) {
> >   +		/*
> >   +		 * Another thread allocated the last block in this
> >   +		 * group while we were waiting for the buffer.
> >   +		 */
> >   +		brelse(bp);
> >   +		EXT2_LOCK(ump);
> >   +		return (0);
> >   +	}
> >   
> >    	bbp = (char *)bp->b_data;
> >    	
> >    	if (dtog(fs, bpref) != cg)
> > 
> > UFS is doing something similar
> > 
> > static ufs2_daddr_t
> > ffs_alloccg(ip, cg, bpref, size, rsize)
> > 
> >    struct inode *ip;
> >    u_int cg;
> >    ufs2_daddr_t bpref;
> >    int size;
> >    int rsize;
> > 
> > {
> > 
> >    struct fs *fs;
> >    struct cg *cgp;
> >    struct buf *bp;
> >    struct ufsmount *ump;
> >    ufs1_daddr_t bno;
> >    ufs2_daddr_t blkno;
> >    int i, allocsiz, error, frags;
> >    u_int8_t *blksfree;
> >    
> >    ump = ip->i_ump;
> >    fs = ip->i_fs;
> >    if (fs->fs_cs(fs, cg).cs_nbfree == 0&&  size == fs->fs_bsize)
> >    
> >      return (0);
> >    
> >    UFS_UNLOCK(ump);
> >    error = bread(ip->i_devvp, fsbtodb(fs, cgtod(fs, cg)),
> >    
> >      (int)fs->fs_cgsize, NOCRED,&bp);
> >    
> >    if (error)
> >    
> >      goto fail;
> >    
> >    cgp = (struct cg *)bp->b_data;
> >    if (!cg_chkmagic(cgp) ||
> >    
> >        (cgp->cg_cs.cs_nbfree == 0&&  size == fs->fs_bsize))
> >      
> >      goto fail;
> >> 
> >> Please try this:
> >> 
> >> Index: ext2_alloc.c
> >> ===================================================================
> >> --- ext2_alloc.c	(revision 218175)
> >> +++ ext2_alloc.c	(working copy)
> >> @@ -650,6 +650,18 @@
> >> 
> >>   		EXT2_LOCK(ump);
> >>   		return (0);
> >>   	
> >>   	}
> >> 
> >> +	EXT2_LOCK(ump);
> >> +	if (fs->e2fs_gd[cg].ext2bgd_nbfree == 0) {
> >> +		/*
> >> +		 * Another thread allocated the last block in this
> >> +		 * group while we were waiting for the buffer.
> >> +		 */
> >> +		EXT2_UNLOCK(ump);
> >> +		brelse(bp);
> >> +		EXT2_LOCK(ump);
> >> +		return (0);
> >> +	}
> >> +	EXT2_UNLOCK(ump);
> >> 
> >>   	bbp = (char *)bp->b_data;
> >>   	
> >>   	if (dtog(fs, bpref) != cg)
> >> 
> >> @@ -776,6 +788,18 @@
> >> 
> >>   		EXT2_LOCK(ump);
> >>   		return (0);
> >>   	
> >>   	}
> >> 
> >> +	EXT2_LOCK(ump);
> >> +	if (fs->e2fs_gd[cg].ext2bgd_nifree == 0) {
> >> +		/*
> >> +		 * Another thread allocated the last i-node in this
> >> +		 * group while we were waiting for the buffer.
> >> +		 */
> >> +		EXT2_UNLOCK(ump);
> >> +		brelse(bp);
> >> +		EXT2_LOCK(ump);
> >> +		return (0);
> >> +	}
> >> +	EXT2_UNLOCK(ump);
> >> 
> >>   	ibp = (char *)bp->b_data;
> >>   	if (ipref) {
> >>   	
> >>   		ipref %= fs->e2fs->e2fs_ipg;
> > 
> > --
> > Aditya Sarawgi
> > _______________________________________________
> > 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"

-- 
John Baldwin



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201102021704.04274.jhb>