diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2010-10-23 11:11:40 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2010-10-25 21:26:11 -0400 |
commit | 7de9c6ee3ecffd99e1628e81a5ea5468f7581a1f (patch) | |
tree | 88787e77ba8a253d0a26aeda4bd5e58532d592e0 | |
parent | 646ec4615cd05972581c9c5342ed7a1e77df17bb (diff) |
new helper: ihold()
Clones an existing reference to inode; caller must already hold one.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
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; |