ext2fs crash in -current (r218056)
Doug Barton
dougb at FreeBSD.org
Wed Feb 2 21:13:51 UTC 2011
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.
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 at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-fs
> To unsubscribe, send any mail to "freebsd-fs-unsubscribe at freebsd.org"
>
--
Nothin' ever doesn't change, but nothin' changes much.
-- OK Go
Breadth of IT experience, and depth of knowledge in the DNS.
Yours for the right price. :) http://SupersetSolutions.com/
More information about the freebsd-fs
mailing list