After reading a bitmap block for i-nodes or blocks, recheck the count of
free i-nodes or blocks to handle a race where another thread might have allocated the last i-node or block while we were waiting for the buffer. Tested by: dougb
This commit is contained in:
parent
e0e5b8b471
commit
73dd6d1f8f
@ -650,6 +650,15 @@ ext2_alloccg(struct inode *ip, int cg, daddr_t bpref, int size)
|
||||
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)
|
||||
@ -776,6 +785,15 @@ ext2_nodealloccg(struct inode *ip, int cg, daddr_t ipref, int mode)
|
||||
EXT2_LOCK(ump);
|
||||
return (0);
|
||||
}
|
||||
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.
|
||||
*/
|
||||
brelse(bp);
|
||||
EXT2_LOCK(ump);
|
||||
return (0);
|
||||
}
|
||||
ibp = (char *)bp->b_data;
|
||||
if (ipref) {
|
||||
ipref %= fs->e2fs->e2fs_ipg;
|
||||
|
Loading…
x
Reference in New Issue
Block a user