diff options
40 files changed, 57 insertions, 49 deletions
diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c index 9e670d527646..ef5905f7c8a3 100644 --- a/fs/9p/vfs_inode.c +++ b/fs/9p/vfs_inode.c | |||
| @@ -1789,9 +1789,10 @@ v9fs_vfs_link_dotl(struct dentry *old_dentry, struct inode *dir, | |||
| 1789 | kfree(st); | 1789 | kfree(st); |
| 1790 | } else { | 1790 | } else { |
| 1791 | /* Caching disabled. No need to get upto date stat info. | 1791 | /* Caching disabled. No need to get upto date stat info. |
| 1792 | * This dentry will be released immediately. So, just i_count++ | 1792 | * This dentry will be released immediately. So, just hold the |
| 1793 | * inode | ||
| 1793 | */ | 1794 | */ |
| 1794 | atomic_inc(&old_dentry->d_inode->i_count); | 1795 | ihold(old_dentry->d_inode); |
| 1795 | } | 1796 | } |
| 1796 | 1797 | ||
| 1797 | dentry->d_op = old_dentry->d_op; | 1798 | dentry->d_op = old_dentry->d_op; |
diff --git a/fs/affs/inode.c b/fs/affs/inode.c index 3a0fdec175ba..5d828903ac69 100644 --- a/fs/affs/inode.c +++ b/fs/affs/inode.c | |||
| @@ -388,7 +388,7 @@ affs_add_entry(struct inode *dir, struct inode *inode, struct dentry *dentry, s3 | |||
| 388 | affs_adjust_checksum(inode_bh, block - be32_to_cpu(chain)); | 388 | affs_adjust_checksum(inode_bh, block - be32_to_cpu(chain)); |
| 389 | mark_buffer_dirty_inode(inode_bh, inode); | 389 | mark_buffer_dirty_inode(inode_bh, inode); |
| 390 | inode->i_nlink = 2; | 390 | inode->i_nlink = 2; |
| 391 | atomic_inc(&inode->i_count); | 391 | ihold(inode); |
| 392 | } | 392 | } |
| 393 | affs_fix_checksum(sb, bh); | 393 | affs_fix_checksum(sb, bh); |
| 394 | mark_buffer_dirty_inode(bh, inode); | 394 | mark_buffer_dirty_inode(bh, inode); |
diff --git a/fs/afs/dir.c b/fs/afs/dir.c index 0d38c09bd55e..5439e1bc9a86 100644 --- a/fs/afs/dir.c +++ b/fs/afs/dir.c | |||
| @@ -1045,7 +1045,7 @@ static int afs_link(struct dentry *from, struct inode *dir, | |||
| 1045 | if (ret < 0) | 1045 | if (ret < 0) |
| 1046 | goto link_error; | 1046 | goto link_error; |
| 1047 | 1047 | ||
| 1048 | atomic_inc(&vnode->vfs_inode.i_count); | 1048 | ihold(&vnode->vfs_inode); |
| 1049 | d_instantiate(dentry, &vnode->vfs_inode); | 1049 | d_instantiate(dentry, &vnode->vfs_inode); |
| 1050 | key_put(key); | 1050 | key_put(key); |
| 1051 | _leave(" = 0"); | 1051 | _leave(" = 0"); |
| @@ -1553,10 +1553,9 @@ static void aio_batch_add(struct address_space *mapping, | |||
| 1553 | * | 1553 | * |
| 1554 | * When we're called, we always have a reference | 1554 | * When we're called, we always have a reference |
| 1555 | * on the file, so we must always have a reference | 1555 | * on the file, so we must always have a reference |
| 1556 | * on the inode, so igrab must always just | 1556 | * on the inode, so ihold() is safe here. |
| 1557 | * bump the count and move on. | ||
| 1558 | */ | 1557 | */ |
| 1559 | atomic_inc(&mapping->host->i_count); | 1558 | ihold(mapping->host); |
| 1560 | abe->mapping = mapping; | 1559 | abe->mapping = mapping; |
| 1561 | hlist_add_head(&abe->list, &batch_hash[bucket]); | 1560 | hlist_add_head(&abe->list, &batch_hash[bucket]); |
| 1562 | return; | 1561 | return; |
diff --git a/fs/anon_inodes.c b/fs/anon_inodes.c index e4b75d6eda83..9c8e87b0361f 100644 --- a/fs/anon_inodes.c +++ b/fs/anon_inodes.c | |||
| @@ -111,10 +111,9 @@ struct file *anon_inode_getfile(const char *name, | |||
| 111 | path.mnt = mntget(anon_inode_mnt); | 111 | path.mnt = mntget(anon_inode_mnt); |
| 112 | /* | 112 | /* |
| 113 | * We know the anon_inode inode count is always greater than zero, | 113 | * We know the anon_inode inode count is always greater than zero, |
| 114 | * so we can avoid doing an igrab() and we can use an open-coded | 114 | * so ihold() is safe. |
| 115 | * atomic_inc(). | ||
| 116 | */ | 115 | */ |
| 117 | atomic_inc(&anon_inode_inode->i_count); | 116 | ihold(anon_inode_inode); |
| 118 | 117 | ||
| 119 | path.dentry->d_op = &anon_inodefs_dentry_operations; | 118 | path.dentry->d_op = &anon_inodefs_dentry_operations; |
| 120 | d_instantiate(path.dentry, anon_inode_inode); | 119 | d_instantiate(path.dentry, anon_inode_inode); |
diff --git a/fs/bfs/dir.c b/fs/bfs/dir.c index d967e052b779..685ecff3ab31 100644 --- a/fs/bfs/dir.c +++ b/fs/bfs/dir.c | |||
| @@ -176,7 +176,7 @@ static int bfs_link(struct dentry *old, struct inode *dir, | |||
| 176 | inc_nlink(inode); | 176 | inc_nlink(inode); |
| 177 | inode->i_ctime = CURRENT_TIME_SEC; | 177 | inode->i_ctime = CURRENT_TIME_SEC; |
| 178 | mark_inode_dirty(inode); | 178 | mark_inode_dirty(inode); |
| 179 | atomic_inc(&inode->i_count); | 179 | ihold(inode); |
| 180 | d_instantiate(new, inode); | 180 | d_instantiate(new, inode); |
| 181 | mutex_unlock(&info->bfs_lock); | 181 | mutex_unlock(&info->bfs_lock); |
| 182 | return 0; | 182 | return 0; |
diff --git a/fs/block_dev.c b/fs/block_dev.c index b737451e2e9d..81972eb34b39 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c | |||
| @@ -550,7 +550,7 @@ EXPORT_SYMBOL(bdget); | |||
| 550 | */ | 550 | */ |
| 551 | struct block_device *bdgrab(struct block_device *bdev) | 551 | struct block_device *bdgrab(struct block_device *bdev) |
| 552 | { | 552 | { |
| 553 | atomic_inc(&bdev->bd_inode->i_count); | 553 | ihold(bdev->bd_inode); |
| 554 | return bdev; | 554 | return bdev; |
| 555 | } | 555 | } |
| 556 | 556 | ||
| @@ -580,7 +580,7 @@ static struct block_device *bd_acquire(struct inode *inode) | |||
| 580 | spin_lock(&bdev_lock); | 580 | spin_lock(&bdev_lock); |
| 581 | bdev = inode->i_bdev; | 581 | bdev = inode->i_bdev; |
| 582 | if (bdev) { | 582 | if (bdev) { |
| 583 | atomic_inc(&bdev->bd_inode->i_count); | 583 | ihold(bdev->bd_inode); |
| 584 | spin_unlock(&bdev_lock); | 584 | spin_unlock(&bdev_lock); |
| 585 | return bdev; | 585 | return bdev; |
| 586 | } | 586 | } |
| @@ -591,12 +591,12 @@ static struct block_device *bd_acquire(struct inode *inode) | |||
| 591 | spin_lock(&bdev_lock); | 591 | spin_lock(&bdev_lock); |
| 592 | if (!inode->i_bdev) { | 592 | if (!inode->i_bdev) { |
| 593 | /* | 593 | /* |
| 594 | * We take an additional bd_inode->i_count for inode, | 594 | * We take an additional reference to bd_inode, |
| 595 | * and it's released in clear_inode() of inode. | 595 | * and it's released in clear_inode() of inode. |
| 596 | * So, we can access it via ->i_mapping always | 596 | * So, we can access it via ->i_mapping always |
| 597 | * without igrab(). | 597 | * without igrab(). |
| 598 | */ | 598 | */ |
| 599 | atomic_inc(&bdev->bd_inode->i_count); | 599 | ihold(bdev->bd_inode); |
| 600 | inode->i_bdev = bdev; | 600 | inode->i_bdev = bdev; |
| 601 | inode->i_mapping = bdev->bd_inode->i_mapping; | 601 | inode->i_mapping = bdev->bd_inode->i_mapping; |
| 602 | list_add(&inode->i_devices, &bdev->bd_inodes); | 602 | list_add(&inode->i_devices, &bdev->bd_inodes); |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index f6f2a0da2695..64f99cf69ce0 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
| @@ -4758,7 +4758,7 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir, | |||
| 4758 | } | 4758 | } |
| 4759 | 4759 | ||
| 4760 | btrfs_set_trans_block_group(trans, dir); | 4760 | btrfs_set_trans_block_group(trans, dir); |
| 4761 | atomic_inc(&inode->i_count); | 4761 | ihold(inode); |
| 4762 | 4762 | ||
| 4763 | err = btrfs_add_nondir(trans, dentry, inode, 1, index); | 4763 | err = btrfs_add_nondir(trans, dentry, inode, 1, index); |
| 4764 | 4764 | ||
diff --git a/fs/coda/dir.c b/fs/coda/dir.c index 96fbeab77f2f..5d8b35539601 100644 --- a/fs/coda/dir.c +++ b/fs/coda/dir.c | |||
| @@ -276,7 +276,7 @@ static int coda_link(struct dentry *source_de, struct inode *dir_inode, | |||
| 276 | } | 276 | } |
| 277 | 277 | ||
| 278 | coda_dir_update_mtime(dir_inode); | 278 | coda_dir_update_mtime(dir_inode); |
| 279 | atomic_inc(&inode->i_count); | 279 | ihold(inode); |
| 280 | d_instantiate(de, inode); | 280 | d_instantiate(de, inode); |
| 281 | inc_nlink(inode); | 281 | inc_nlink(inode); |
| 282 | return 0; | 282 | return 0; |
diff --git a/fs/exofs/namei.c b/fs/exofs/namei.c index b7dd0c236863..264e95d02830 100644 --- a/fs/exofs/namei.c +++ b/fs/exofs/namei.c | |||
| @@ -153,7 +153,7 @@ static int exofs_link(struct dentry *old_dentry, struct inode *dir, | |||
| 153 | 153 | ||
| 154 | inode->i_ctime = CURRENT_TIME; | 154 | inode->i_ctime = CURRENT_TIME; |
| 155 | inode_inc_link_count(inode); | 155 | inode_inc_link_count(inode); |
| 156 | atomic_inc(&inode->i_count); | 156 | ihold(inode); |
| 157 | 157 | ||
| 158 | return exofs_add_nondir(dentry, inode); | 158 | return exofs_add_nondir(dentry, inode); |
| 159 | } | 159 | } |
diff --git a/fs/ext2/namei.c b/fs/ext2/namei.c index 71efb0e9a3f2..f8aecd2e3297 100644 --- a/fs/ext2/namei.c +++ b/fs/ext2/namei.c | |||
| @@ -206,7 +206,7 @@ static int ext2_link (struct dentry * old_dentry, struct inode * dir, | |||
| 206 | 206 | ||
| 207 | inode->i_ctime = CURRENT_TIME_SEC; | 207 | inode->i_ctime = CURRENT_TIME_SEC; |
| 208 | inode_inc_link_count(inode); | 208 | inode_inc_link_count(inode); |
| 209 | atomic_inc(&inode->i_count); | 209 | ihold(inode); |
| 210 | 210 | ||
| 211 | err = ext2_add_link(dentry, inode); | 211 | err = ext2_add_link(dentry, inode); |
| 212 | if (!err) { | 212 | if (!err) { |
diff --git a/fs/ext3/namei.c b/fs/ext3/namei.c index 2b35ddb70d65..bce9dce639b8 100644 --- a/fs/ext3/namei.c +++ b/fs/ext3/namei.c | |||
| @@ -2260,7 +2260,7 @@ retry: | |||
| 2260 | 2260 | ||
| 2261 | inode->i_ctime = CURRENT_TIME_SEC; | 2261 | inode->i_ctime = CURRENT_TIME_SEC; |
| 2262 | inc_nlink(inode); | 2262 | inc_nlink(inode); |
| 2263 | atomic_inc(&inode->i_count); | 2263 | ihold(inode); |
| 2264 | 2264 | ||
| 2265 | err = ext3_add_entry(handle, dentry, inode); | 2265 | err = ext3_add_entry(handle, dentry, inode); |
| 2266 | if (!err) { | 2266 | if (!err) { |
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index 314c0d3b3fa9..bd39885b5998 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c | |||
| @@ -2312,7 +2312,7 @@ retry: | |||
| 2312 | 2312 | ||
| 2313 | inode->i_ctime = ext4_current_time(inode); | 2313 | inode->i_ctime = ext4_current_time(inode); |
| 2314 | ext4_inc_count(handle, inode); | 2314 | ext4_inc_count(handle, inode); |
| 2315 | atomic_inc(&inode->i_count); | 2315 | ihold(inode); |
| 2316 | 2316 | ||
| 2317 | err = ext4_add_entry(handle, dentry, inode); | 2317 | err = ext4_add_entry(handle, dentry, inode); |
| 2318 | if (!err) { | 2318 | if (!err) { |
diff --git a/fs/gfs2/ops_inode.c b/fs/gfs2/ops_inode.c index 48a274f1674c..12cbea7502c2 100644 --- a/fs/gfs2/ops_inode.c +++ b/fs/gfs2/ops_inode.c | |||
| @@ -255,7 +255,7 @@ out_parent: | |||
| 255 | gfs2_holder_uninit(ghs); | 255 | gfs2_holder_uninit(ghs); |
| 256 | gfs2_holder_uninit(ghs + 1); | 256 | gfs2_holder_uninit(ghs + 1); |
| 257 | if (!error) { | 257 | if (!error) { |
| 258 | atomic_inc(&inode->i_count); | 258 | ihold(inode); |
| 259 | d_instantiate(dentry, inode); | 259 | d_instantiate(dentry, inode); |
| 260 | mark_inode_dirty(inode); | 260 | mark_inode_dirty(inode); |
| 261 | } | 261 | } |
diff --git a/fs/hfsplus/dir.c b/fs/hfsplus/dir.c index d236d85ec9d7..e318bbc0daf6 100644 --- a/fs/hfsplus/dir.c +++ b/fs/hfsplus/dir.c | |||
| @@ -286,7 +286,7 @@ static int hfsplus_link(struct dentry *src_dentry, struct inode *dst_dir, | |||
| 286 | 286 | ||
| 287 | inc_nlink(inode); | 287 | inc_nlink(inode); |
| 288 | hfsplus_instantiate(dst_dentry, inode, cnid); | 288 | hfsplus_instantiate(dst_dentry, inode, cnid); |
| 289 | atomic_inc(&inode->i_count); | 289 | ihold(inode); |
| 290 | inode->i_ctime = CURRENT_TIME_SEC; | 290 | inode->i_ctime = CURRENT_TIME_SEC; |
| 291 | mark_inode_dirty(inode); | 291 | mark_inode_dirty(inode); |
| 292 | sbi->file_count++; | 292 | sbi->file_count++; |
diff --git a/fs/inode.c b/fs/inode.c index 430d70f2abe7..05ea293d5f32 100644 --- a/fs/inode.c +++ b/fs/inode.c | |||
| @@ -320,6 +320,15 @@ void __iget(struct inode *inode) | |||
| 320 | atomic_inc(&inode->i_count); | 320 | atomic_inc(&inode->i_count); |
| 321 | } | 321 | } |
| 322 | 322 | ||
| 323 | /* | ||
| 324 | * get additional reference to inode; caller must already hold one. | ||
| 325 | */ | ||
| 326 | void ihold(struct inode *inode) | ||
| 327 | { | ||
| 328 | WARN_ON(atomic_inc_return(&inode->i_count) < 2); | ||
| 329 | } | ||
| 330 | EXPORT_SYMBOL(ihold); | ||
| 331 | |||
| 323 | static void inode_lru_list_add(struct inode *inode) | 332 | static void inode_lru_list_add(struct inode *inode) |
| 324 | { | 333 | { |
| 325 | if (list_empty(&inode->i_list)) { | 334 | if (list_empty(&inode->i_list)) { |
diff --git a/fs/jffs2/dir.c b/fs/jffs2/dir.c index ed78a3cf3cb0..79121aa5858b 100644 --- a/fs/jffs2/dir.c +++ b/fs/jffs2/dir.c | |||
| @@ -289,7 +289,7 @@ static int jffs2_link (struct dentry *old_dentry, struct inode *dir_i, struct de | |||
| 289 | mutex_unlock(&f->sem); | 289 | mutex_unlock(&f->sem); |
| 290 | d_instantiate(dentry, old_dentry->d_inode); | 290 | d_instantiate(dentry, old_dentry->d_inode); |
| 291 | dir_i->i_mtime = dir_i->i_ctime = ITIME(now); | 291 | dir_i->i_mtime = dir_i->i_ctime = ITIME(now); |
| 292 | atomic_inc(&old_dentry->d_inode->i_count); | 292 | ihold(old_dentry->d_inode); |
| 293 | } | 293 | } |
| 294 | return ret; | 294 | return ret; |
| 295 | } | 295 | } |
| @@ -864,7 +864,7 @@ static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry, | |||
| 864 | printk(KERN_NOTICE "jffs2_rename(): Link succeeded, unlink failed (err %d). You now have a hard link\n", ret); | 864 | printk(KERN_NOTICE "jffs2_rename(): Link succeeded, unlink failed (err %d). You now have a hard link\n", ret); |
| 865 | /* Might as well let the VFS know */ | 865 | /* Might as well let the VFS know */ |
| 866 | d_instantiate(new_dentry, old_dentry->d_inode); | 866 | d_instantiate(new_dentry, old_dentry->d_inode); |
| 867 | atomic_inc(&old_dentry->d_inode->i_count); | 867 | ihold(old_dentry->d_inode); |
| 868 | new_dir_i->i_mtime = new_dir_i->i_ctime = ITIME(now); | 868 | new_dir_i->i_mtime = new_dir_i->i_ctime = ITIME(now); |
| 869 | return ret; | 869 | return ret; |
| 870 | } | 870 | } |
diff --git a/fs/jfs/jfs_txnmgr.c b/fs/jfs/jfs_txnmgr.c index d945ea76b445..9466957ec841 100644 --- a/fs/jfs/jfs_txnmgr.c +++ b/fs/jfs/jfs_txnmgr.c | |||
| @@ -1279,7 +1279,7 @@ int txCommit(tid_t tid, /* transaction identifier */ | |||
| 1279 | * lazy commit thread finishes processing | 1279 | * lazy commit thread finishes processing |
| 1280 | */ | 1280 | */ |
| 1281 | if (tblk->xflag & COMMIT_DELETE) { | 1281 | if (tblk->xflag & COMMIT_DELETE) { |
| 1282 | atomic_inc(&tblk->u.ip->i_count); | 1282 | ihold(tblk->u.ip); |
| 1283 | /* | 1283 | /* |
| 1284 | * Avoid a rare deadlock | 1284 | * Avoid a rare deadlock |
| 1285 | * | 1285 | * |
diff --git a/fs/jfs/namei.c b/fs/jfs/namei.c index a9cf8e8675be..231ca4af9bce 100644 --- a/fs/jfs/namei.c +++ b/fs/jfs/namei.c | |||
| @@ -839,7 +839,7 @@ static int jfs_link(struct dentry *old_dentry, | |||
| 839 | ip->i_ctime = CURRENT_TIME; | 839 | ip->i_ctime = CURRENT_TIME; |
| 840 | dir->i_ctime = dir->i_mtime = CURRENT_TIME; | 840 | dir->i_ctime = dir->i_mtime = CURRENT_TIME; |
| 841 | mark_inode_dirty(dir); | 841 | mark_inode_dirty(dir); |
| 842 | atomic_inc(&ip->i_count); | 842 | ihold(ip); |
| 843 | 843 | ||
| 844 | iplist[0] = ip; | 844 | iplist[0] = ip; |
| 845 | iplist[1] = dir; | 845 | iplist[1] = dir; |
diff --git a/fs/libfs.c b/fs/libfs.c index 2dbf4877d7ef..304a5132ca27 100644 --- a/fs/libfs.c +++ b/fs/libfs.c | |||
| @@ -255,7 +255,7 @@ int simple_link(struct dentry *old_dentry, struct inode *dir, struct dentry *den | |||
| 255 | 255 | ||
| 256 | inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME; | 256 | inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME; |
| 257 | inc_nlink(inode); | 257 | inc_nlink(inode); |
| 258 | atomic_inc(&inode->i_count); | 258 | ihold(inode); |
| 259 | dget(dentry); | 259 | dget(dentry); |
| 260 | d_instantiate(dentry, inode); | 260 | d_instantiate(dentry, inode); |
| 261 | return 0; | 261 | return 0; |
diff --git a/fs/logfs/dir.c b/fs/logfs/dir.c index 1eb4e89e045b..409dfd65e9a1 100644 --- a/fs/logfs/dir.c +++ b/fs/logfs/dir.c | |||
| @@ -569,7 +569,7 @@ static int logfs_link(struct dentry *old_dentry, struct inode *dir, | |||
| 569 | return -EMLINK; | 569 | return -EMLINK; |
| 570 | 570 | ||
| 571 | inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME; | 571 | inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME; |
| 572 | atomic_inc(&inode->i_count); | 572 | ihold(inode); |
| 573 | inode->i_nlink++; | 573 | inode->i_nlink++; |
| 574 | mark_inode_dirty_sync(inode); | 574 | mark_inode_dirty_sync(inode); |
| 575 | 575 | ||
diff --git a/fs/minix/namei.c b/fs/minix/namei.c index f3f3578393a4..c0d35a3accef 100644 --- a/fs/minix/namei.c +++ b/fs/minix/namei.c | |||
| @@ -101,7 +101,7 @@ static int minix_link(struct dentry * old_dentry, struct inode * dir, | |||
| 101 | 101 | ||
| 102 | inode->i_ctime = CURRENT_TIME_SEC; | 102 | inode->i_ctime = CURRENT_TIME_SEC; |
| 103 | inode_inc_link_count(inode); | 103 | inode_inc_link_count(inode); |
| 104 | atomic_inc(&inode->i_count); | 104 | ihold(inode); |
| 105 | return add_nondir(dentry, inode); | 105 | return add_nondir(dentry, inode); |
| 106 | } | 106 | } |
| 107 | 107 | ||
diff --git a/fs/namei.c b/fs/namei.c index f1ef97dbc6c4..f7dbc06857ab 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
| @@ -2285,7 +2285,7 @@ static long do_unlinkat(int dfd, const char __user *pathname) | |||
| 2285 | goto slashes; | 2285 | goto slashes; |
| 2286 | inode = dentry->d_inode; | 2286 | inode = dentry->d_inode; |
| 2287 | if (inode) | 2287 | if (inode) |
| 2288 | atomic_inc(&inode->i_count); | 2288 | ihold(inode); |
| 2289 | error = mnt_want_write(nd.path.mnt); | 2289 | error = mnt_want_write(nd.path.mnt); |
| 2290 | if (error) | 2290 | if (error) |
| 2291 | goto exit2; | 2291 | goto exit2; |
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index e257172d438c..0fac7fea18ef 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c | |||
| @@ -1580,7 +1580,7 @@ nfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry) | |||
| 1580 | d_drop(dentry); | 1580 | d_drop(dentry); |
| 1581 | error = NFS_PROTO(dir)->link(inode, dir, &dentry->d_name); | 1581 | error = NFS_PROTO(dir)->link(inode, dir, &dentry->d_name); |
| 1582 | if (error == 0) { | 1582 | if (error == 0) { |
| 1583 | atomic_inc(&inode->i_count); | 1583 | ihold(inode); |
| 1584 | d_add(dentry, inode); | 1584 | d_add(dentry, inode); |
| 1585 | } | 1585 | } |
| 1586 | return error; | 1586 | return error; |
diff --git a/fs/nfs/getroot.c b/fs/nfs/getroot.c index a70e446e1605..ac7b814ce162 100644 --- a/fs/nfs/getroot.c +++ b/fs/nfs/getroot.c | |||
| @@ -54,8 +54,7 @@ static int nfs_superblock_set_dummy_root(struct super_block *sb, struct inode *i | |||
| 54 | iput(inode); | 54 | iput(inode); |
| 55 | return -ENOMEM; | 55 | return -ENOMEM; |
| 56 | } | 56 | } |
| 57 | /* Circumvent igrab(): we know the inode is not being freed */ | 57 | ihold(inode); |
| 58 | atomic_inc(&inode->i_count); | ||
| 59 | /* | 58 | /* |
| 60 | * Ensure that this dentry is invisible to d_find_alias(). | 59 | * Ensure that this dentry is invisible to d_find_alias(). |
| 61 | * Otherwise, it may be spliced into the tree by | 60 | * Otherwise, it may be spliced into the tree by |
diff --git a/fs/nilfs2/namei.c b/fs/nilfs2/namei.c index 185d1607cb00..6e9557ecf161 100644 --- a/fs/nilfs2/namei.c +++ b/fs/nilfs2/namei.c | |||
| @@ -207,7 +207,7 @@ static int nilfs_link(struct dentry *old_dentry, struct inode *dir, | |||
| 207 | 207 | ||
| 208 | inode->i_ctime = CURRENT_TIME; | 208 | inode->i_ctime = CURRENT_TIME; |
| 209 | inode_inc_link_count(inode); | 209 | inode_inc_link_count(inode); |
| 210 | atomic_inc(&inode->i_count); | 210 | ihold(inode); |
| 211 | 211 | ||
| 212 | err = nilfs_add_nondir(dentry, inode); | 212 | err = nilfs_add_nondir(dentry, inode); |
| 213 | if (!err) | 213 | if (!err) |
diff --git a/fs/ntfs/super.c b/fs/ntfs/super.c index d4dec2d32117..d3fbe5730bfc 100644 --- a/fs/ntfs/super.c +++ b/fs/ntfs/super.c | |||
| @@ -2911,8 +2911,8 @@ static int ntfs_fill_super(struct super_block *sb, void *opt, const int silent) | |||
| 2911 | goto unl_upcase_iput_tmp_ino_err_out_now; | 2911 | goto unl_upcase_iput_tmp_ino_err_out_now; |
| 2912 | } | 2912 | } |
| 2913 | if ((sb->s_root = d_alloc_root(vol->root_ino))) { | 2913 | if ((sb->s_root = d_alloc_root(vol->root_ino))) { |
| 2914 | /* We increment i_count simulating an ntfs_iget(). */ | 2914 | /* We grab a reference, simulating an ntfs_iget(). */ |
| 2915 | atomic_inc(&vol->root_ino->i_count); | 2915 | ihold(vol->root_ino); |
| 2916 | ntfs_debug("Exiting, status successful."); | 2916 | ntfs_debug("Exiting, status successful."); |
| 2917 | /* Release the default upcase if it has no users. */ | 2917 | /* Release the default upcase if it has no users. */ |
| 2918 | mutex_lock(&ntfs_lock); | 2918 | mutex_lock(&ntfs_lock); |
diff --git a/fs/ocfs2/namei.c b/fs/ocfs2/namei.c index e7bde21149ae..ff5744e1e36f 100644 --- a/fs/ocfs2/namei.c +++ b/fs/ocfs2/namei.c | |||
| @@ -742,7 +742,7 @@ static int ocfs2_link(struct dentry *old_dentry, | |||
| 742 | goto out_commit; | 742 | goto out_commit; |
| 743 | } | 743 | } |
| 744 | 744 | ||
| 745 | atomic_inc(&inode->i_count); | 745 | ihold(inode); |
| 746 | dentry->d_op = &ocfs2_dentry_ops; | 746 | dentry->d_op = &ocfs2_dentry_ops; |
| 747 | d_instantiate(dentry, inode); | 747 | d_instantiate(dentry, inode); |
| 748 | 748 | ||
diff --git a/fs/reiserfs/namei.c b/fs/reiserfs/namei.c index ee78d4a0086a..ba5f51ec3458 100644 --- a/fs/reiserfs/namei.c +++ b/fs/reiserfs/namei.c | |||
| @@ -1156,7 +1156,7 @@ static int reiserfs_link(struct dentry *old_dentry, struct inode *dir, | |||
| 1156 | inode->i_ctime = CURRENT_TIME_SEC; | 1156 | inode->i_ctime = CURRENT_TIME_SEC; |
| 1157 | reiserfs_update_sd(&th, inode); | 1157 | reiserfs_update_sd(&th, inode); |
| 1158 | 1158 | ||
| 1159 | atomic_inc(&inode->i_count); | 1159 | ihold(inode); |
| 1160 | d_instantiate(dentry, inode); | 1160 | d_instantiate(dentry, inode); |
| 1161 | retval = journal_end(&th, dir->i_sb, jbegin_count); | 1161 | retval = journal_end(&th, dir->i_sb, jbegin_count); |
| 1162 | reiserfs_write_unlock(dir->i_sb); | 1162 | reiserfs_write_unlock(dir->i_sb); |
diff --git a/fs/sysv/namei.c b/fs/sysv/namei.c index 33e047b59b8d..11e7f7d11cd0 100644 --- a/fs/sysv/namei.c +++ b/fs/sysv/namei.c | |||
| @@ -126,7 +126,7 @@ static int sysv_link(struct dentry * old_dentry, struct inode * dir, | |||
| 126 | 126 | ||
| 127 | inode->i_ctime = CURRENT_TIME_SEC; | 127 | inode->i_ctime = CURRENT_TIME_SEC; |
| 128 | inode_inc_link_count(inode); | 128 | inode_inc_link_count(inode); |
| 129 | atomic_inc(&inode->i_count); | 129 | ihold(inode); |
| 130 | 130 | ||
| 131 | return add_nondir(dentry, inode); | 131 | return add_nondir(dentry, inode); |
| 132 | } | 132 | } |
diff --git a/fs/ubifs/dir.c b/fs/ubifs/dir.c index 87ebcce72213..14f64b689d7f 100644 --- a/fs/ubifs/dir.c +++ b/fs/ubifs/dir.c | |||
| @@ -550,7 +550,7 @@ static int ubifs_link(struct dentry *old_dentry, struct inode *dir, | |||
| 550 | 550 | ||
| 551 | lock_2_inodes(dir, inode); | 551 | lock_2_inodes(dir, inode); |
| 552 | inc_nlink(inode); | 552 | inc_nlink(inode); |
| 553 | atomic_inc(&inode->i_count); | 553 | ihold(inode); |
| 554 | inode->i_ctime = ubifs_current_time(inode); | 554 | inode->i_ctime = ubifs_current_time(inode); |
| 555 | dir->i_size += sz_change; | 555 | dir->i_size += sz_change; |
| 556 | dir_ui->ui_size = dir->i_size; | 556 | dir_ui->ui_size = dir->i_size; |
diff --git a/fs/udf/namei.c b/fs/udf/namei.c index bf5fc674193c..6d8dc02baebb 100644 --- a/fs/udf/namei.c +++ b/fs/udf/namei.c | |||
| @@ -1101,7 +1101,7 @@ static int udf_link(struct dentry *old_dentry, struct inode *dir, | |||
| 1101 | inc_nlink(inode); | 1101 | inc_nlink(inode); |
| 1102 | inode->i_ctime = current_fs_time(inode->i_sb); | 1102 | inode->i_ctime = current_fs_time(inode->i_sb); |
| 1103 | mark_inode_dirty(inode); | 1103 | mark_inode_dirty(inode); |
| 1104 | atomic_inc(&inode->i_count); | 1104 | ihold(inode); |
| 1105 | d_instantiate(dentry, inode); | 1105 | d_instantiate(dentry, inode); |
| 1106 | unlock_kernel(); | 1106 | unlock_kernel(); |
| 1107 | 1107 | ||
diff --git a/fs/ufs/namei.c b/fs/ufs/namei.c index b056f02b1fb3..12f39b9e4437 100644 --- a/fs/ufs/namei.c +++ b/fs/ufs/namei.c | |||
| @@ -180,7 +180,7 @@ static int ufs_link (struct dentry * old_dentry, struct inode * dir, | |||
| 180 | 180 | ||
| 181 | inode->i_ctime = CURRENT_TIME_SEC; | 181 | inode->i_ctime = CURRENT_TIME_SEC; |
| 182 | inode_inc_link_count(inode); | 182 | inode_inc_link_count(inode); |
| 183 | atomic_inc(&inode->i_count); | 183 | ihold(inode); |
| 184 | 184 | ||
| 185 | error = ufs_add_nondir(dentry, inode); | 185 | error = ufs_add_nondir(dentry, inode); |
| 186 | unlock_kernel(); | 186 | unlock_kernel(); |
diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c index 71d83c93621c..96107efc0c61 100644 --- a/fs/xfs/linux-2.6/xfs_iops.c +++ b/fs/xfs/linux-2.6/xfs_iops.c | |||
| @@ -317,7 +317,7 @@ xfs_vn_link( | |||
| 317 | if (unlikely(error)) | 317 | if (unlikely(error)) |
| 318 | return -error; | 318 | return -error; |
| 319 | 319 | ||
| 320 | atomic_inc(&inode->i_count); | 320 | ihold(inode); |
| 321 | d_instantiate(dentry, inode); | 321 | d_instantiate(dentry, inode); |
| 322 | return 0; | 322 | return 0; |
| 323 | } | 323 | } |
diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index fac52290de90..fb2ca2e4cdc9 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h | |||
| @@ -500,7 +500,7 @@ void xfs_mark_inode_dirty_sync(xfs_inode_t *); | |||
| 500 | #define IHOLD(ip) \ | 500 | #define IHOLD(ip) \ |
| 501 | do { \ | 501 | do { \ |
| 502 | ASSERT(atomic_read(&VFS_I(ip)->i_count) > 0) ; \ | 502 | ASSERT(atomic_read(&VFS_I(ip)->i_count) > 0) ; \ |
| 503 | atomic_inc(&(VFS_I(ip)->i_count)); \ | 503 | ihold(VFS_I(ip)); \ |
| 504 | trace_xfs_ihold(ip, _THIS_IP_); \ | 504 | trace_xfs_ihold(ip, _THIS_IP_); \ |
| 505 | } while (0) | 505 | } while (0) |
| 506 | 506 | ||
diff --git a/include/linux/fs.h b/include/linux/fs.h index d43e8b6685a2..bd6ae6c71fc8 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -2171,6 +2171,7 @@ extern loff_t vfs_llseek(struct file *file, loff_t offset, int origin); | |||
| 2171 | 2171 | ||
| 2172 | extern int inode_init_always(struct super_block *, struct inode *); | 2172 | extern int inode_init_always(struct super_block *, struct inode *); |
| 2173 | extern void inode_init_once(struct inode *); | 2173 | extern void inode_init_once(struct inode *); |
| 2174 | extern void ihold(struct inode * inode); | ||
| 2174 | extern void iput(struct inode *); | 2175 | extern void iput(struct inode *); |
| 2175 | extern struct inode * igrab(struct inode *); | 2176 | extern struct inode * igrab(struct inode *); |
| 2176 | extern ino_t iunique(struct super_block *, ino_t); | 2177 | extern ino_t iunique(struct super_block *, ino_t); |
diff --git a/ipc/mqueue.c b/ipc/mqueue.c index e1e7b9635f5d..80b35ffca25d 100644 --- a/ipc/mqueue.c +++ b/ipc/mqueue.c | |||
| @@ -769,7 +769,7 @@ SYSCALL_DEFINE1(mq_unlink, const char __user *, u_name) | |||
| 769 | 769 | ||
| 770 | inode = dentry->d_inode; | 770 | inode = dentry->d_inode; |
| 771 | if (inode) | 771 | if (inode) |
| 772 | atomic_inc(&inode->i_count); | 772 | ihold(inode); |
| 773 | err = mnt_want_write(ipc_ns->mq_mnt); | 773 | err = mnt_want_write(ipc_ns->mq_mnt); |
| 774 | if (err) | 774 | if (err) |
| 775 | goto out_err; | 775 | goto out_err; |
diff --git a/kernel/futex.c b/kernel/futex.c index a118bf160e0b..6c683b37f2ce 100644 --- a/kernel/futex.c +++ b/kernel/futex.c | |||
| @@ -169,7 +169,7 @@ static void get_futex_key_refs(union futex_key *key) | |||
| 169 | 169 | ||
| 170 | switch (key->both.offset & (FUT_OFF_INODE|FUT_OFF_MMSHARED)) { | 170 | switch (key->both.offset & (FUT_OFF_INODE|FUT_OFF_MMSHARED)) { |
| 171 | case FUT_OFF_INODE: | 171 | case FUT_OFF_INODE: |
| 172 | atomic_inc(&key->shared.inode->i_count); | 172 | ihold(key->shared.inode); |
| 173 | break; | 173 | break; |
| 174 | case FUT_OFF_MMSHARED: | 174 | case FUT_OFF_MMSHARED: |
| 175 | atomic_inc(&key->private.mm->mm_count); | 175 | atomic_inc(&key->private.mm->mm_count); |
diff --git a/mm/shmem.c b/mm/shmem.c index 27a58120dbd5..d4e2852526e6 100644 --- a/mm/shmem.c +++ b/mm/shmem.c | |||
| @@ -1903,7 +1903,7 @@ static int shmem_link(struct dentry *old_dentry, struct inode *dir, struct dentr | |||
| 1903 | dir->i_size += BOGO_DIRENT_SIZE; | 1903 | dir->i_size += BOGO_DIRENT_SIZE; |
| 1904 | inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME; | 1904 | inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME; |
| 1905 | inc_nlink(inode); | 1905 | inc_nlink(inode); |
| 1906 | atomic_inc(&inode->i_count); /* New dentry reference */ | 1906 | ihold(inode); /* New dentry reference */ |
| 1907 | dget(dentry); /* Extra pinning count for the created dentry */ | 1907 | dget(dentry); /* Extra pinning count for the created dentry */ |
| 1908 | d_instantiate(dentry, inode); | 1908 | d_instantiate(dentry, inode); |
| 1909 | out: | 1909 | out: |
diff --git a/net/socket.c b/net/socket.c index abf3e2561521..d223725f99e5 100644 --- a/net/socket.c +++ b/net/socket.c | |||
| @@ -377,7 +377,7 @@ static int sock_alloc_file(struct socket *sock, struct file **f, int flags) | |||
| 377 | &socket_file_ops); | 377 | &socket_file_ops); |
| 378 | if (unlikely(!file)) { | 378 | if (unlikely(!file)) { |
| 379 | /* drop dentry, keep inode */ | 379 | /* drop dentry, keep inode */ |
| 380 | atomic_inc(&path.dentry->d_inode->i_count); | 380 | ihold(path.dentry->d_inode); |
| 381 | path_put(&path); | 381 | path_put(&path); |
| 382 | put_unused_fd(fd); | 382 | put_unused_fd(fd); |
| 383 | return -ENFILE; | 383 | return -ENFILE; |
