diff options
author | Miklos Szeredi <miklos@szeredi.hu> | 2006-10-17 03:10:09 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-17 11:18:45 -0400 |
commit | 265126ba9e1f8e217e61d1017c6609f76828aa7a (patch) | |
tree | 27eeee59ad960f3c31d589caeb69f988bf4e78ce | |
parent | 8da5ff23ce0a84d9845b01e6fe5047e17836bf5a (diff) |
[PATCH] fuse: fix spurious BUG
Fix a spurious BUG in an unlikely race, where at least three parallel lookups
return the same inode, but with different file type. This has not yet been
observed in real life.
Allowing unlimited retries could delay fuse_iget() indefinitely, but this is
really for the broken userspace filesystem to worry about.
Signed-off-by: Miklos Szeredi <miklos@szeredi.hu>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r-- | fs/fuse/inode.c | 3 |
1 files changed, 0 insertions, 3 deletions
diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index e9114237f31f..4ee8f72e6380 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c | |||
@@ -172,7 +172,6 @@ struct inode *fuse_iget(struct super_block *sb, unsigned long nodeid, | |||
172 | struct inode *inode; | 172 | struct inode *inode; |
173 | struct fuse_inode *fi; | 173 | struct fuse_inode *fi; |
174 | struct fuse_conn *fc = get_fuse_conn_super(sb); | 174 | struct fuse_conn *fc = get_fuse_conn_super(sb); |
175 | int retried = 0; | ||
176 | 175 | ||
177 | retry: | 176 | retry: |
178 | inode = iget5_locked(sb, nodeid, fuse_inode_eq, fuse_inode_set, &nodeid); | 177 | inode = iget5_locked(sb, nodeid, fuse_inode_eq, fuse_inode_set, &nodeid); |
@@ -186,11 +185,9 @@ struct inode *fuse_iget(struct super_block *sb, unsigned long nodeid, | |||
186 | fuse_init_inode(inode, attr); | 185 | fuse_init_inode(inode, attr); |
187 | unlock_new_inode(inode); | 186 | unlock_new_inode(inode); |
188 | } else if ((inode->i_mode ^ attr->mode) & S_IFMT) { | 187 | } else if ((inode->i_mode ^ attr->mode) & S_IFMT) { |
189 | BUG_ON(retried); | ||
190 | /* Inode has changed type, any I/O on the old should fail */ | 188 | /* Inode has changed type, any I/O on the old should fail */ |
191 | make_bad_inode(inode); | 189 | make_bad_inode(inode); |
192 | iput(inode); | 190 | iput(inode); |
193 | retried = 1; | ||
194 | goto retry; | 191 | goto retry; |
195 | } | 192 | } |
196 | 193 | ||