Skip to content

Commit

Permalink
[fuse] fix race between checking and setting file->private_data
Browse files Browse the repository at this point in the history
BKL does not protect against races if the task may sleep between
checking and setting a value.  So move checking of file->private_data
near to setting it in fuse_fill_super().

Found by Al Viro.

Signed-off-by: Miklos Szeredi <[email protected]>
  • Loading branch information
szmi committed Apr 26, 2006
1 parent 6dbbcb1 commit 8aa09a5
Showing 1 changed file with 8 additions and 5 deletions.
13 changes: 8 additions & 5 deletions fs/fuse/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -500,11 +500,6 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent)
if (file->f_op != &fuse_dev_operations)
return -EINVAL;

/* Setting file->private_data can't race with other mount()
instances, since BKL is held for ->get_sb() */
if (file->private_data)
return -EINVAL;

fc = new_conn();
if (!fc)
return -ENOMEM;
Expand Down Expand Up @@ -540,6 +535,12 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent)
if (err)
goto err_free_req;

/* Setting file->private_data can't race with other mount()
instances, since BKL is held for ->get_sb() */
err = -EINVAL;
if (file->private_data)
goto err_kobject_del;

sb->s_root = root_dentry;
fc->mounted = 1;
fc->connected = 1;
Expand All @@ -556,6 +557,8 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent)

return 0;

err_kobject_del:
kobject_del(&fc->kobj);
err_free_req:
fuse_request_free(init_req);
err_put_root:
Expand Down

0 comments on commit 8aa09a5

Please sign in to comment.