]> git.hungrycats.org Git - linux/commitdiff
[PATCH] ext3_new_inode fixlet
authorAndrew Morton <akpm@osdl.org>
Tue, 18 Nov 2003 16:15:53 +0000 (08:15 -0800)
committerLinus Torvalds <torvalds@home.osdl.org>
Tue, 18 Nov 2003 16:15:53 +0000 (08:15 -0800)
From: Alex Tomas <alex@clusterfs.com>

If the ext3 inode allocator tries to claim an inode and fails because
another CPU got in there first it will then advance onto the next
blockgroup and try again.

Change it to advance onto the next inode within the same blockgroup
instead.

fs/ext3/ialloc.c

index 7f0c2bfb81f7b4f7ae29eab8a45e1bf3a8be8a5e..13f61fc9e85a8dff2913ef1471bd1ec8ff77f314 100644 (file)
@@ -469,8 +469,11 @@ struct inode *ext3_new_inode(handle_t *handle, struct inode * dir, int mode)
                if (!bitmap_bh)
                        goto fail;
 
-               ino = ext3_find_first_zero_bit((unsigned long *)
-                               bitmap_bh->b_data, EXT3_INODES_PER_GROUP(sb));
+               ino = 0;
+
+repeat_in_this_group:
+               ino = ext3_find_next_zero_bit((unsigned long *)
+                               bitmap_bh->b_data, EXT3_INODES_PER_GROUP(sb), ino);
                if (ino < EXT3_INODES_PER_GROUP(sb)) {
                        int credits = 0;
 
@@ -493,6 +496,9 @@ struct inode *ext3_new_inode(handle_t *handle, struct inode * dir, int mode)
                        }
                        /* we lost it */
                        journal_release_buffer(handle, bitmap_bh, credits);
+
+                       if (++ino < EXT3_INODES_PER_GROUP(sb))
+                               goto repeat_in_this_group;
                }
 
                /*