Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 28566
b: refs/heads/master
c: 09d967c
h: refs/heads/master
v: v3
  • Loading branch information
OGAWA Hirofumi authored and Linus Torvalds committed Jun 22, 2006
1 parent 1af024f commit 3ac73d0
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 8 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 0e5b3781591cc954037c08ef78edf7f1192d38c5
refs/heads/master: 09d967c6f32b35eab15b45862ae16e4f06259d8e
32 changes: 25 additions & 7 deletions trunk/fs/block_dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -414,21 +414,31 @@ EXPORT_SYMBOL(bdput);
static struct block_device *bd_acquire(struct inode *inode)
{
struct block_device *bdev;

spin_lock(&bdev_lock);
bdev = inode->i_bdev;
if (bdev && igrab(bdev->bd_inode)) {
if (bdev) {
atomic_inc(&bdev->bd_inode->i_count);
spin_unlock(&bdev_lock);
return bdev;
}
spin_unlock(&bdev_lock);

bdev = bdget(inode->i_rdev);
if (bdev) {
spin_lock(&bdev_lock);
if (inode->i_bdev)
__bd_forget(inode);
inode->i_bdev = bdev;
inode->i_mapping = bdev->bd_inode->i_mapping;
list_add(&inode->i_devices, &bdev->bd_inodes);
if (!inode->i_bdev) {
/*
* We take an additional bd_inode->i_count for inode,
* and it's released in clear_inode() of inode.
* So, we can access it via ->i_mapping always
* without igrab().
*/
atomic_inc(&bdev->bd_inode->i_count);
inode->i_bdev = bdev;
inode->i_mapping = bdev->bd_inode->i_mapping;
list_add(&inode->i_devices, &bdev->bd_inodes);
}
spin_unlock(&bdev_lock);
}
return bdev;
Expand All @@ -438,10 +448,18 @@ static struct block_device *bd_acquire(struct inode *inode)

void bd_forget(struct inode *inode)
{
struct block_device *bdev = NULL;

spin_lock(&bdev_lock);
if (inode->i_bdev)
if (inode->i_bdev) {
if (inode->i_sb != blockdev_superblock)
bdev = inode->i_bdev;
__bd_forget(inode);
}
spin_unlock(&bdev_lock);

if (bdev)
iput(bdev->bd_inode);
}

int bd_claim(struct block_device *bdev, void *holder)
Expand Down

0 comments on commit 3ac73d0

Please sign in to comment.