aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiklos Szeredi <miklos@szeredi.hu>2006-10-17 03:10:09 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2006-10-17 11:18:45 -0400
commit265126ba9e1f8e217e61d1017c6609f76828aa7a (patch)
tree27eeee59ad960f3c31d589caeb69f988bf4e78ce
parent8da5ff23ce0a84d9845b01e6fe5047e17836bf5a (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.c3
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