diff options
| author | Jan Blunck <jblunck@suse.de> | 2008-02-14 22:34:35 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-02-15 00:13:33 -0500 |
| commit | 1d957f9bf87da74f420424d16ece005202bbebd3 (patch) | |
| tree | 363d4770c0c74a536524c99ccd2762ce96ee9bbe | |
| parent | 4ac9137858e08a19f29feac4e1f4df7c268b0ba5 (diff) | |
Introduce path_put()
* Add path_put() functions for releasing a reference to the dentry and
vfsmount of a struct path in the right order
* Switch from path_release(nd) to path_put(&nd->path)
* Rename dput_path() to path_put_conditional()
[akpm@linux-foundation.org: fix cifs]
Signed-off-by: Jan Blunck <jblunck@suse.de>
Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
Acked-by: Christoph Hellwig <hch@lst.de>
Cc: <linux-fsdevel@vger.kernel.org>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Steven French <sfrench@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
41 files changed, 125 insertions, 118 deletions
diff --git a/arch/alpha/kernel/osf_sys.c b/arch/alpha/kernel/osf_sys.c index f2bef5e14faa..8c71daf94a59 100644 --- a/arch/alpha/kernel/osf_sys.c +++ b/arch/alpha/kernel/osf_sys.c | |||
| @@ -260,7 +260,7 @@ osf_statfs(char __user *path, struct osf_statfs __user *buffer, unsigned long bu | |||
| 260 | retval = user_path_walk(path, &nd); | 260 | retval = user_path_walk(path, &nd); |
| 261 | if (!retval) { | 261 | if (!retval) { |
| 262 | retval = do_osf_statfs(nd.path.dentry, buffer, bufsiz); | 262 | retval = do_osf_statfs(nd.path.dentry, buffer, bufsiz); |
| 263 | path_release(&nd); | 263 | path_put(&nd.path); |
| 264 | } | 264 | } |
| 265 | return retval; | 265 | return retval; |
| 266 | } | 266 | } |
diff --git a/arch/mips/kernel/sysirix.c b/arch/mips/kernel/sysirix.c index 49d6292ffa05..672fba84b2cc 100644 --- a/arch/mips/kernel/sysirix.c +++ b/arch/mips/kernel/sysirix.c | |||
| @@ -711,7 +711,7 @@ asmlinkage int irix_statfs(const char __user *path, | |||
| 711 | } | 711 | } |
| 712 | 712 | ||
| 713 | dput_and_out: | 713 | dput_and_out: |
| 714 | path_release(&nd); | 714 | path_put(&nd.path); |
| 715 | out: | 715 | out: |
| 716 | return error; | 716 | return error; |
| 717 | } | 717 | } |
| @@ -1385,7 +1385,7 @@ asmlinkage int irix_statvfs(char __user *fname, struct irix_statvfs __user *buf) | |||
| 1385 | error |= __put_user(0, &buf->f_fstr[i]); | 1385 | error |= __put_user(0, &buf->f_fstr[i]); |
| 1386 | 1386 | ||
| 1387 | dput_and_out: | 1387 | dput_and_out: |
| 1388 | path_release(&nd); | 1388 | path_put(&nd.path); |
| 1389 | out: | 1389 | out: |
| 1390 | return error; | 1390 | return error; |
| 1391 | } | 1391 | } |
| @@ -1636,7 +1636,7 @@ asmlinkage int irix_statvfs64(char __user *fname, struct irix_statvfs64 __user * | |||
| 1636 | error |= __put_user(0, &buf->f_fstr[i]); | 1636 | error |= __put_user(0, &buf->f_fstr[i]); |
| 1637 | 1637 | ||
| 1638 | dput_and_out: | 1638 | dput_and_out: |
| 1639 | path_release(&nd); | 1639 | path_put(&nd.path); |
| 1640 | out: | 1640 | out: |
| 1641 | return error; | 1641 | return error; |
| 1642 | } | 1642 | } |
diff --git a/arch/parisc/hpux/sys_hpux.c b/arch/parisc/hpux/sys_hpux.c index d7395af3e846..0c5b9dabb475 100644 --- a/arch/parisc/hpux/sys_hpux.c +++ b/arch/parisc/hpux/sys_hpux.c | |||
| @@ -222,7 +222,7 @@ asmlinkage long hpux_statfs(const char __user *path, | |||
| 222 | error = vfs_statfs_hpux(nd.path.dentry, &tmp); | 222 | error = vfs_statfs_hpux(nd.path.dentry, &tmp); |
| 223 | if (!error && copy_to_user(buf, &tmp, sizeof(tmp))) | 223 | if (!error && copy_to_user(buf, &tmp, sizeof(tmp))) |
| 224 | error = -EFAULT; | 224 | error = -EFAULT; |
| 225 | path_release(&nd); | 225 | path_put(&nd.path); |
| 226 | } | 226 | } |
| 227 | return error; | 227 | return error; |
| 228 | } | 228 | } |
diff --git a/arch/powerpc/platforms/cell/spufs/syscalls.c b/arch/powerpc/platforms/cell/spufs/syscalls.c index 430404413178..49c87769b1f8 100644 --- a/arch/powerpc/platforms/cell/spufs/syscalls.c +++ b/arch/powerpc/platforms/cell/spufs/syscalls.c | |||
| @@ -73,7 +73,7 @@ static long do_spu_create(const char __user *pathname, unsigned int flags, | |||
| 73 | LOOKUP_OPEN|LOOKUP_CREATE, &nd); | 73 | LOOKUP_OPEN|LOOKUP_CREATE, &nd); |
| 74 | if (!ret) { | 74 | if (!ret) { |
| 75 | ret = spufs_create(&nd, flags, mode, neighbor); | 75 | ret = spufs_create(&nd, flags, mode, neighbor); |
| 76 | path_release(&nd); | 76 | path_put(&nd.path); |
| 77 | } | 77 | } |
| 78 | putname(tmp); | 78 | putname(tmp); |
| 79 | } | 79 | } |
diff --git a/arch/sparc64/solaris/fs.c b/arch/sparc64/solaris/fs.c index 516932e9f70b..7d035f0d3ae1 100644 --- a/arch/sparc64/solaris/fs.c +++ b/arch/sparc64/solaris/fs.c | |||
| @@ -436,7 +436,7 @@ asmlinkage int solaris_statvfs(u32 path, u32 buf) | |||
| 436 | if (!error) { | 436 | if (!error) { |
| 437 | struct inode *inode = nd.path.dentry->d_inode; | 437 | struct inode *inode = nd.path.dentry->d_inode; |
| 438 | error = report_statvfs(nd.path.mnt, inode, buf); | 438 | error = report_statvfs(nd.path.mnt, inode, buf); |
| 439 | path_release(&nd); | 439 | path_put(&nd.path); |
| 440 | } | 440 | } |
| 441 | return error; | 441 | return error; |
| 442 | } | 442 | } |
| @@ -466,7 +466,7 @@ asmlinkage int solaris_statvfs64(u32 path, u32 buf) | |||
| 466 | if (!error) { | 466 | if (!error) { |
| 467 | struct inode *inode = nd.path.dentry->d_inode; | 467 | struct inode *inode = nd.path.dentry->d_inode; |
| 468 | error = report_statvfs64(nd.path.mnt, inode, buf); | 468 | error = report_statvfs64(nd.path.mnt, inode, buf); |
| 469 | path_release(&nd); | 469 | path_put(&nd.path); |
| 470 | } | 470 | } |
| 471 | unlock_kernel(); | 471 | unlock_kernel(); |
| 472 | return error; | 472 | return error; |
diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c index b611a3c61504..e75b1437b58b 100644 --- a/drivers/md/dm-table.c +++ b/drivers/md/dm-table.c | |||
| @@ -375,7 +375,7 @@ static int lookup_device(const char *path, dev_t *dev) | |||
| 375 | *dev = inode->i_rdev; | 375 | *dev = inode->i_rdev; |
| 376 | 376 | ||
| 377 | out: | 377 | out: |
| 378 | path_release(&nd); | 378 | path_put(&nd.path); |
| 379 | return r; | 379 | return r; |
| 380 | } | 380 | } |
| 381 | 381 | ||
diff --git a/drivers/mtd/mtdsuper.c b/drivers/mtd/mtdsuper.c index e376f4517905..28cc6787a800 100644 --- a/drivers/mtd/mtdsuper.c +++ b/drivers/mtd/mtdsuper.c | |||
| @@ -203,7 +203,7 @@ int get_sb_mtd(struct file_system_type *fs_type, int flags, | |||
| 203 | goto not_an_MTD_device; | 203 | goto not_an_MTD_device; |
| 204 | 204 | ||
| 205 | mtdnr = iminor(nd.path.dentry->d_inode); | 205 | mtdnr = iminor(nd.path.dentry->d_inode); |
| 206 | path_release(&nd); | 206 | path_put(&nd.path); |
| 207 | 207 | ||
| 208 | return get_sb_mtd_nr(fs_type, flags, dev_name, data, mtdnr, fill_super, | 208 | return get_sb_mtd_nr(fs_type, flags, dev_name, data, mtdnr, fill_super, |
| 209 | mnt); | 209 | mnt); |
| @@ -214,7 +214,7 @@ not_an_MTD_device: | |||
| 214 | "MTD: Attempt to mount non-MTD device \"%s\"\n", | 214 | "MTD: Attempt to mount non-MTD device \"%s\"\n", |
| 215 | dev_name); | 215 | dev_name); |
| 216 | out: | 216 | out: |
| 217 | path_release(&nd); | 217 | path_put(&nd.path); |
| 218 | return ret; | 218 | return ret; |
| 219 | 219 | ||
| 220 | } | 220 | } |
diff --git a/fs/afs/mntpt.c b/fs/afs/mntpt.c index 4136dfb9ffb8..e13cea220669 100644 --- a/fs/afs/mntpt.c +++ b/fs/afs/mntpt.c | |||
| @@ -227,7 +227,7 @@ static void *afs_mntpt_follow_link(struct dentry *dentry, struct nameidata *nd) | |||
| 227 | 227 | ||
| 228 | newmnt = afs_mntpt_do_automount(nd->path.dentry); | 228 | newmnt = afs_mntpt_do_automount(nd->path.dentry); |
| 229 | if (IS_ERR(newmnt)) { | 229 | if (IS_ERR(newmnt)) { |
| 230 | path_release(nd); | 230 | path_put(&nd->path); |
| 231 | return (void *)newmnt; | 231 | return (void *)newmnt; |
| 232 | } | 232 | } |
| 233 | 233 | ||
diff --git a/fs/autofs4/root.c b/fs/autofs4/root.c index a119c863ff37..a54a946a50ae 100644 --- a/fs/autofs4/root.c +++ b/fs/autofs4/root.c | |||
| @@ -383,7 +383,7 @@ done: | |||
| 383 | return NULL; | 383 | return NULL; |
| 384 | 384 | ||
| 385 | out_error: | 385 | out_error: |
| 386 | path_release(nd); | 386 | path_put(&nd->path); |
| 387 | return ERR_PTR(status); | 387 | return ERR_PTR(status); |
| 388 | } | 388 | } |
| 389 | 389 | ||
diff --git a/fs/block_dev.c b/fs/block_dev.c index 5f4721fdbdb6..67fe72ce6ac7 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c | |||
| @@ -1409,7 +1409,7 @@ struct block_device *lookup_bdev(const char *path) | |||
| 1409 | if (!bdev) | 1409 | if (!bdev) |
| 1410 | goto fail; | 1410 | goto fail; |
| 1411 | out: | 1411 | out: |
| 1412 | path_release(&nd); | 1412 | path_put(&nd.path); |
| 1413 | return bdev; | 1413 | return bdev; |
| 1414 | fail: | 1414 | fail: |
| 1415 | bdev = ERR_PTR(error); | 1415 | bdev = ERR_PTR(error); |
diff --git a/fs/cifs/cifs_dfs_ref.c b/fs/cifs/cifs_dfs_ref.c index bcd53c2fe781..6ad447529961 100644 --- a/fs/cifs/cifs_dfs_ref.c +++ b/fs/cifs/cifs_dfs_ref.c | |||
| @@ -368,7 +368,7 @@ out: | |||
| 368 | cFYI(1, ("leaving %s" , __FUNCTION__)); | 368 | cFYI(1, ("leaving %s" , __FUNCTION__)); |
| 369 | return ERR_PTR(rc); | 369 | return ERR_PTR(rc); |
| 370 | out_err: | 370 | out_err: |
| 371 | path_release(nd); | 371 | path_put(&nd->path); |
| 372 | goto out; | 372 | goto out; |
| 373 | } | 373 | } |
| 374 | 374 | ||
diff --git a/fs/coda/pioctl.c b/fs/coda/pioctl.c index 3b6a1b721b46..c21a1f552a63 100644 --- a/fs/coda/pioctl.c +++ b/fs/coda/pioctl.c | |||
| @@ -80,7 +80,7 @@ static int coda_pioctl(struct inode * inode, struct file * filp, | |||
| 80 | 80 | ||
| 81 | /* return if it is not a Coda inode */ | 81 | /* return if it is not a Coda inode */ |
| 82 | if ( target_inode->i_sb != inode->i_sb ) { | 82 | if ( target_inode->i_sb != inode->i_sb ) { |
| 83 | path_release(&nd); | 83 | path_put(&nd.path); |
| 84 | return -EINVAL; | 84 | return -EINVAL; |
| 85 | } | 85 | } |
| 86 | 86 | ||
| @@ -89,7 +89,7 @@ static int coda_pioctl(struct inode * inode, struct file * filp, | |||
| 89 | 89 | ||
| 90 | error = venus_pioctl(inode->i_sb, &(cnp->c_fid), cmd, &data); | 90 | error = venus_pioctl(inode->i_sb, &(cnp->c_fid), cmd, &data); |
| 91 | 91 | ||
| 92 | path_release(&nd); | 92 | path_put(&nd.path); |
| 93 | return error; | 93 | return error; |
| 94 | } | 94 | } |
| 95 | 95 | ||
diff --git a/fs/compat.c b/fs/compat.c index a8d62375ada1..43ca0165740c 100644 --- a/fs/compat.c +++ b/fs/compat.c | |||
| @@ -244,7 +244,7 @@ asmlinkage long compat_sys_statfs(const char __user *path, struct compat_statfs | |||
| 244 | error = vfs_statfs(nd.path.dentry, &tmp); | 244 | error = vfs_statfs(nd.path.dentry, &tmp); |
| 245 | if (!error) | 245 | if (!error) |
| 246 | error = put_compat_statfs(buf, &tmp); | 246 | error = put_compat_statfs(buf, &tmp); |
| 247 | path_release(&nd); | 247 | path_put(&nd.path); |
| 248 | } | 248 | } |
| 249 | return error; | 249 | return error; |
| 250 | } | 250 | } |
| @@ -312,7 +312,7 @@ asmlinkage long compat_sys_statfs64(const char __user *path, compat_size_t sz, s | |||
| 312 | error = vfs_statfs(nd.path.dentry, &tmp); | 312 | error = vfs_statfs(nd.path.dentry, &tmp); |
| 313 | if (!error) | 313 | if (!error) |
| 314 | error = put_compat_statfs64(buf, &tmp); | 314 | error = put_compat_statfs64(buf, &tmp); |
| 315 | path_release(&nd); | 315 | path_put(&nd.path); |
| 316 | } | 316 | } |
| 317 | return error; | 317 | return error; |
| 318 | } | 318 | } |
diff --git a/fs/configfs/symlink.c b/fs/configfs/symlink.c index cda3ea001ae6..78929ea84ff2 100644 --- a/fs/configfs/symlink.c +++ b/fs/configfs/symlink.c | |||
| @@ -103,7 +103,7 @@ static int get_target(const char *symname, struct nameidata *nd, | |||
| 103 | *target = configfs_get_config_item(nd->path.dentry); | 103 | *target = configfs_get_config_item(nd->path.dentry); |
| 104 | if (!*target) { | 104 | if (!*target) { |
| 105 | ret = -ENOENT; | 105 | ret = -ENOENT; |
| 106 | path_release(nd); | 106 | path_put(&nd->path); |
| 107 | } | 107 | } |
| 108 | } else | 108 | } else |
| 109 | ret = -EPERM; | 109 | ret = -EPERM; |
| @@ -141,7 +141,7 @@ int configfs_symlink(struct inode *dir, struct dentry *dentry, const char *symna | |||
| 141 | ret = create_link(parent_item, target_item, dentry); | 141 | ret = create_link(parent_item, target_item, dentry); |
| 142 | 142 | ||
| 143 | config_item_put(target_item); | 143 | config_item_put(target_item); |
| 144 | path_release(&nd); | 144 | path_put(&nd.path); |
| 145 | 145 | ||
| 146 | out_put: | 146 | out_put: |
| 147 | config_item_put(parent_item); | 147 | config_item_put(parent_item); |
diff --git a/fs/dquot.c b/fs/dquot.c index 289f48d2c727..9c7feb62eed1 100644 --- a/fs/dquot.c +++ b/fs/dquot.c | |||
| @@ -1643,7 +1643,7 @@ int vfs_quota_on(struct super_block *sb, int type, int format_id, char *path) | |||
| 1643 | error = vfs_quota_on_inode(nd.path.dentry->d_inode, type, | 1643 | error = vfs_quota_on_inode(nd.path.dentry->d_inode, type, |
| 1644 | format_id); | 1644 | format_id); |
| 1645 | out_path: | 1645 | out_path: |
| 1646 | path_release(&nd); | 1646 | path_put(&nd.path); |
| 1647 | return error; | 1647 | return error; |
| 1648 | } | 1648 | } |
| 1649 | 1649 | ||
diff --git a/fs/ecryptfs/main.c b/fs/ecryptfs/main.c index a70555a6472c..d25ac9500a92 100644 --- a/fs/ecryptfs/main.c +++ b/fs/ecryptfs/main.c | |||
| @@ -526,7 +526,7 @@ static int ecryptfs_read_super(struct super_block *sb, const char *dev_name) | |||
| 526 | rc = 0; | 526 | rc = 0; |
| 527 | goto out; | 527 | goto out; |
| 528 | out_free: | 528 | out_free: |
| 529 | path_release(&nd); | 529 | path_put(&nd.path); |
| 530 | out: | 530 | out: |
| 531 | return rc; | 531 | return rc; |
| 532 | } | 532 | } |
| @@ -148,7 +148,7 @@ out: | |||
| 148 | return error; | 148 | return error; |
| 149 | exit: | 149 | exit: |
| 150 | release_open_intent(&nd); | 150 | release_open_intent(&nd); |
| 151 | path_release(&nd); | 151 | path_put(&nd.path); |
| 152 | goto out; | 152 | goto out; |
| 153 | } | 153 | } |
| 154 | 154 | ||
| @@ -672,7 +672,7 @@ out: | |||
| 672 | } | 672 | } |
| 673 | } | 673 | } |
| 674 | release_open_intent(&nd); | 674 | release_open_intent(&nd); |
| 675 | path_release(&nd); | 675 | path_put(&nd.path); |
| 676 | } | 676 | } |
| 677 | goto out; | 677 | goto out; |
| 678 | } | 678 | } |
diff --git a/fs/ext3/super.c b/fs/ext3/super.c index 0b5057e0dc1e..18769cc32377 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c | |||
| @@ -2759,7 +2759,7 @@ static int ext3_quota_on(struct super_block *sb, int type, int format_id, | |||
| 2759 | return err; | 2759 | return err; |
| 2760 | /* Quotafile not on the same filesystem? */ | 2760 | /* Quotafile not on the same filesystem? */ |
| 2761 | if (nd.path.mnt->mnt_sb != sb) { | 2761 | if (nd.path.mnt->mnt_sb != sb) { |
| 2762 | path_release(&nd); | 2762 | path_put(&nd.path); |
| 2763 | return -EXDEV; | 2763 | return -EXDEV; |
| 2764 | } | 2764 | } |
| 2765 | /* Quotafile not of fs root? */ | 2765 | /* Quotafile not of fs root? */ |
| @@ -2767,7 +2767,7 @@ static int ext3_quota_on(struct super_block *sb, int type, int format_id, | |||
| 2767 | printk(KERN_WARNING | 2767 | printk(KERN_WARNING |
| 2768 | "EXT3-fs: Quota file not on filesystem root. " | 2768 | "EXT3-fs: Quota file not on filesystem root. " |
| 2769 | "Journalled quota will not work.\n"); | 2769 | "Journalled quota will not work.\n"); |
| 2770 | path_release(&nd); | 2770 | path_put(&nd.path); |
| 2771 | return vfs_quota_on(sb, type, format_id, path); | 2771 | return vfs_quota_on(sb, type, format_id, path); |
| 2772 | } | 2772 | } |
| 2773 | 2773 | ||
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 37117990073d..13383ba18f1d 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
| @@ -3159,7 +3159,7 @@ static int ext4_quota_on(struct super_block *sb, int type, int format_id, | |||
| 3159 | return err; | 3159 | return err; |
| 3160 | /* Quotafile not on the same filesystem? */ | 3160 | /* Quotafile not on the same filesystem? */ |
| 3161 | if (nd.path.mnt->mnt_sb != sb) { | 3161 | if (nd.path.mnt->mnt_sb != sb) { |
| 3162 | path_release(&nd); | 3162 | path_put(&nd.path); |
| 3163 | return -EXDEV; | 3163 | return -EXDEV; |
| 3164 | } | 3164 | } |
| 3165 | /* Quotafile not of fs root? */ | 3165 | /* Quotafile not of fs root? */ |
| @@ -3167,7 +3167,7 @@ static int ext4_quota_on(struct super_block *sb, int type, int format_id, | |||
| 3167 | printk(KERN_WARNING | 3167 | printk(KERN_WARNING |
| 3168 | "EXT4-fs: Quota file not on filesystem root. " | 3168 | "EXT4-fs: Quota file not on filesystem root. " |
| 3169 | "Journalled quota will not work.\n"); | 3169 | "Journalled quota will not work.\n"); |
| 3170 | path_release(&nd); | 3170 | path_put(&nd.path); |
| 3171 | return vfs_quota_on(sb, type, format_id, path); | 3171 | return vfs_quota_on(sb, type, format_id, path); |
| 3172 | } | 3172 | } |
| 3173 | 3173 | ||
diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c index f4ced7fcda82..4bee6aa845e4 100644 --- a/fs/gfs2/ops_fstype.c +++ b/fs/gfs2/ops_fstype.c | |||
| @@ -900,7 +900,7 @@ static struct super_block* get_gfs2_sb(const char *dev_name) | |||
| 900 | "mount point %s\n", dev_name); | 900 | "mount point %s\n", dev_name); |
| 901 | 901 | ||
| 902 | free_nd: | 902 | free_nd: |
| 903 | path_release(&nd); | 903 | path_put(&nd.path); |
| 904 | out: | 904 | out: |
| 905 | return sb; | 905 | return sb; |
| 906 | } | 906 | } |
diff --git a/fs/inotify_user.c b/fs/inotify_user.c index e9c58652533a..7b94a1e3c015 100644 --- a/fs/inotify_user.c +++ b/fs/inotify_user.c | |||
| @@ -367,7 +367,7 @@ static int find_inode(const char __user *dirname, struct nameidata *nd, | |||
| 367 | /* you can only watch an inode if you have read permissions on it */ | 367 | /* you can only watch an inode if you have read permissions on it */ |
| 368 | error = vfs_permission(nd, MAY_READ); | 368 | error = vfs_permission(nd, MAY_READ); |
| 369 | if (error) | 369 | if (error) |
| 370 | path_release(nd); | 370 | path_put(&nd->path); |
| 371 | return error; | 371 | return error; |
| 372 | } | 372 | } |
| 373 | 373 | ||
| @@ -676,7 +676,7 @@ asmlinkage long sys_inotify_add_watch(int fd, const char __user *path, u32 mask) | |||
| 676 | ret = create_watch(dev, inode, mask); | 676 | ret = create_watch(dev, inode, mask); |
| 677 | mutex_unlock(&dev->up_mutex); | 677 | mutex_unlock(&dev->up_mutex); |
| 678 | 678 | ||
| 679 | path_release(&nd); | 679 | path_put(&nd.path); |
| 680 | fput_and_out: | 680 | fput_and_out: |
| 681 | fput_light(filp, fput_needed); | 681 | fput_light(filp, fput_needed); |
| 682 | return ret; | 682 | return ret; |
diff --git a/fs/namei.c b/fs/namei.c index c9b05a71c39c..b0df7ea733d7 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
| @@ -362,11 +362,18 @@ int deny_write_access(struct file * file) | |||
| 362 | return 0; | 362 | return 0; |
| 363 | } | 363 | } |
| 364 | 364 | ||
| 365 | void path_release(struct nameidata *nd) | 365 | /** |
| 366 | * path_put - put a reference to a path | ||
| 367 | * @path: path to put the reference to | ||
| 368 | * | ||
| 369 | * Given a path decrement the reference count to the dentry and the vfsmount. | ||
| 370 | */ | ||
| 371 | void path_put(struct path *path) | ||
| 366 | { | 372 | { |
| 367 | dput(nd->path.dentry); | 373 | dput(path->dentry); |
| 368 | mntput(nd->path.mnt); | 374 | mntput(path->mnt); |
| 369 | } | 375 | } |
| 376 | EXPORT_SYMBOL(path_put); | ||
| 370 | 377 | ||
| 371 | /** | 378 | /** |
| 372 | * release_open_intent - free up open intent resources | 379 | * release_open_intent - free up open intent resources |
| @@ -551,7 +558,7 @@ static __always_inline int __vfs_follow_link(struct nameidata *nd, const char *l | |||
| 551 | goto fail; | 558 | goto fail; |
| 552 | 559 | ||
| 553 | if (*link == '/') { | 560 | if (*link == '/') { |
| 554 | path_release(nd); | 561 | path_put(&nd->path); |
| 555 | if (!walk_init_root(link, nd)) | 562 | if (!walk_init_root(link, nd)) |
| 556 | /* weird __emul_prefix() stuff did it */ | 563 | /* weird __emul_prefix() stuff did it */ |
| 557 | goto out; | 564 | goto out; |
| @@ -567,18 +574,18 @@ out: | |||
| 567 | */ | 574 | */ |
| 568 | name = __getname(); | 575 | name = __getname(); |
| 569 | if (unlikely(!name)) { | 576 | if (unlikely(!name)) { |
| 570 | path_release(nd); | 577 | path_put(&nd->path); |
| 571 | return -ENOMEM; | 578 | return -ENOMEM; |
| 572 | } | 579 | } |
| 573 | strcpy(name, nd->last.name); | 580 | strcpy(name, nd->last.name); |
| 574 | nd->last.name = name; | 581 | nd->last.name = name; |
| 575 | return 0; | 582 | return 0; |
| 576 | fail: | 583 | fail: |
| 577 | path_release(nd); | 584 | path_put(&nd->path); |
| 578 | return PTR_ERR(link); | 585 | return PTR_ERR(link); |
| 579 | } | 586 | } |
| 580 | 587 | ||
| 581 | static inline void dput_path(struct path *path, struct nameidata *nd) | 588 | static void path_put_conditional(struct path *path, struct nameidata *nd) |
| 582 | { | 589 | { |
| 583 | dput(path->dentry); | 590 | dput(path->dentry); |
| 584 | if (path->mnt != nd->path.mnt) | 591 | if (path->mnt != nd->path.mnt) |
| @@ -651,8 +658,8 @@ static inline int do_follow_link(struct path *path, struct nameidata *nd) | |||
| 651 | nd->depth--; | 658 | nd->depth--; |
| 652 | return err; | 659 | return err; |
| 653 | loop: | 660 | loop: |
| 654 | dput_path(path, nd); | 661 | path_put_conditional(path, nd); |
| 655 | path_release(nd); | 662 | path_put(&nd->path); |
| 656 | return err; | 663 | return err; |
| 657 | } | 664 | } |
| 658 | 665 | ||
| @@ -993,10 +1000,10 @@ return_reval: | |||
| 993 | return_base: | 1000 | return_base: |
| 994 | return 0; | 1001 | return 0; |
| 995 | out_dput: | 1002 | out_dput: |
| 996 | dput_path(&next, nd); | 1003 | path_put_conditional(&next, nd); |
| 997 | break; | 1004 | break; |
| 998 | } | 1005 | } |
| 999 | path_release(nd); | 1006 | path_put(&nd->path); |
| 1000 | return_err: | 1007 | return_err: |
| 1001 | return err; | 1008 | return err; |
| 1002 | } | 1009 | } |
| @@ -1070,7 +1077,7 @@ static int __emul_lookup_dentry(const char *name, struct nameidata *nd) | |||
| 1070 | mntput(old_mnt); | 1077 | mntput(old_mnt); |
| 1071 | return 1; | 1078 | return 1; |
| 1072 | } | 1079 | } |
| 1073 | path_release(nd); | 1080 | path_put(&nd->path); |
| 1074 | } | 1081 | } |
| 1075 | nd->path.dentry = old_dentry; | 1082 | nd->path.dentry = old_dentry; |
| 1076 | nd->path.mnt = old_mnt; | 1083 | nd->path.mnt = old_mnt; |
| @@ -1230,7 +1237,7 @@ static int __path_lookup_intent_open(int dfd, const char *name, | |||
| 1230 | if (IS_ERR(nd->intent.open.file)) { | 1237 | if (IS_ERR(nd->intent.open.file)) { |
| 1231 | if (err == 0) { | 1238 | if (err == 0) { |
| 1232 | err = PTR_ERR(nd->intent.open.file); | 1239 | err = PTR_ERR(nd->intent.open.file); |
| 1233 | path_release(nd); | 1240 | path_put(&nd->path); |
| 1234 | } | 1241 | } |
| 1235 | } else if (err != 0) | 1242 | } else if (err != 0) |
| 1236 | release_open_intent(nd); | 1243 | release_open_intent(nd); |
| @@ -1806,11 +1813,11 @@ ok: | |||
| 1806 | return 0; | 1813 | return 0; |
| 1807 | 1814 | ||
| 1808 | exit_dput: | 1815 | exit_dput: |
| 1809 | dput_path(&path, nd); | 1816 | path_put_conditional(&path, nd); |
| 1810 | exit: | 1817 | exit: |
| 1811 | if (!IS_ERR(nd->intent.open.file)) | 1818 | if (!IS_ERR(nd->intent.open.file)) |
| 1812 | release_open_intent(nd); | 1819 | release_open_intent(nd); |
| 1813 | path_release(nd); | 1820 | path_put(&nd->path); |
| 1814 | return error; | 1821 | return error; |
| 1815 | 1822 | ||
| 1816 | do_link: | 1823 | do_link: |
| @@ -1979,7 +1986,7 @@ asmlinkage long sys_mknodat(int dfd, const char __user *filename, int mode, | |||
| 1979 | dput(dentry); | 1986 | dput(dentry); |
| 1980 | } | 1987 | } |
| 1981 | mutex_unlock(&nd.path.dentry->d_inode->i_mutex); | 1988 | mutex_unlock(&nd.path.dentry->d_inode->i_mutex); |
| 1982 | path_release(&nd); | 1989 | path_put(&nd.path); |
| 1983 | out: | 1990 | out: |
| 1984 | putname(tmp); | 1991 | putname(tmp); |
| 1985 | 1992 | ||
| @@ -2039,7 +2046,7 @@ asmlinkage long sys_mkdirat(int dfd, const char __user *pathname, int mode) | |||
| 2039 | dput(dentry); | 2046 | dput(dentry); |
| 2040 | out_unlock: | 2047 | out_unlock: |
| 2041 | mutex_unlock(&nd.path.dentry->d_inode->i_mutex); | 2048 | mutex_unlock(&nd.path.dentry->d_inode->i_mutex); |
| 2042 | path_release(&nd); | 2049 | path_put(&nd.path); |
| 2043 | out: | 2050 | out: |
| 2044 | putname(tmp); | 2051 | putname(tmp); |
| 2045 | out_err: | 2052 | out_err: |
| @@ -2147,7 +2154,7 @@ static long do_rmdir(int dfd, const char __user *pathname) | |||
| 2147 | exit2: | 2154 | exit2: |
| 2148 | mutex_unlock(&nd.path.dentry->d_inode->i_mutex); | 2155 | mutex_unlock(&nd.path.dentry->d_inode->i_mutex); |
| 2149 | exit1: | 2156 | exit1: |
| 2150 | path_release(&nd); | 2157 | path_put(&nd.path); |
| 2151 | exit: | 2158 | exit: |
| 2152 | putname(name); | 2159 | putname(name); |
| 2153 | return error; | 2160 | return error; |
| @@ -2231,7 +2238,7 @@ static long do_unlinkat(int dfd, const char __user *pathname) | |||
| 2231 | if (inode) | 2238 | if (inode) |
| 2232 | iput(inode); /* truncate the inode here */ | 2239 | iput(inode); /* truncate the inode here */ |
| 2233 | exit1: | 2240 | exit1: |
| 2234 | path_release(&nd); | 2241 | path_put(&nd.path); |
| 2235 | exit: | 2242 | exit: |
| 2236 | putname(name); | 2243 | putname(name); |
| 2237 | return error; | 2244 | return error; |
| @@ -2308,7 +2315,7 @@ asmlinkage long sys_symlinkat(const char __user *oldname, | |||
| 2308 | dput(dentry); | 2315 | dput(dentry); |
| 2309 | out_unlock: | 2316 | out_unlock: |
| 2310 | mutex_unlock(&nd.path.dentry->d_inode->i_mutex); | 2317 | mutex_unlock(&nd.path.dentry->d_inode->i_mutex); |
| 2311 | path_release(&nd); | 2318 | path_put(&nd.path); |
| 2312 | out: | 2319 | out: |
| 2313 | putname(to); | 2320 | putname(to); |
| 2314 | out_putname: | 2321 | out_putname: |
| @@ -2404,9 +2411,9 @@ asmlinkage long sys_linkat(int olddfd, const char __user *oldname, | |||
| 2404 | out_unlock: | 2411 | out_unlock: |
| 2405 | mutex_unlock(&nd.path.dentry->d_inode->i_mutex); | 2412 | mutex_unlock(&nd.path.dentry->d_inode->i_mutex); |
| 2406 | out_release: | 2413 | out_release: |
| 2407 | path_release(&nd); | 2414 | path_put(&nd.path); |
| 2408 | out: | 2415 | out: |
| 2409 | path_release(&old_nd); | 2416 | path_put(&old_nd.path); |
| 2410 | exit: | 2417 | exit: |
| 2411 | putname(to); | 2418 | putname(to); |
| 2412 | 2419 | ||
| @@ -2634,9 +2641,9 @@ exit4: | |||
| 2634 | exit3: | 2641 | exit3: |
| 2635 | unlock_rename(new_dir, old_dir); | 2642 | unlock_rename(new_dir, old_dir); |
| 2636 | exit2: | 2643 | exit2: |
| 2637 | path_release(&newnd); | 2644 | path_put(&newnd.path); |
| 2638 | exit1: | 2645 | exit1: |
| 2639 | path_release(&oldnd); | 2646 | path_put(&oldnd.path); |
| 2640 | exit: | 2647 | exit: |
| 2641 | return error; | 2648 | return error; |
| 2642 | } | 2649 | } |
| @@ -2810,7 +2817,6 @@ EXPORT_SYMBOL(page_symlink); | |||
| 2810 | EXPORT_SYMBOL(page_symlink_inode_operations); | 2817 | EXPORT_SYMBOL(page_symlink_inode_operations); |
| 2811 | EXPORT_SYMBOL(path_lookup); | 2818 | EXPORT_SYMBOL(path_lookup); |
| 2812 | EXPORT_SYMBOL(vfs_path_lookup); | 2819 | EXPORT_SYMBOL(vfs_path_lookup); |
| 2813 | EXPORT_SYMBOL(path_release); | ||
| 2814 | EXPORT_SYMBOL(permission); | 2820 | EXPORT_SYMBOL(permission); |
| 2815 | EXPORT_SYMBOL(vfs_permission); | 2821 | EXPORT_SYMBOL(vfs_permission); |
| 2816 | EXPORT_SYMBOL(file_permission); | 2822 | EXPORT_SYMBOL(file_permission); |
diff --git a/fs/namespace.c b/fs/namespace.c index 5d9fd4c6d1f5..c77eedd2ac66 100644 --- a/fs/namespace.c +++ b/fs/namespace.c | |||
| @@ -1007,7 +1007,7 @@ static noinline int do_loopback(struct nameidata *nd, char *old_name, | |||
| 1007 | 1007 | ||
| 1008 | out: | 1008 | out: |
| 1009 | up_write(&namespace_sem); | 1009 | up_write(&namespace_sem); |
| 1010 | path_release(&old_nd); | 1010 | path_put(&old_nd.path); |
| 1011 | return err; | 1011 | return err; |
| 1012 | } | 1012 | } |
| 1013 | 1013 | ||
| @@ -1126,8 +1126,8 @@ out1: | |||
| 1126 | out: | 1126 | out: |
| 1127 | up_write(&namespace_sem); | 1127 | up_write(&namespace_sem); |
| 1128 | if (!err) | 1128 | if (!err) |
| 1129 | path_release(&parent_nd); | 1129 | path_put(&parent_nd.path); |
| 1130 | path_release(&old_nd); | 1130 | path_put(&old_nd.path); |
| 1131 | return err; | 1131 | return err; |
| 1132 | } | 1132 | } |
| 1133 | 1133 | ||
| @@ -1512,7 +1512,7 @@ long do_mount(char *dev_name, char *dir_name, char *type_page, | |||
| 1512 | retval = do_new_mount(&nd, type_page, flags, mnt_flags, | 1512 | retval = do_new_mount(&nd, type_page, flags, mnt_flags, |
| 1513 | dev_name, data_page); | 1513 | dev_name, data_page); |
| 1514 | dput_out: | 1514 | dput_out: |
| 1515 | path_release(&nd); | 1515 | path_put(&nd.path); |
| 1516 | return retval; | 1516 | return retval; |
| 1517 | } | 1517 | } |
| 1518 | 1518 | ||
| @@ -1768,7 +1768,7 @@ asmlinkage long sys_pivot_root(const char __user * new_root, | |||
| 1768 | 1768 | ||
| 1769 | error = security_sb_pivotroot(&old_nd, &new_nd); | 1769 | error = security_sb_pivotroot(&old_nd, &new_nd); |
| 1770 | if (error) { | 1770 | if (error) { |
| 1771 | path_release(&old_nd); | 1771 | path_put(&old_nd.path); |
| 1772 | goto out1; | 1772 | goto out1; |
| 1773 | } | 1773 | } |
| 1774 | 1774 | ||
| @@ -1831,15 +1831,15 @@ asmlinkage long sys_pivot_root(const char __user * new_root, | |||
| 1831 | chroot_fs_refs(&user_nd, &new_nd); | 1831 | chroot_fs_refs(&user_nd, &new_nd); |
| 1832 | security_sb_post_pivotroot(&user_nd, &new_nd); | 1832 | security_sb_post_pivotroot(&user_nd, &new_nd); |
| 1833 | error = 0; | 1833 | error = 0; |
| 1834 | path_release(&root_parent); | 1834 | path_put(&root_parent.path); |
| 1835 | path_release(&parent_nd); | 1835 | path_put(&parent_nd.path); |
| 1836 | out2: | 1836 | out2: |
| 1837 | mutex_unlock(&old_nd.path.dentry->d_inode->i_mutex); | 1837 | mutex_unlock(&old_nd.path.dentry->d_inode->i_mutex); |
| 1838 | up_write(&namespace_sem); | 1838 | up_write(&namespace_sem); |
| 1839 | path_release(&user_nd); | 1839 | path_put(&user_nd.path); |
| 1840 | path_release(&old_nd); | 1840 | path_put(&old_nd.path); |
| 1841 | out1: | 1841 | out1: |
| 1842 | path_release(&new_nd); | 1842 | path_put(&new_nd.path); |
| 1843 | out0: | 1843 | out0: |
| 1844 | unlock_kernel(); | 1844 | unlock_kernel(); |
| 1845 | return error; | 1845 | return error; |
diff --git a/fs/nfs/namespace.c b/fs/nfs/namespace.c index 3b6d83dc98a7..607f6eb9cdb5 100644 --- a/fs/nfs/namespace.c +++ b/fs/nfs/namespace.c | |||
| @@ -148,7 +148,7 @@ out: | |||
| 148 | dprintk("<-- nfs_follow_mountpoint() = %d\n", err); | 148 | dprintk("<-- nfs_follow_mountpoint() = %d\n", err); |
| 149 | return ERR_PTR(err); | 149 | return ERR_PTR(err); |
| 150 | out_err: | 150 | out_err: |
| 151 | path_release(nd); | 151 | path_put(&nd->path); |
| 152 | goto out; | 152 | goto out; |
| 153 | out_follow: | 153 | out_follow: |
| 154 | while (d_mountpoint(nd->path.dentry) && | 154 | while (d_mountpoint(nd->path.dentry) && |
diff --git a/fs/nfsctl.c b/fs/nfsctl.c index 49ef0b4d4439..aed8145d9087 100644 --- a/fs/nfsctl.c +++ b/fs/nfsctl.c | |||
| @@ -43,7 +43,7 @@ static struct file *do_open(char *name, int flags) | |||
| 43 | if (!error) | 43 | if (!error) |
| 44 | return dentry_open(nd.path.dentry, nd.path.mnt, flags); | 44 | return dentry_open(nd.path.dentry, nd.path.mnt, flags); |
| 45 | 45 | ||
| 46 | path_release(&nd); | 46 | path_put(&nd.path); |
| 47 | return ERR_PTR(error); | 47 | return ERR_PTR(error); |
| 48 | } | 48 | } |
| 49 | 49 | ||
diff --git a/fs/nfsd/export.c b/fs/nfsd/export.c index 2ac0e30285c2..717413f07e9a 100644 --- a/fs/nfsd/export.c +++ b/fs/nfsd/export.c | |||
| @@ -177,7 +177,7 @@ static int expkey_parse(struct cache_detail *cd, char *mesg, int mlen) | |||
| 177 | cache_put(&ek->h, &svc_expkey_cache); | 177 | cache_put(&ek->h, &svc_expkey_cache); |
| 178 | else | 178 | else |
| 179 | err = -ENOMEM; | 179 | err = -ENOMEM; |
| 180 | path_release(&nd); | 180 | path_put(&nd.path); |
| 181 | } | 181 | } |
| 182 | cache_flush(); | 182 | cache_flush(); |
| 183 | out: | 183 | out: |
| @@ -630,7 +630,7 @@ static int svc_export_parse(struct cache_detail *cd, char *mesg, int mlen) | |||
| 630 | kfree(exp.ex_uuid); | 630 | kfree(exp.ex_uuid); |
| 631 | kfree(exp.ex_path); | 631 | kfree(exp.ex_path); |
| 632 | if (nd.path.dentry) | 632 | if (nd.path.dentry) |
| 633 | path_release(&nd); | 633 | path_put(&nd.path); |
| 634 | out_no_path: | 634 | out_no_path: |
| 635 | if (dom) | 635 | if (dom) |
| 636 | auth_domain_put(dom); | 636 | auth_domain_put(dom); |
| @@ -1098,7 +1098,7 @@ finish: | |||
| 1098 | cache_put(&fsid_key->h, &svc_expkey_cache); | 1098 | cache_put(&fsid_key->h, &svc_expkey_cache); |
| 1099 | if (clp) | 1099 | if (clp) |
| 1100 | auth_domain_put(clp); | 1100 | auth_domain_put(clp); |
| 1101 | path_release(&nd); | 1101 | path_put(&nd.path); |
| 1102 | out_unlock: | 1102 | out_unlock: |
| 1103 | exp_writeunlock(); | 1103 | exp_writeunlock(); |
| 1104 | out: | 1104 | out: |
| @@ -1150,7 +1150,7 @@ exp_unexport(struct nfsctl_export *nxp) | |||
| 1150 | 1150 | ||
| 1151 | err = -EINVAL; | 1151 | err = -EINVAL; |
| 1152 | exp = exp_get_by_name(dom, nd.path.mnt, nd.path.dentry, NULL); | 1152 | exp = exp_get_by_name(dom, nd.path.mnt, nd.path.dentry, NULL); |
| 1153 | path_release(&nd); | 1153 | path_put(&nd.path); |
| 1154 | if (IS_ERR(exp)) | 1154 | if (IS_ERR(exp)) |
| 1155 | goto out_domain; | 1155 | goto out_domain; |
| 1156 | 1156 | ||
| @@ -1209,7 +1209,7 @@ exp_rootfh(svc_client *clp, char *path, struct knfsd_fh *f, int maxsize) | |||
| 1209 | fh_put(&fh); | 1209 | fh_put(&fh); |
| 1210 | exp_put(exp); | 1210 | exp_put(exp); |
| 1211 | out: | 1211 | out: |
| 1212 | path_release(&nd); | 1212 | path_put(&nd.path); |
| 1213 | return err; | 1213 | return err; |
| 1214 | } | 1214 | } |
| 1215 | 1215 | ||
diff --git a/fs/nfsd/nfs4recover.c b/fs/nfsd/nfs4recover.c index a7a8fdf86ea7..1ff90625860f 100644 --- a/fs/nfsd/nfs4recover.c +++ b/fs/nfsd/nfs4recover.c | |||
| @@ -415,5 +415,5 @@ nfsd4_shutdown_recdir(void) | |||
| 415 | if (!rec_dir_init) | 415 | if (!rec_dir_init) |
| 416 | return; | 416 | return; |
| 417 | rec_dir_init = 0; | 417 | rec_dir_init = 0; |
| 418 | path_release(&rec_dir); | 418 | path_put(&rec_dir.path); |
| 419 | } | 419 | } |
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index be2b9ecd230a..bcb97d8e8b8b 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c | |||
| @@ -3265,7 +3265,7 @@ nfs4_reset_recoverydir(char *recdir) | |||
| 3265 | nfs4_set_recdir(recdir); | 3265 | nfs4_set_recdir(recdir); |
| 3266 | status = 0; | 3266 | status = 0; |
| 3267 | } | 3267 | } |
| 3268 | path_release(&nd); | 3268 | path_put(&nd.path); |
| 3269 | return status; | 3269 | return status; |
| 3270 | } | 3270 | } |
| 3271 | 3271 | ||
| @@ -130,7 +130,7 @@ asmlinkage long sys_statfs(const char __user * path, struct statfs __user * buf) | |||
| 130 | error = vfs_statfs_native(nd.path.dentry, &tmp); | 130 | error = vfs_statfs_native(nd.path.dentry, &tmp); |
| 131 | if (!error && copy_to_user(buf, &tmp, sizeof(tmp))) | 131 | if (!error && copy_to_user(buf, &tmp, sizeof(tmp))) |
| 132 | error = -EFAULT; | 132 | error = -EFAULT; |
| 133 | path_release(&nd); | 133 | path_put(&nd.path); |
| 134 | } | 134 | } |
| 135 | return error; | 135 | return error; |
| 136 | } | 136 | } |
| @@ -149,7 +149,7 @@ asmlinkage long sys_statfs64(const char __user *path, size_t sz, struct statfs64 | |||
| 149 | error = vfs_statfs64(nd.path.dentry, &tmp); | 149 | error = vfs_statfs64(nd.path.dentry, &tmp); |
| 150 | if (!error && copy_to_user(buf, &tmp, sizeof(tmp))) | 150 | if (!error && copy_to_user(buf, &tmp, sizeof(tmp))) |
| 151 | error = -EFAULT; | 151 | error = -EFAULT; |
| 152 | path_release(&nd); | 152 | path_put(&nd.path); |
| 153 | } | 153 | } |
| 154 | return error; | 154 | return error; |
| 155 | } | 155 | } |
| @@ -277,7 +277,7 @@ static long do_sys_truncate(const char __user * path, loff_t length) | |||
| 277 | put_write_and_out: | 277 | put_write_and_out: |
| 278 | put_write_access(inode); | 278 | put_write_access(inode); |
| 279 | dput_and_out: | 279 | dput_and_out: |
| 280 | path_release(&nd); | 280 | path_put(&nd.path); |
| 281 | out: | 281 | out: |
| 282 | return error; | 282 | return error; |
| 283 | } | 283 | } |
| @@ -462,7 +462,7 @@ asmlinkage long sys_faccessat(int dfd, const char __user *filename, int mode) | |||
| 462 | res = -EROFS; | 462 | res = -EROFS; |
| 463 | 463 | ||
| 464 | out_path_release: | 464 | out_path_release: |
| 465 | path_release(&nd); | 465 | path_put(&nd.path); |
| 466 | out: | 466 | out: |
| 467 | current->fsuid = old_fsuid; | 467 | current->fsuid = old_fsuid; |
| 468 | current->fsgid = old_fsgid; | 468 | current->fsgid = old_fsgid; |
| @@ -493,7 +493,7 @@ asmlinkage long sys_chdir(const char __user * filename) | |||
| 493 | set_fs_pwd(current->fs, nd.path.mnt, nd.path.dentry); | 493 | set_fs_pwd(current->fs, nd.path.mnt, nd.path.dentry); |
| 494 | 494 | ||
| 495 | dput_and_out: | 495 | dput_and_out: |
| 496 | path_release(&nd); | 496 | path_put(&nd.path); |
| 497 | out: | 497 | out: |
| 498 | return error; | 498 | return error; |
| 499 | } | 499 | } |
| @@ -549,7 +549,7 @@ asmlinkage long sys_chroot(const char __user * filename) | |||
| 549 | set_fs_altroot(); | 549 | set_fs_altroot(); |
| 550 | error = 0; | 550 | error = 0; |
| 551 | dput_and_out: | 551 | dput_and_out: |
| 552 | path_release(&nd); | 552 | path_put(&nd.path); |
| 553 | out: | 553 | out: |
| 554 | return error; | 554 | return error; |
| 555 | } | 555 | } |
| @@ -621,7 +621,7 @@ asmlinkage long sys_fchmodat(int dfd, const char __user *filename, | |||
| 621 | mutex_unlock(&inode->i_mutex); | 621 | mutex_unlock(&inode->i_mutex); |
| 622 | 622 | ||
| 623 | dput_and_out: | 623 | dput_and_out: |
| 624 | path_release(&nd); | 624 | path_put(&nd.path); |
| 625 | out: | 625 | out: |
| 626 | return error; | 626 | return error; |
| 627 | } | 627 | } |
| @@ -676,7 +676,7 @@ asmlinkage long sys_chown(const char __user * filename, uid_t user, gid_t group) | |||
| 676 | if (error) | 676 | if (error) |
| 677 | goto out; | 677 | goto out; |
| 678 | error = chown_common(nd.path.dentry, user, group); | 678 | error = chown_common(nd.path.dentry, user, group); |
| 679 | path_release(&nd); | 679 | path_put(&nd.path); |
| 680 | out: | 680 | out: |
| 681 | return error; | 681 | return error; |
| 682 | } | 682 | } |
| @@ -696,7 +696,7 @@ asmlinkage long sys_fchownat(int dfd, const char __user *filename, uid_t user, | |||
| 696 | if (error) | 696 | if (error) |
| 697 | goto out; | 697 | goto out; |
| 698 | error = chown_common(nd.path.dentry, user, group); | 698 | error = chown_common(nd.path.dentry, user, group); |
| 699 | path_release(&nd); | 699 | path_put(&nd.path); |
| 700 | out: | 700 | out: |
| 701 | return error; | 701 | return error; |
| 702 | } | 702 | } |
| @@ -710,7 +710,7 @@ asmlinkage long sys_lchown(const char __user * filename, uid_t user, gid_t group | |||
| 710 | if (error) | 710 | if (error) |
| 711 | goto out; | 711 | goto out; |
| 712 | error = chown_common(nd.path.dentry, user, group); | 712 | error = chown_common(nd.path.dentry, user, group); |
| 713 | path_release(&nd); | 713 | path_put(&nd.path); |
| 714 | out: | 714 | out: |
| 715 | return error; | 715 | return error; |
| 716 | } | 716 | } |
| @@ -894,7 +894,7 @@ struct file *nameidata_to_filp(struct nameidata *nd, int flags) | |||
| 894 | filp = __dentry_open(nd->path.dentry, nd->path.mnt, flags, filp, | 894 | filp = __dentry_open(nd->path.dentry, nd->path.mnt, flags, filp, |
| 895 | NULL); | 895 | NULL); |
| 896 | else | 896 | else |
| 897 | path_release(nd); | 897 | path_put(&nd->path); |
| 898 | return filp; | 898 | return filp; |
| 899 | } | 899 | } |
| 900 | 900 | ||
diff --git a/fs/proc/base.c b/fs/proc/base.c index 0ef52230f8c7..c742be48348f 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
| @@ -1164,7 +1164,7 @@ static void *proc_pid_follow_link(struct dentry *dentry, struct nameidata *nd) | |||
| 1164 | int error = -EACCES; | 1164 | int error = -EACCES; |
| 1165 | 1165 | ||
| 1166 | /* We don't need a base pointer in the /proc filesystem */ | 1166 | /* We don't need a base pointer in the /proc filesystem */ |
| 1167 | path_release(nd); | 1167 | path_put(&nd->path); |
| 1168 | 1168 | ||
| 1169 | /* Are we allowed to snoop on the tasks file descriptors? */ | 1169 | /* Are we allowed to snoop on the tasks file descriptors? */ |
| 1170 | if (!proc_fd_access_allowed(inode)) | 1170 | if (!proc_fd_access_allowed(inode)) |
diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c index 2d1d6ac0c3f7..6841452e0dea 100644 --- a/fs/reiserfs/super.c +++ b/fs/reiserfs/super.c | |||
| @@ -2027,20 +2027,20 @@ static int reiserfs_quota_on(struct super_block *sb, int type, int format_id, | |||
| 2027 | return err; | 2027 | return err; |
| 2028 | /* Quotafile not on the same filesystem? */ | 2028 | /* Quotafile not on the same filesystem? */ |
| 2029 | if (nd.path.mnt->mnt_sb != sb) { | 2029 | if (nd.path.mnt->mnt_sb != sb) { |
| 2030 | path_release(&nd); | 2030 | path_put(&nd.path); |
| 2031 | return -EXDEV; | 2031 | return -EXDEV; |
| 2032 | } | 2032 | } |
| 2033 | /* We must not pack tails for quota files on reiserfs for quota IO to work */ | 2033 | /* We must not pack tails for quota files on reiserfs for quota IO to work */ |
| 2034 | if (!REISERFS_I(nd.path.dentry->d_inode)->i_flags & i_nopack_mask) { | 2034 | if (!REISERFS_I(nd.path.dentry->d_inode)->i_flags & i_nopack_mask) { |
| 2035 | reiserfs_warning(sb, | 2035 | reiserfs_warning(sb, |
| 2036 | "reiserfs: Quota file must have tail packing disabled."); | 2036 | "reiserfs: Quota file must have tail packing disabled."); |
| 2037 | path_release(&nd); | 2037 | path_put(&nd.path); |
| 2038 | return -EINVAL; | 2038 | return -EINVAL; |
| 2039 | } | 2039 | } |
| 2040 | /* Not journalling quota? No more tests needed... */ | 2040 | /* Not journalling quota? No more tests needed... */ |
| 2041 | if (!REISERFS_SB(sb)->s_qf_names[USRQUOTA] && | 2041 | if (!REISERFS_SB(sb)->s_qf_names[USRQUOTA] && |
| 2042 | !REISERFS_SB(sb)->s_qf_names[GRPQUOTA]) { | 2042 | !REISERFS_SB(sb)->s_qf_names[GRPQUOTA]) { |
| 2043 | path_release(&nd); | 2043 | path_put(&nd.path); |
| 2044 | return vfs_quota_on(sb, type, format_id, path); | 2044 | return vfs_quota_on(sb, type, format_id, path); |
| 2045 | } | 2045 | } |
| 2046 | /* Quotafile not of fs root? */ | 2046 | /* Quotafile not of fs root? */ |
| @@ -2048,7 +2048,7 @@ static int reiserfs_quota_on(struct super_block *sb, int type, int format_id, | |||
| 2048 | reiserfs_warning(sb, | 2048 | reiserfs_warning(sb, |
| 2049 | "reiserfs: Quota file not on filesystem root. " | 2049 | "reiserfs: Quota file not on filesystem root. " |
| 2050 | "Journalled quota will not work."); | 2050 | "Journalled quota will not work."); |
| 2051 | path_release(&nd); | 2051 | path_put(&nd.path); |
| 2052 | return vfs_quota_on(sb, type, format_id, path); | 2052 | return vfs_quota_on(sb, type, format_id, path); |
| 2053 | } | 2053 | } |
| 2054 | 2054 | ||
| @@ -63,7 +63,7 @@ int vfs_stat_fd(int dfd, char __user *name, struct kstat *stat) | |||
| 63 | error = __user_walk_fd(dfd, name, LOOKUP_FOLLOW, &nd); | 63 | error = __user_walk_fd(dfd, name, LOOKUP_FOLLOW, &nd); |
| 64 | if (!error) { | 64 | if (!error) { |
| 65 | error = vfs_getattr(nd.path.mnt, nd.path.dentry, stat); | 65 | error = vfs_getattr(nd.path.mnt, nd.path.dentry, stat); |
| 66 | path_release(&nd); | 66 | path_put(&nd.path); |
| 67 | } | 67 | } |
| 68 | return error; | 68 | return error; |
| 69 | } | 69 | } |
| @@ -83,7 +83,7 @@ int vfs_lstat_fd(int dfd, char __user *name, struct kstat *stat) | |||
| 83 | error = __user_walk_fd(dfd, name, 0, &nd); | 83 | error = __user_walk_fd(dfd, name, 0, &nd); |
| 84 | if (!error) { | 84 | if (!error) { |
| 85 | error = vfs_getattr(nd.path.mnt, nd.path.dentry, stat); | 85 | error = vfs_getattr(nd.path.mnt, nd.path.dentry, stat); |
| 86 | path_release(&nd); | 86 | path_put(&nd.path); |
| 87 | } | 87 | } |
| 88 | return error; | 88 | return error; |
| 89 | } | 89 | } |
| @@ -313,7 +313,7 @@ asmlinkage long sys_readlinkat(int dfd, const char __user *path, | |||
| 313 | buf, bufsiz); | 313 | buf, bufsiz); |
| 314 | } | 314 | } |
| 315 | } | 315 | } |
| 316 | path_release(&nd); | 316 | path_put(&nd.path); |
| 317 | } | 317 | } |
| 318 | return error; | 318 | return error; |
| 319 | } | 319 | } |
diff --git a/fs/utimes.c b/fs/utimes.c index 679b08288a66..b18da9c0b97f 100644 --- a/fs/utimes.c +++ b/fs/utimes.c | |||
| @@ -138,7 +138,7 @@ dput_and_out: | |||
| 138 | if (f) | 138 | if (f) |
| 139 | fput(f); | 139 | fput(f); |
| 140 | else | 140 | else |
| 141 | path_release(&nd); | 141 | path_put(&nd.path); |
| 142 | out: | 142 | out: |
| 143 | return error; | 143 | return error; |
| 144 | } | 144 | } |
diff --git a/fs/xattr.c b/fs/xattr.c index be0ee756c5f1..3acab1615460 100644 --- a/fs/xattr.c +++ b/fs/xattr.c | |||
| @@ -263,7 +263,7 @@ sys_setxattr(char __user *path, char __user *name, void __user *value, | |||
| 263 | if (error) | 263 | if (error) |
| 264 | return error; | 264 | return error; |
| 265 | error = setxattr(nd.path.dentry, name, value, size, flags); | 265 | error = setxattr(nd.path.dentry, name, value, size, flags); |
| 266 | path_release(&nd); | 266 | path_put(&nd.path); |
| 267 | return error; | 267 | return error; |
| 268 | } | 268 | } |
| 269 | 269 | ||
| @@ -278,7 +278,7 @@ sys_lsetxattr(char __user *path, char __user *name, void __user *value, | |||
| 278 | if (error) | 278 | if (error) |
| 279 | return error; | 279 | return error; |
| 280 | error = setxattr(nd.path.dentry, name, value, size, flags); | 280 | error = setxattr(nd.path.dentry, name, value, size, flags); |
| 281 | path_release(&nd); | 281 | path_put(&nd.path); |
| 282 | return error; | 282 | return error; |
| 283 | } | 283 | } |
| 284 | 284 | ||
| @@ -348,7 +348,7 @@ sys_getxattr(char __user *path, char __user *name, void __user *value, | |||
| 348 | if (error) | 348 | if (error) |
| 349 | return error; | 349 | return error; |
| 350 | error = getxattr(nd.path.dentry, name, value, size); | 350 | error = getxattr(nd.path.dentry, name, value, size); |
| 351 | path_release(&nd); | 351 | path_put(&nd.path); |
| 352 | return error; | 352 | return error; |
| 353 | } | 353 | } |
| 354 | 354 | ||
| @@ -363,7 +363,7 @@ sys_lgetxattr(char __user *path, char __user *name, void __user *value, | |||
| 363 | if (error) | 363 | if (error) |
| 364 | return error; | 364 | return error; |
| 365 | error = getxattr(nd.path.dentry, name, value, size); | 365 | error = getxattr(nd.path.dentry, name, value, size); |
| 366 | path_release(&nd); | 366 | path_put(&nd.path); |
| 367 | return error; | 367 | return error; |
| 368 | } | 368 | } |
| 369 | 369 | ||
| @@ -422,7 +422,7 @@ sys_listxattr(char __user *path, char __user *list, size_t size) | |||
| 422 | if (error) | 422 | if (error) |
| 423 | return error; | 423 | return error; |
| 424 | error = listxattr(nd.path.dentry, list, size); | 424 | error = listxattr(nd.path.dentry, list, size); |
| 425 | path_release(&nd); | 425 | path_put(&nd.path); |
| 426 | return error; | 426 | return error; |
| 427 | } | 427 | } |
| 428 | 428 | ||
| @@ -436,7 +436,7 @@ sys_llistxattr(char __user *path, char __user *list, size_t size) | |||
| 436 | if (error) | 436 | if (error) |
| 437 | return error; | 437 | return error; |
| 438 | error = listxattr(nd.path.dentry, list, size); | 438 | error = listxattr(nd.path.dentry, list, size); |
| 439 | path_release(&nd); | 439 | path_put(&nd.path); |
| 440 | return error; | 440 | return error; |
| 441 | } | 441 | } |
| 442 | 442 | ||
| @@ -483,7 +483,7 @@ sys_removexattr(char __user *path, char __user *name) | |||
| 483 | if (error) | 483 | if (error) |
| 484 | return error; | 484 | return error; |
| 485 | error = removexattr(nd.path.dentry, name); | 485 | error = removexattr(nd.path.dentry, name); |
| 486 | path_release(&nd); | 486 | path_put(&nd.path); |
| 487 | return error; | 487 | return error; |
| 488 | } | 488 | } |
| 489 | 489 | ||
| @@ -497,7 +497,7 @@ sys_lremovexattr(char __user *path, char __user *name) | |||
| 497 | if (error) | 497 | if (error) |
| 498 | return error; | 498 | return error; |
| 499 | error = removexattr(nd.path.dentry, name); | 499 | error = removexattr(nd.path.dentry, name); |
| 500 | path_release(&nd); | 500 | path_put(&nd.path); |
| 501 | return error; | 501 | return error; |
| 502 | } | 502 | } |
| 503 | 503 | ||
diff --git a/fs/xfs/linux-2.6/xfs_ioctl.c b/fs/xfs/linux-2.6/xfs_ioctl.c index f052a108bcc1..a9952e490ac9 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl.c +++ b/fs/xfs/linux-2.6/xfs_ioctl.c | |||
| @@ -94,7 +94,7 @@ xfs_find_handle( | |||
| 94 | ASSERT(nd.path.dentry); | 94 | ASSERT(nd.path.dentry); |
| 95 | ASSERT(nd.path.dentry->d_inode); | 95 | ASSERT(nd.path.dentry->d_inode); |
| 96 | inode = igrab(nd.path.dentry->d_inode); | 96 | inode = igrab(nd.path.dentry->d_inode); |
| 97 | path_release(&nd); | 97 | path_put(&nd.path); |
| 98 | break; | 98 | break; |
| 99 | } | 99 | } |
| 100 | 100 | ||
diff --git a/include/linux/namei.h b/include/linux/namei.h index 52fa2f78bb71..24d88e98a626 100644 --- a/include/linux/namei.h +++ b/include/linux/namei.h | |||
| @@ -66,7 +66,6 @@ extern int __user_walk_fd(int dfd, const char __user *, unsigned, struct nameida | |||
| 66 | extern int path_lookup(const char *, unsigned, struct nameidata *); | 66 | extern int path_lookup(const char *, unsigned, struct nameidata *); |
| 67 | extern int vfs_path_lookup(struct dentry *, struct vfsmount *, | 67 | extern int vfs_path_lookup(struct dentry *, struct vfsmount *, |
| 68 | const char *, unsigned int, struct nameidata *); | 68 | const char *, unsigned int, struct nameidata *); |
| 69 | extern void path_release(struct nameidata *); | ||
| 70 | 69 | ||
| 71 | extern int __user_path_lookup_open(const char __user *, unsigned lookup_flags, struct nameidata *nd, int open_flags); | 70 | extern int __user_path_lookup_open(const char __user *, unsigned lookup_flags, struct nameidata *nd, int open_flags); |
| 72 | extern int path_lookup_open(int dfd, const char *name, unsigned lookup_flags, struct nameidata *, int open_flags); | 71 | extern int path_lookup_open(int dfd, const char *name, unsigned lookup_flags, struct nameidata *, int open_flags); |
diff --git a/include/linux/path.h b/include/linux/path.h index cbebdc5c9a60..4d976f959f33 100644 --- a/include/linux/path.h +++ b/include/linux/path.h | |||
| @@ -9,4 +9,6 @@ struct path { | |||
| 9 | struct dentry *dentry; | 9 | struct dentry *dentry; |
| 10 | }; | 10 | }; |
| 11 | 11 | ||
| 12 | extern void path_put(struct path *); | ||
| 13 | |||
| 12 | #endif /* _LINUX_PATH_H */ | 14 | #endif /* _LINUX_PATH_H */ |
diff --git a/kernel/audit_tree.c b/kernel/audit_tree.c index b898814fe4a0..9ef5e0aacc3c 100644 --- a/kernel/audit_tree.c +++ b/kernel/audit_tree.c | |||
| @@ -550,7 +550,7 @@ void audit_trim_trees(void) | |||
| 550 | goto skip_it; | 550 | goto skip_it; |
| 551 | 551 | ||
| 552 | root_mnt = collect_mounts(nd.path.mnt, nd.path.dentry); | 552 | root_mnt = collect_mounts(nd.path.mnt, nd.path.dentry); |
| 553 | path_release(&nd); | 553 | path_put(&nd.path); |
| 554 | if (!root_mnt) | 554 | if (!root_mnt) |
| 555 | goto skip_it; | 555 | goto skip_it; |
| 556 | 556 | ||
| @@ -642,7 +642,7 @@ int audit_add_tree_rule(struct audit_krule *rule) | |||
| 642 | if (err) | 642 | if (err) |
| 643 | goto Err; | 643 | goto Err; |
| 644 | mnt = collect_mounts(nd.path.mnt, nd.path.dentry); | 644 | mnt = collect_mounts(nd.path.mnt, nd.path.dentry); |
| 645 | path_release(&nd); | 645 | path_put(&nd.path); |
| 646 | if (!mnt) { | 646 | if (!mnt) { |
| 647 | err = -ENOMEM; | 647 | err = -ENOMEM; |
| 648 | goto Err; | 648 | goto Err; |
| @@ -702,7 +702,7 @@ int audit_tag_tree(char *old, char *new) | |||
| 702 | if (err) | 702 | if (err) |
| 703 | return err; | 703 | return err; |
| 704 | tagged = collect_mounts(nd.path.mnt, nd.path.dentry); | 704 | tagged = collect_mounts(nd.path.mnt, nd.path.dentry); |
| 705 | path_release(&nd); | 705 | path_put(&nd.path); |
| 706 | if (!tagged) | 706 | if (!tagged) |
| 707 | return -ENOMEM; | 707 | return -ENOMEM; |
| 708 | 708 | ||
| @@ -713,7 +713,7 @@ int audit_tag_tree(char *old, char *new) | |||
| 713 | } | 713 | } |
| 714 | mnt = mntget(nd.path.mnt); | 714 | mnt = mntget(nd.path.mnt); |
| 715 | dentry = dget(nd.path.dentry); | 715 | dentry = dget(nd.path.dentry); |
| 716 | path_release(&nd); | 716 | path_put(&nd.path); |
| 717 | 717 | ||
| 718 | if (dentry == tagged->mnt_root && dentry == mnt->mnt_root) | 718 | if (dentry == tagged->mnt_root && dentry == mnt->mnt_root) |
| 719 | follow_up(&mnt, &dentry); | 719 | follow_up(&mnt, &dentry); |
| @@ -744,13 +744,13 @@ int audit_tag_tree(char *old, char *new) | |||
| 744 | spin_lock(&vfsmount_lock); | 744 | spin_lock(&vfsmount_lock); |
| 745 | if (!is_under(mnt, dentry, &nd)) { | 745 | if (!is_under(mnt, dentry, &nd)) { |
| 746 | spin_unlock(&vfsmount_lock); | 746 | spin_unlock(&vfsmount_lock); |
| 747 | path_release(&nd); | 747 | path_put(&nd.path); |
| 748 | put_tree(tree); | 748 | put_tree(tree); |
| 749 | mutex_lock(&audit_filter_mutex); | 749 | mutex_lock(&audit_filter_mutex); |
| 750 | continue; | 750 | continue; |
| 751 | } | 751 | } |
| 752 | spin_unlock(&vfsmount_lock); | 752 | spin_unlock(&vfsmount_lock); |
| 753 | path_release(&nd); | 753 | path_put(&nd.path); |
| 754 | 754 | ||
| 755 | list_for_each_entry(p, &list, mnt_list) { | 755 | list_for_each_entry(p, &list, mnt_list) { |
| 756 | failed = tag_chunk(p->mnt_root->d_inode, tree); | 756 | failed = tag_chunk(p->mnt_root->d_inode, tree); |
diff --git a/kernel/auditfilter.c b/kernel/auditfilter.c index a36e66797c3d..2f2914b7cc30 100644 --- a/kernel/auditfilter.c +++ b/kernel/auditfilter.c | |||
| @@ -1161,11 +1161,11 @@ static int audit_get_nd(char *path, struct nameidata **ndp, | |||
| 1161 | static void audit_put_nd(struct nameidata *ndp, struct nameidata *ndw) | 1161 | static void audit_put_nd(struct nameidata *ndp, struct nameidata *ndw) |
| 1162 | { | 1162 | { |
| 1163 | if (ndp) { | 1163 | if (ndp) { |
| 1164 | path_release(ndp); | 1164 | path_put(&ndp->path); |
| 1165 | kfree(ndp); | 1165 | kfree(ndp); |
| 1166 | } | 1166 | } |
| 1167 | if (ndw) { | 1167 | if (ndw) { |
| 1168 | path_release(ndw); | 1168 | path_put(&ndw->path); |
| 1169 | kfree(ndw); | 1169 | kfree(ndw); |
| 1170 | } | 1170 | } |
| 1171 | } | 1171 | } |
diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c index 6bc3babf6175..1b395a41a8b2 100644 --- a/net/sunrpc/rpc_pipe.c +++ b/net/sunrpc/rpc_pipe.c | |||
| @@ -495,7 +495,7 @@ rpc_lookup_parent(char *path, struct nameidata *nd) | |||
| 495 | static void | 495 | static void |
| 496 | rpc_release_path(struct nameidata *nd) | 496 | rpc_release_path(struct nameidata *nd) |
| 497 | { | 497 | { |
| 498 | path_release(nd); | 498 | path_put(&nd->path); |
| 499 | rpc_put_mount(); | 499 | rpc_put_mount(); |
| 500 | } | 500 | } |
| 501 | 501 | ||
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 7c3323e8827b..b8788fd5e3c6 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c | |||
| @@ -727,7 +727,7 @@ static struct sock *unix_find_other(struct net *net, | |||
| 727 | if (u->sk_type == type) | 727 | if (u->sk_type == type) |
| 728 | touch_atime(nd.path.mnt, nd.path.dentry); | 728 | touch_atime(nd.path.mnt, nd.path.dentry); |
| 729 | 729 | ||
| 730 | path_release(&nd); | 730 | path_put(&nd.path); |
| 731 | 731 | ||
| 732 | err=-EPROTOTYPE; | 732 | err=-EPROTOTYPE; |
| 733 | if (u->sk_type != type) { | 733 | if (u->sk_type != type) { |
| @@ -748,7 +748,7 @@ static struct sock *unix_find_other(struct net *net, | |||
| 748 | return u; | 748 | return u; |
| 749 | 749 | ||
| 750 | put_fail: | 750 | put_fail: |
| 751 | path_release(&nd); | 751 | path_put(&nd.path); |
| 752 | fail: | 752 | fail: |
| 753 | *error=err; | 753 | *error=err; |
| 754 | return NULL; | 754 | return NULL; |
| @@ -862,7 +862,7 @@ out_mknod_dput: | |||
| 862 | dput(dentry); | 862 | dput(dentry); |
| 863 | out_mknod_unlock: | 863 | out_mknod_unlock: |
| 864 | mutex_unlock(&nd.path.dentry->d_inode->i_mutex); | 864 | mutex_unlock(&nd.path.dentry->d_inode->i_mutex); |
| 865 | path_release(&nd); | 865 | path_put(&nd.path); |
| 866 | out_mknod_parent: | 866 | out_mknod_parent: |
| 867 | if (err==-EEXIST) | 867 | if (err==-EEXIST) |
| 868 | err=-EADDRINUSE; | 868 | err=-EADDRINUSE; |
