diff options
author | Jeffrey Layton <jlayton@redhat.com> | 2007-05-08 00:29:48 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-05-08 11:15:10 -0700 |
commit | 3361c7bebbf207f57f3dd1282cd87e1e37c082ac (patch) | |
tree | 53c5ee74c70ed9727964996f3cf2fa4a0ff368ea /fs/inode.c | |
parent | 9d0633cfedde484d30eef869f749c04709ab3e42 (diff) | |
download | lwn-3361c7bebbf207f57f3dd1282cd87e1e37c082ac.tar.gz lwn-3361c7bebbf207f57f3dd1282cd87e1e37c082ac.zip |
make iunique use a do/while loop rather than its obscure goto loop
A while back, Christoph mentioned that he thought that iunique ought to be
cleaned up to use a more conventional loop construct. This patch does that,
turning the strange goto loop into a do/while.
Signed-off-by: Jeff Layton <jlayton@redhat.com>
Cc: Christoph Hellwig <hch@lst.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/inode.c')
-rw-r--r-- | fs/inode.c | 24 |
1 files changed, 10 insertions, 14 deletions
diff --git a/fs/inode.c b/fs/inode.c index c03089421b6f..81508b0a3a70 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -685,25 +685,21 @@ ino_t iunique(struct super_block *sb, ino_t max_reserved) { static ino_t counter; struct inode *inode; - struct hlist_head * head; + struct hlist_head *head; ino_t res; + spin_lock(&inode_lock); -retry: - if (counter > max_reserved) { - head = inode_hashtable + hash(sb,counter); + do { + if (counter <= max_reserved) + counter = max_reserved + 1; res = counter++; + head = inode_hashtable + hash(sb, res); inode = find_inode_fast(sb, head, res); - if (!inode) { - spin_unlock(&inode_lock); - return res; - } - } else { - counter = max_reserved + 1; - } - goto retry; - -} + } while (inode != NULL); + spin_unlock(&inode_lock); + return res; +} EXPORT_SYMBOL(iunique); struct inode *igrab(struct inode *inode) |