diff options
author | Alex Shi <alex.shi@linaro.org> | 2017-01-19 12:03:35 +0800 |
---|---|---|
committer | Alex Shi <alex.shi@linaro.org> | 2017-01-19 12:03:35 +0800 |
commit | d28996d022a87e81bd6d4bedd5990b68d7e4d567 (patch) | |
tree | 8b7a18ca2701b77a626a0e3c155d5e63a7fa99a6 /fs/block_dev.c | |
parent | ec54c473486f2addc56e99c1191e4975123930d7 (diff) | |
parent | 108df9c204f549150c7e1e3262ffd19bd624269e (diff) |
Merge branch 'linux-linaro-lsk-v3.18' into linux-linaro-lsk-v3.18-rtlsk-v3.18-17.02-rt
Diffstat (limited to 'fs/block_dev.c')
-rw-r--r-- | fs/block_dev.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/fs/block_dev.c b/fs/block_dev.c index 1d9c9f3754f8..543dcf972120 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -694,7 +694,7 @@ static bool bd_may_claim(struct block_device *bdev, struct block_device *whole, return true; /* already a holder */ else if (bdev->bd_holder != NULL) return false; /* held by someone else */ - else if (bdev->bd_contains == bdev) + else if (whole == bdev) return true; /* is a whole device which isn't held */ else if (whole->bd_holder == bd_may_claim) @@ -1727,6 +1727,7 @@ void iterate_bdevs(void (*func)(struct block_device *, void *), void *arg) spin_lock(&inode_sb_list_lock); list_for_each_entry(inode, &blockdev_superblock->s_inodes, i_sb_list) { struct address_space *mapping = inode->i_mapping; + struct block_device *bdev; spin_lock(&inode->i_lock); if (inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW) || @@ -1747,8 +1748,12 @@ void iterate_bdevs(void (*func)(struct block_device *, void *), void *arg) */ iput(old_inode); old_inode = inode; + bdev = I_BDEV(inode); - func(I_BDEV(inode), arg); + mutex_lock(&bdev->bd_mutex); + if (bdev->bd_openers) + func(bdev, arg); + mutex_unlock(&bdev->bd_mutex); spin_lock(&inode_sb_list_lock); } |