Skip to content

Commit

Permalink
btrfs: fix a deadlock in btrfs_scan_one_device()
Browse files Browse the repository at this point in the history
pathname resolution under a global mutex, taken on some paths in ->mount()
is a Bad Idea(tm) - think what happens if said pathname resolution triggers
automount of some btrfs instance and walks into attempt to grab the same
mutex.  Deadlock - we are waiting for daemon to finish walking the path,
daemon is waiting for us to release the mutex...

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
  • Loading branch information
Al Viro committed Jan 9, 2012
1 parent 6de1d09 commit 10f6327
Showing 1 changed file with 2 additions and 3 deletions.
5 changes: 2 additions & 3 deletions fs/btrfs/volumes.c
Original file line number Diff line number Diff line change
Expand Up @@ -706,8 +706,6 @@ int btrfs_scan_one_device(const char *path, fmode_t flags, void *holder,
u64 devid;
u64 transid;

mutex_lock(&uuid_mutex);

flags |= FMODE_EXCL;
bdev = blkdev_get_by_path(path, flags, holder);

Expand All @@ -716,6 +714,7 @@ int btrfs_scan_one_device(const char *path, fmode_t flags, void *holder,
goto error;
}

mutex_lock(&uuid_mutex);
ret = set_blocksize(bdev, 4096);
if (ret)
goto error_close;
Expand All @@ -737,9 +736,9 @@ int btrfs_scan_one_device(const char *path, fmode_t flags, void *holder,

brelse(bh);
error_close:
mutex_unlock(&uuid_mutex);
blkdev_put(bdev, flags);
error:
mutex_unlock(&uuid_mutex);
return ret;
}

Expand Down

0 comments on commit 10f6327

Please sign in to comment.