diff options
| author | Nick Piggin <npiggin@kernel.dk> | 2011-01-07 01:49:55 -0500 |
|---|---|---|
| committer | Nick Piggin <npiggin@kernel.dk> | 2011-01-07 01:50:28 -0500 |
| commit | fb045adb99d9b7c562dc7fef834857f78249daa1 (patch) | |
| tree | 1fd6a4024fffeec568abe100d730589bfdb81c38 | |
| parent | 5f57cbcc02cf18f6b22ef4066bb10afeb8f930ff (diff) | |
fs: dcache reduce branches in lookup path
Reduce some branches and memory accesses in dcache lookup by adding dentry
flags to indicate common d_ops are set, rather than having to check them.
This saves a pointer memory access (dentry->d_op) in common path lookup
situations, and saves another pointer load and branch in cases where we
have d_op but not the particular operation.
Patched with:
git grep -E '[.>]([[:space:]])*d_op([[:space:]])*=' | xargs sed -e 's/\([^\t ]*\)->d_op = \(.*\);/d_set_d_op(\1, \2);/' -e 's/\([^\t ]*\)\.d_op = \(.*\);/d_set_d_op(\&\1, \2);/' -i
Signed-off-by: Nick Piggin <npiggin@kernel.dk>
63 files changed, 174 insertions, 137 deletions
diff --git a/arch/ia64/kernel/perfmon.c b/arch/ia64/kernel/perfmon.c index d39d8a53b579..5a24f40bb48e 100644 --- a/arch/ia64/kernel/perfmon.c +++ b/arch/ia64/kernel/perfmon.c | |||
| @@ -2233,7 +2233,7 @@ pfm_alloc_file(pfm_context_t *ctx) | |||
| 2233 | } | 2233 | } |
| 2234 | path.mnt = mntget(pfmfs_mnt); | 2234 | path.mnt = mntget(pfmfs_mnt); |
| 2235 | 2235 | ||
| 2236 | path.dentry->d_op = &pfmfs_dentry_operations; | 2236 | d_set_d_op(path.dentry, &pfmfs_dentry_operations); |
| 2237 | d_add(path.dentry, inode); | 2237 | d_add(path.dentry, inode); |
| 2238 | 2238 | ||
| 2239 | file = alloc_file(&path, FMODE_READ, &pfm_file_ops); | 2239 | file = alloc_file(&path, FMODE_READ, &pfm_file_ops); |
diff --git a/drivers/staging/autofs/root.c b/drivers/staging/autofs/root.c index 0fdec4befd84..b09adb57971f 100644 --- a/drivers/staging/autofs/root.c +++ b/drivers/staging/autofs/root.c | |||
| @@ -237,7 +237,7 @@ static struct dentry *autofs_root_lookup(struct inode *dir, struct dentry *dentr | |||
| 237 | * | 237 | * |
| 238 | * We need to do this before we release the directory semaphore. | 238 | * We need to do this before we release the directory semaphore. |
| 239 | */ | 239 | */ |
| 240 | dentry->d_op = &autofs_dentry_operations; | 240 | d_set_d_op(dentry, &autofs_dentry_operations); |
| 241 | dentry->d_flags |= DCACHE_AUTOFS_PENDING; | 241 | dentry->d_flags |= DCACHE_AUTOFS_PENDING; |
| 242 | d_add(dentry, NULL); | 242 | d_add(dentry, NULL); |
| 243 | 243 | ||
diff --git a/drivers/staging/smbfs/dir.c b/drivers/staging/smbfs/dir.c index 5f79799d5d4a..78f09412740c 100644 --- a/drivers/staging/smbfs/dir.c +++ b/drivers/staging/smbfs/dir.c | |||
| @@ -398,9 +398,9 @@ smb_new_dentry(struct dentry *dentry) | |||
| 398 | struct smb_sb_info *server = server_from_dentry(dentry); | 398 | struct smb_sb_info *server = server_from_dentry(dentry); |
| 399 | 399 | ||
| 400 | if (server->mnt->flags & SMB_MOUNT_CASE) | 400 | if (server->mnt->flags & SMB_MOUNT_CASE) |
| 401 | dentry->d_op = &smbfs_dentry_operations_case; | 401 | d_set_d_op(dentry, &smbfs_dentry_operations_case); |
| 402 | else | 402 | else |
| 403 | dentry->d_op = &smbfs_dentry_operations; | 403 | d_set_d_op(dentry, &smbfs_dentry_operations); |
| 404 | dentry->d_time = jiffies; | 404 | dentry->d_time = jiffies; |
| 405 | } | 405 | } |
| 406 | 406 | ||
| @@ -462,9 +462,9 @@ smb_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd) | |||
| 462 | add_entry: | 462 | add_entry: |
| 463 | server = server_from_dentry(dentry); | 463 | server = server_from_dentry(dentry); |
| 464 | if (server->mnt->flags & SMB_MOUNT_CASE) | 464 | if (server->mnt->flags & SMB_MOUNT_CASE) |
| 465 | dentry->d_op = &smbfs_dentry_operations_case; | 465 | d_set_d_op(dentry, &smbfs_dentry_operations_case); |
| 466 | else | 466 | else |
| 467 | dentry->d_op = &smbfs_dentry_operations; | 467 | d_set_d_op(dentry, &smbfs_dentry_operations); |
| 468 | 468 | ||
| 469 | d_add(dentry, inode); | 469 | d_add(dentry, inode); |
| 470 | smb_renew_times(dentry); | 470 | smb_renew_times(dentry); |
diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c index f6f9081e6d2c..df8bbb358d54 100644 --- a/fs/9p/vfs_inode.c +++ b/fs/9p/vfs_inode.c | |||
| @@ -635,9 +635,9 @@ v9fs_create(struct v9fs_session_info *v9ses, struct inode *dir, | |||
| 635 | } | 635 | } |
| 636 | 636 | ||
| 637 | if (v9ses->cache) | 637 | if (v9ses->cache) |
| 638 | dentry->d_op = &v9fs_cached_dentry_operations; | 638 | d_set_d_op(dentry, &v9fs_cached_dentry_operations); |
| 639 | else | 639 | else |
| 640 | dentry->d_op = &v9fs_dentry_operations; | 640 | d_set_d_op(dentry, &v9fs_dentry_operations); |
| 641 | 641 | ||
| 642 | d_instantiate(dentry, inode); | 642 | d_instantiate(dentry, inode); |
| 643 | err = v9fs_fid_add(dentry, fid); | 643 | err = v9fs_fid_add(dentry, fid); |
| @@ -749,7 +749,7 @@ v9fs_vfs_create_dotl(struct inode *dir, struct dentry *dentry, int omode, | |||
| 749 | err); | 749 | err); |
| 750 | goto error; | 750 | goto error; |
| 751 | } | 751 | } |
| 752 | dentry->d_op = &v9fs_cached_dentry_operations; | 752 | d_set_d_op(dentry, &v9fs_cached_dentry_operations); |
| 753 | d_instantiate(dentry, inode); | 753 | d_instantiate(dentry, inode); |
| 754 | err = v9fs_fid_add(dentry, fid); | 754 | err = v9fs_fid_add(dentry, fid); |
| 755 | if (err < 0) | 755 | if (err < 0) |
| @@ -767,7 +767,7 @@ v9fs_vfs_create_dotl(struct inode *dir, struct dentry *dentry, int omode, | |||
| 767 | err = PTR_ERR(inode); | 767 | err = PTR_ERR(inode); |
| 768 | goto error; | 768 | goto error; |
| 769 | } | 769 | } |
| 770 | dentry->d_op = &v9fs_dentry_operations; | 770 | d_set_d_op(dentry, &v9fs_dentry_operations); |
| 771 | d_instantiate(dentry, inode); | 771 | d_instantiate(dentry, inode); |
| 772 | } | 772 | } |
| 773 | /* Now set the ACL based on the default value */ | 773 | /* Now set the ACL based on the default value */ |
| @@ -956,7 +956,7 @@ static int v9fs_vfs_mkdir_dotl(struct inode *dir, | |||
| 956 | err); | 956 | err); |
| 957 | goto error; | 957 | goto error; |
| 958 | } | 958 | } |
| 959 | dentry->d_op = &v9fs_cached_dentry_operations; | 959 | d_set_d_op(dentry, &v9fs_cached_dentry_operations); |
| 960 | d_instantiate(dentry, inode); | 960 | d_instantiate(dentry, inode); |
| 961 | err = v9fs_fid_add(dentry, fid); | 961 | err = v9fs_fid_add(dentry, fid); |
| 962 | if (err < 0) | 962 | if (err < 0) |
| @@ -973,7 +973,7 @@ static int v9fs_vfs_mkdir_dotl(struct inode *dir, | |||
| 973 | err = PTR_ERR(inode); | 973 | err = PTR_ERR(inode); |
| 974 | goto error; | 974 | goto error; |
| 975 | } | 975 | } |
| 976 | dentry->d_op = &v9fs_dentry_operations; | 976 | d_set_d_op(dentry, &v9fs_dentry_operations); |
| 977 | d_instantiate(dentry, inode); | 977 | d_instantiate(dentry, inode); |
| 978 | } | 978 | } |
| 979 | /* Now set the ACL based on the default value */ | 979 | /* Now set the ACL based on the default value */ |
| @@ -1041,9 +1041,9 @@ static struct dentry *v9fs_vfs_lookup(struct inode *dir, struct dentry *dentry, | |||
| 1041 | 1041 | ||
| 1042 | inst_out: | 1042 | inst_out: |
| 1043 | if (v9ses->cache) | 1043 | if (v9ses->cache) |
| 1044 | dentry->d_op = &v9fs_cached_dentry_operations; | 1044 | d_set_d_op(dentry, &v9fs_cached_dentry_operations); |
| 1045 | else | 1045 | else |
| 1046 | dentry->d_op = &v9fs_dentry_operations; | 1046 | d_set_d_op(dentry, &v9fs_dentry_operations); |
| 1047 | 1047 | ||
| 1048 | d_add(dentry, inode); | 1048 | d_add(dentry, inode); |
| 1049 | return NULL; | 1049 | return NULL; |
| @@ -1709,7 +1709,7 @@ v9fs_vfs_symlink_dotl(struct inode *dir, struct dentry *dentry, | |||
| 1709 | err); | 1709 | err); |
| 1710 | goto error; | 1710 | goto error; |
| 1711 | } | 1711 | } |
| 1712 | dentry->d_op = &v9fs_cached_dentry_operations; | 1712 | d_set_d_op(dentry, &v9fs_cached_dentry_operations); |
| 1713 | d_instantiate(dentry, inode); | 1713 | d_instantiate(dentry, inode); |
| 1714 | err = v9fs_fid_add(dentry, fid); | 1714 | err = v9fs_fid_add(dentry, fid); |
| 1715 | if (err < 0) | 1715 | if (err < 0) |
| @@ -1722,7 +1722,7 @@ v9fs_vfs_symlink_dotl(struct inode *dir, struct dentry *dentry, | |||
| 1722 | err = PTR_ERR(inode); | 1722 | err = PTR_ERR(inode); |
| 1723 | goto error; | 1723 | goto error; |
| 1724 | } | 1724 | } |
| 1725 | dentry->d_op = &v9fs_dentry_operations; | 1725 | d_set_d_op(dentry, &v9fs_dentry_operations); |
| 1726 | d_instantiate(dentry, inode); | 1726 | d_instantiate(dentry, inode); |
| 1727 | } | 1727 | } |
| 1728 | 1728 | ||
| @@ -1856,7 +1856,7 @@ v9fs_vfs_link_dotl(struct dentry *old_dentry, struct inode *dir, | |||
| 1856 | ihold(old_dentry->d_inode); | 1856 | ihold(old_dentry->d_inode); |
| 1857 | } | 1857 | } |
| 1858 | 1858 | ||
| 1859 | dentry->d_op = old_dentry->d_op; | 1859 | d_set_d_op(dentry, old_dentry->d_op); |
| 1860 | d_instantiate(dentry, old_dentry->d_inode); | 1860 | d_instantiate(dentry, old_dentry->d_inode); |
| 1861 | 1861 | ||
| 1862 | return err; | 1862 | return err; |
| @@ -1980,7 +1980,7 @@ v9fs_vfs_mknod_dotl(struct inode *dir, struct dentry *dentry, int omode, | |||
| 1980 | err); | 1980 | err); |
| 1981 | goto error; | 1981 | goto error; |
| 1982 | } | 1982 | } |
| 1983 | dentry->d_op = &v9fs_cached_dentry_operations; | 1983 | d_set_d_op(dentry, &v9fs_cached_dentry_operations); |
| 1984 | d_instantiate(dentry, inode); | 1984 | d_instantiate(dentry, inode); |
| 1985 | err = v9fs_fid_add(dentry, fid); | 1985 | err = v9fs_fid_add(dentry, fid); |
| 1986 | if (err < 0) | 1986 | if (err < 0) |
| @@ -1996,7 +1996,7 @@ v9fs_vfs_mknod_dotl(struct inode *dir, struct dentry *dentry, int omode, | |||
| 1996 | err = PTR_ERR(inode); | 1996 | err = PTR_ERR(inode); |
| 1997 | goto error; | 1997 | goto error; |
| 1998 | } | 1998 | } |
| 1999 | dentry->d_op = &v9fs_dentry_operations; | 1999 | d_set_d_op(dentry, &v9fs_dentry_operations); |
| 2000 | d_instantiate(dentry, inode); | 2000 | d_instantiate(dentry, inode); |
| 2001 | } | 2001 | } |
| 2002 | /* Now set the ACL based on the default value */ | 2002 | /* Now set the ACL based on the default value */ |
diff --git a/fs/adfs/dir.c b/fs/adfs/dir.c index a11e5e102716..bf7693c384f9 100644 --- a/fs/adfs/dir.c +++ b/fs/adfs/dir.c | |||
| @@ -276,7 +276,7 @@ adfs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd) | |||
| 276 | struct object_info obj; | 276 | struct object_info obj; |
| 277 | int error; | 277 | int error; |
| 278 | 278 | ||
| 279 | dentry->d_op = &adfs_dentry_operations; | 279 | d_set_d_op(dentry, &adfs_dentry_operations); |
| 280 | lock_kernel(); | 280 | lock_kernel(); |
| 281 | error = adfs_dir_lookup_byname(dir, &dentry->d_name, &obj); | 281 | error = adfs_dir_lookup_byname(dir, &dentry->d_name, &obj); |
| 282 | if (error == 0) { | 282 | if (error == 0) { |
diff --git a/fs/adfs/super.c b/fs/adfs/super.c index 47dffc513a26..a4041b52fbca 100644 --- a/fs/adfs/super.c +++ b/fs/adfs/super.c | |||
| @@ -484,7 +484,7 @@ static int adfs_fill_super(struct super_block *sb, void *data, int silent) | |||
| 484 | adfs_error(sb, "get root inode failed\n"); | 484 | adfs_error(sb, "get root inode failed\n"); |
| 485 | goto error; | 485 | goto error; |
| 486 | } else | 486 | } else |
| 487 | sb->s_root->d_op = &adfs_dentry_operations; | 487 | d_set_d_op(sb->s_root, &adfs_dentry_operations); |
| 488 | unlock_kernel(); | 488 | unlock_kernel(); |
| 489 | return 0; | 489 | return 0; |
| 490 | 490 | ||
diff --git a/fs/affs/namei.c b/fs/affs/namei.c index 5aca08c21100..944a4042fb65 100644 --- a/fs/affs/namei.c +++ b/fs/affs/namei.c | |||
| @@ -240,7 +240,7 @@ affs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd) | |||
| 240 | if (IS_ERR(inode)) | 240 | if (IS_ERR(inode)) |
| 241 | return ERR_CAST(inode); | 241 | return ERR_CAST(inode); |
| 242 | } | 242 | } |
| 243 | dentry->d_op = AFFS_SB(sb)->s_flags & SF_INTL ? &affs_intl_dentry_operations : &affs_dentry_operations; | 243 | d_set_d_op(dentry, AFFS_SB(sb)->s_flags & SF_INTL ? &affs_intl_dentry_operations : &affs_dentry_operations); |
| 244 | d_add(dentry, inode); | 244 | d_add(dentry, inode); |
| 245 | return NULL; | 245 | return NULL; |
| 246 | } | 246 | } |
diff --git a/fs/affs/super.c b/fs/affs/super.c index 4c18fcfb0a19..d39081bbe7ce 100644 --- a/fs/affs/super.c +++ b/fs/affs/super.c | |||
| @@ -482,7 +482,7 @@ got_root: | |||
| 482 | printk(KERN_ERR "AFFS: Get root inode failed\n"); | 482 | printk(KERN_ERR "AFFS: Get root inode failed\n"); |
| 483 | goto out_error; | 483 | goto out_error; |
| 484 | } | 484 | } |
| 485 | sb->s_root->d_op = &affs_dentry_operations; | 485 | d_set_d_op(sb->s_root, &affs_dentry_operations); |
| 486 | 486 | ||
| 487 | pr_debug("AFFS: s_flags=%lX\n",sb->s_flags); | 487 | pr_debug("AFFS: s_flags=%lX\n",sb->s_flags); |
| 488 | return 0; | 488 | return 0; |
diff --git a/fs/afs/dir.c b/fs/afs/dir.c index 2c18cde27000..b8bb7e7148d0 100644 --- a/fs/afs/dir.c +++ b/fs/afs/dir.c | |||
| @@ -581,7 +581,7 @@ static struct dentry *afs_lookup(struct inode *dir, struct dentry *dentry, | |||
| 581 | } | 581 | } |
| 582 | 582 | ||
| 583 | success: | 583 | success: |
| 584 | dentry->d_op = &afs_fs_dentry_operations; | 584 | d_set_d_op(dentry, &afs_fs_dentry_operations); |
| 585 | 585 | ||
| 586 | d_add(dentry, inode); | 586 | d_add(dentry, inode); |
| 587 | _leave(" = 0 { vn=%u u=%u } -> { ino=%lu v=%llu }", | 587 | _leave(" = 0 { vn=%u u=%u } -> { ino=%lu v=%llu }", |
diff --git a/fs/anon_inodes.c b/fs/anon_inodes.c index 57ce55b2564c..aca8806fa206 100644 --- a/fs/anon_inodes.c +++ b/fs/anon_inodes.c | |||
| @@ -113,7 +113,7 @@ struct file *anon_inode_getfile(const char *name, | |||
| 113 | */ | 113 | */ |
| 114 | ihold(anon_inode_inode); | 114 | ihold(anon_inode_inode); |
| 115 | 115 | ||
| 116 | path.dentry->d_op = &anon_inodefs_dentry_operations; | 116 | d_set_d_op(path.dentry, &anon_inodefs_dentry_operations); |
| 117 | d_instantiate(path.dentry, anon_inode_inode); | 117 | d_instantiate(path.dentry, anon_inode_inode); |
| 118 | 118 | ||
| 119 | error = -ENFILE; | 119 | error = -ENFILE; |
diff --git a/fs/autofs4/inode.c b/fs/autofs4/inode.c index ac87e49fa706..a7bdb9dcac84 100644 --- a/fs/autofs4/inode.c +++ b/fs/autofs4/inode.c | |||
| @@ -309,7 +309,7 @@ int autofs4_fill_super(struct super_block *s, void *data, int silent) | |||
| 309 | goto fail_iput; | 309 | goto fail_iput; |
| 310 | pipe = NULL; | 310 | pipe = NULL; |
| 311 | 311 | ||
| 312 | root->d_op = &autofs4_sb_dentry_operations; | 312 | d_set_d_op(root, &autofs4_sb_dentry_operations); |
| 313 | root->d_fsdata = ino; | 313 | root->d_fsdata = ino; |
| 314 | 314 | ||
| 315 | /* Can this call block? */ | 315 | /* Can this call block? */ |
diff --git a/fs/autofs4/root.c b/fs/autofs4/root.c index 10ca68a96dc7..bfe3f2eb684d 100644 --- a/fs/autofs4/root.c +++ b/fs/autofs4/root.c | |||
| @@ -571,7 +571,7 @@ static struct dentry *autofs4_lookup(struct inode *dir, struct dentry *dentry, s | |||
| 571 | * we check for the hashed dentry and return the newly | 571 | * we check for the hashed dentry and return the newly |
| 572 | * hashed dentry. | 572 | * hashed dentry. |
| 573 | */ | 573 | */ |
| 574 | dentry->d_op = &autofs4_root_dentry_operations; | 574 | d_set_d_op(dentry, &autofs4_root_dentry_operations); |
| 575 | 575 | ||
| 576 | /* | 576 | /* |
| 577 | * And we need to ensure that the same dentry is used for | 577 | * And we need to ensure that the same dentry is used for |
| @@ -710,9 +710,9 @@ static int autofs4_dir_symlink(struct inode *dir, | |||
| 710 | d_add(dentry, inode); | 710 | d_add(dentry, inode); |
| 711 | 711 | ||
| 712 | if (dir == dir->i_sb->s_root->d_inode) | 712 | if (dir == dir->i_sb->s_root->d_inode) |
| 713 | dentry->d_op = &autofs4_root_dentry_operations; | 713 | d_set_d_op(dentry, &autofs4_root_dentry_operations); |
| 714 | else | 714 | else |
| 715 | dentry->d_op = &autofs4_dentry_operations; | 715 | d_set_d_op(dentry, &autofs4_dentry_operations); |
| 716 | 716 | ||
| 717 | dentry->d_fsdata = ino; | 717 | dentry->d_fsdata = ino; |
| 718 | ino->dentry = dget(dentry); | 718 | ino->dentry = dget(dentry); |
| @@ -845,9 +845,9 @@ static int autofs4_dir_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
| 845 | d_add(dentry, inode); | 845 | d_add(dentry, inode); |
| 846 | 846 | ||
| 847 | if (dir == dir->i_sb->s_root->d_inode) | 847 | if (dir == dir->i_sb->s_root->d_inode) |
| 848 | dentry->d_op = &autofs4_root_dentry_operations; | 848 | d_set_d_op(dentry, &autofs4_root_dentry_operations); |
| 849 | else | 849 | else |
| 850 | dentry->d_op = &autofs4_dentry_operations; | 850 | d_set_d_op(dentry, &autofs4_dentry_operations); |
| 851 | 851 | ||
| 852 | dentry->d_fsdata = ino; | 852 | dentry->d_fsdata = ino; |
| 853 | ino->dentry = dget(dentry); | 853 | ino->dentry = dget(dentry); |
diff --git a/fs/btrfs/export.c b/fs/btrfs/export.c index 659f532d26a0..0ccf9a8afcdf 100644 --- a/fs/btrfs/export.c +++ b/fs/btrfs/export.c | |||
| @@ -110,7 +110,7 @@ static struct dentry *btrfs_get_dentry(struct super_block *sb, u64 objectid, | |||
| 110 | 110 | ||
| 111 | dentry = d_obtain_alias(inode); | 111 | dentry = d_obtain_alias(inode); |
| 112 | if (!IS_ERR(dentry)) | 112 | if (!IS_ERR(dentry)) |
| 113 | dentry->d_op = &btrfs_dentry_operations; | 113 | d_set_d_op(dentry, &btrfs_dentry_operations); |
| 114 | return dentry; | 114 | return dentry; |
| 115 | fail: | 115 | fail: |
| 116 | srcu_read_unlock(&fs_info->subvol_srcu, index); | 116 | srcu_read_unlock(&fs_info->subvol_srcu, index); |
| @@ -225,7 +225,7 @@ static struct dentry *btrfs_get_parent(struct dentry *child) | |||
| 225 | key.offset = 0; | 225 | key.offset = 0; |
| 226 | dentry = d_obtain_alias(btrfs_iget(root->fs_info->sb, &key, root, NULL)); | 226 | dentry = d_obtain_alias(btrfs_iget(root->fs_info->sb, &key, root, NULL)); |
| 227 | if (!IS_ERR(dentry)) | 227 | if (!IS_ERR(dentry)) |
| 228 | dentry->d_op = &btrfs_dentry_operations; | 228 | d_set_d_op(dentry, &btrfs_dentry_operations); |
| 229 | return dentry; | 229 | return dentry; |
| 230 | fail: | 230 | fail: |
| 231 | btrfs_free_path(path); | 231 | btrfs_free_path(path); |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index f9d2994a42a2..63e4546b478a 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
| @@ -4084,7 +4084,7 @@ struct inode *btrfs_lookup_dentry(struct inode *dir, struct dentry *dentry) | |||
| 4084 | int index; | 4084 | int index; |
| 4085 | int ret; | 4085 | int ret; |
| 4086 | 4086 | ||
| 4087 | dentry->d_op = &btrfs_dentry_operations; | 4087 | d_set_d_op(dentry, &btrfs_dentry_operations); |
| 4088 | 4088 | ||
| 4089 | if (dentry->d_name.len > BTRFS_NAME_LEN) | 4089 | if (dentry->d_name.len > BTRFS_NAME_LEN) |
| 4090 | return ERR_PTR(-ENAMETOOLONG); | 4090 | return ERR_PTR(-ENAMETOOLONG); |
diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c index 58abc3da6111..cc01cf826769 100644 --- a/fs/ceph/dir.c +++ b/fs/ceph/dir.c | |||
| @@ -42,11 +42,11 @@ int ceph_init_dentry(struct dentry *dentry) | |||
| 42 | 42 | ||
| 43 | if (dentry->d_parent == NULL || /* nfs fh_to_dentry */ | 43 | if (dentry->d_parent == NULL || /* nfs fh_to_dentry */ |
| 44 | ceph_snap(dentry->d_parent->d_inode) == CEPH_NOSNAP) | 44 | ceph_snap(dentry->d_parent->d_inode) == CEPH_NOSNAP) |
| 45 | dentry->d_op = &ceph_dentry_ops; | 45 | d_set_d_op(dentry, &ceph_dentry_ops); |
| 46 | else if (ceph_snap(dentry->d_parent->d_inode) == CEPH_SNAPDIR) | 46 | else if (ceph_snap(dentry->d_parent->d_inode) == CEPH_SNAPDIR) |
| 47 | dentry->d_op = &ceph_snapdir_dentry_ops; | 47 | d_set_d_op(dentry, &ceph_snapdir_dentry_ops); |
| 48 | else | 48 | else |
| 49 | dentry->d_op = &ceph_snap_dentry_ops; | 49 | d_set_d_op(dentry, &ceph_snap_dentry_ops); |
| 50 | 50 | ||
| 51 | di = kmem_cache_alloc(ceph_dentry_cachep, GFP_NOFS | __GFP_ZERO); | 51 | di = kmem_cache_alloc(ceph_dentry_cachep, GFP_NOFS | __GFP_ZERO); |
| 52 | if (!di) | 52 | if (!di) |
diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c index 88bfe686ac00..e3b10ca6d453 100644 --- a/fs/cifs/dir.c +++ b/fs/cifs/dir.c | |||
| @@ -135,9 +135,9 @@ static void setup_cifs_dentry(struct cifsTconInfo *tcon, | |||
| 135 | struct inode *newinode) | 135 | struct inode *newinode) |
| 136 | { | 136 | { |
| 137 | if (tcon->nocase) | 137 | if (tcon->nocase) |
| 138 | direntry->d_op = &cifs_ci_dentry_ops; | 138 | d_set_d_op(direntry, &cifs_ci_dentry_ops); |
| 139 | else | 139 | else |
| 140 | direntry->d_op = &cifs_dentry_ops; | 140 | d_set_d_op(direntry, &cifs_dentry_ops); |
| 141 | d_instantiate(direntry, newinode); | 141 | d_instantiate(direntry, newinode); |
| 142 | } | 142 | } |
| 143 | 143 | ||
| @@ -421,9 +421,9 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, int mode, | |||
| 421 | rc = cifs_get_inode_info_unix(&newinode, full_path, | 421 | rc = cifs_get_inode_info_unix(&newinode, full_path, |
| 422 | inode->i_sb, xid); | 422 | inode->i_sb, xid); |
| 423 | if (pTcon->nocase) | 423 | if (pTcon->nocase) |
| 424 | direntry->d_op = &cifs_ci_dentry_ops; | 424 | d_set_d_op(direntry, &cifs_ci_dentry_ops); |
| 425 | else | 425 | else |
| 426 | direntry->d_op = &cifs_dentry_ops; | 426 | d_set_d_op(direntry, &cifs_dentry_ops); |
| 427 | 427 | ||
| 428 | if (rc == 0) | 428 | if (rc == 0) |
| 429 | d_instantiate(direntry, newinode); | 429 | d_instantiate(direntry, newinode); |
| @@ -604,9 +604,9 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry, | |||
| 604 | 604 | ||
| 605 | if ((rc == 0) && (newInode != NULL)) { | 605 | if ((rc == 0) && (newInode != NULL)) { |
| 606 | if (pTcon->nocase) | 606 | if (pTcon->nocase) |
| 607 | direntry->d_op = &cifs_ci_dentry_ops; | 607 | d_set_d_op(direntry, &cifs_ci_dentry_ops); |
| 608 | else | 608 | else |
| 609 | direntry->d_op = &cifs_dentry_ops; | 609 | d_set_d_op(direntry, &cifs_dentry_ops); |
| 610 | d_add(direntry, newInode); | 610 | d_add(direntry, newInode); |
| 611 | if (posix_open) { | 611 | if (posix_open) { |
| 612 | filp = lookup_instantiate_filp(nd, direntry, | 612 | filp = lookup_instantiate_filp(nd, direntry, |
| @@ -634,9 +634,9 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry, | |||
| 634 | rc = 0; | 634 | rc = 0; |
| 635 | direntry->d_time = jiffies; | 635 | direntry->d_time = jiffies; |
| 636 | if (pTcon->nocase) | 636 | if (pTcon->nocase) |
| 637 | direntry->d_op = &cifs_ci_dentry_ops; | 637 | d_set_d_op(direntry, &cifs_ci_dentry_ops); |
| 638 | else | 638 | else |
| 639 | direntry->d_op = &cifs_dentry_ops; | 639 | d_set_d_op(direntry, &cifs_dentry_ops); |
| 640 | d_add(direntry, NULL); | 640 | d_add(direntry, NULL); |
| 641 | /* if it was once a directory (but how can we tell?) we could do | 641 | /* if it was once a directory (but how can we tell?) we could do |
| 642 | shrink_dcache_parent(direntry); */ | 642 | shrink_dcache_parent(direntry); */ |
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index 99b9a2cc14b7..2a239d878e85 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c | |||
| @@ -1319,9 +1319,9 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode) | |||
| 1319 | to set uid/gid */ | 1319 | to set uid/gid */ |
| 1320 | inc_nlink(inode); | 1320 | inc_nlink(inode); |
| 1321 | if (pTcon->nocase) | 1321 | if (pTcon->nocase) |
| 1322 | direntry->d_op = &cifs_ci_dentry_ops; | 1322 | d_set_d_op(direntry, &cifs_ci_dentry_ops); |
| 1323 | else | 1323 | else |
| 1324 | direntry->d_op = &cifs_dentry_ops; | 1324 | d_set_d_op(direntry, &cifs_dentry_ops); |
| 1325 | 1325 | ||
| 1326 | cifs_unix_basic_to_fattr(&fattr, pInfo, cifs_sb); | 1326 | cifs_unix_basic_to_fattr(&fattr, pInfo, cifs_sb); |
| 1327 | cifs_fill_uniqueid(inode->i_sb, &fattr); | 1327 | cifs_fill_uniqueid(inode->i_sb, &fattr); |
| @@ -1363,9 +1363,9 @@ mkdir_get_info: | |||
| 1363 | inode->i_sb, xid, NULL); | 1363 | inode->i_sb, xid, NULL); |
| 1364 | 1364 | ||
| 1365 | if (pTcon->nocase) | 1365 | if (pTcon->nocase) |
| 1366 | direntry->d_op = &cifs_ci_dentry_ops; | 1366 | d_set_d_op(direntry, &cifs_ci_dentry_ops); |
| 1367 | else | 1367 | else |
| 1368 | direntry->d_op = &cifs_dentry_ops; | 1368 | d_set_d_op(direntry, &cifs_dentry_ops); |
| 1369 | d_instantiate(direntry, newinode); | 1369 | d_instantiate(direntry, newinode); |
| 1370 | /* setting nlink not necessary except in cases where we | 1370 | /* setting nlink not necessary except in cases where we |
| 1371 | * failed to get it from the server or was set bogus */ | 1371 | * failed to get it from the server or was set bogus */ |
diff --git a/fs/cifs/link.c b/fs/cifs/link.c index 85cdbf831e7b..fe2f6a93c49e 100644 --- a/fs/cifs/link.c +++ b/fs/cifs/link.c | |||
| @@ -525,9 +525,9 @@ cifs_symlink(struct inode *inode, struct dentry *direntry, const char *symname) | |||
| 525 | rc); | 525 | rc); |
| 526 | } else { | 526 | } else { |
| 527 | if (pTcon->nocase) | 527 | if (pTcon->nocase) |
| 528 | direntry->d_op = &cifs_ci_dentry_ops; | 528 | d_set_d_op(direntry, &cifs_ci_dentry_ops); |
| 529 | else | 529 | else |
| 530 | direntry->d_op = &cifs_dentry_ops; | 530 | d_set_d_op(direntry, &cifs_dentry_ops); |
| 531 | d_instantiate(direntry, newinode); | 531 | d_instantiate(direntry, newinode); |
| 532 | } | 532 | } |
| 533 | } | 533 | } |
diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c index ee463aeca0b0..ec5b68e3b928 100644 --- a/fs/cifs/readdir.c +++ b/fs/cifs/readdir.c | |||
| @@ -103,9 +103,9 @@ cifs_readdir_lookup(struct dentry *parent, struct qstr *name, | |||
| 103 | } | 103 | } |
| 104 | 104 | ||
| 105 | if (cifs_sb_master_tcon(CIFS_SB(sb))->nocase) | 105 | if (cifs_sb_master_tcon(CIFS_SB(sb))->nocase) |
| 106 | dentry->d_op = &cifs_ci_dentry_ops; | 106 | d_set_d_op(dentry, &cifs_ci_dentry_ops); |
| 107 | else | 107 | else |
| 108 | dentry->d_op = &cifs_dentry_ops; | 108 | d_set_d_op(dentry, &cifs_dentry_ops); |
| 109 | 109 | ||
| 110 | alias = d_materialise_unique(dentry, inode); | 110 | alias = d_materialise_unique(dentry, inode); |
| 111 | if (alias != NULL) { | 111 | if (alias != NULL) { |
diff --git a/fs/coda/dir.c b/fs/coda/dir.c index 9e37e8bc9b89..aa40c811f8d2 100644 --- a/fs/coda/dir.c +++ b/fs/coda/dir.c | |||
| @@ -125,7 +125,7 @@ static struct dentry *coda_lookup(struct inode *dir, struct dentry *entry, struc | |||
| 125 | return ERR_PTR(error); | 125 | return ERR_PTR(error); |
| 126 | 126 | ||
| 127 | exit: | 127 | exit: |
| 128 | entry->d_op = &coda_dentry_operations; | 128 | d_set_d_op(entry, &coda_dentry_operations); |
| 129 | 129 | ||
| 130 | if (inode && (type & CODA_NOCACHE)) | 130 | if (inode && (type & CODA_NOCACHE)) |
| 131 | coda_flag_inode(inode, C_VATTR | C_PURGE); | 131 | coda_flag_inode(inode, C_VATTR | C_PURGE); |
diff --git a/fs/configfs/dir.c b/fs/configfs/dir.c index e9acea440ffc..36637a8c1ed3 100644 --- a/fs/configfs/dir.c +++ b/fs/configfs/dir.c | |||
| @@ -442,7 +442,7 @@ static int configfs_attach_attr(struct configfs_dirent * sd, struct dentry * den | |||
| 442 | return error; | 442 | return error; |
| 443 | } | 443 | } |
| 444 | 444 | ||
| 445 | dentry->d_op = &configfs_dentry_ops; | 445 | d_set_d_op(dentry, &configfs_dentry_ops); |
| 446 | d_rehash(dentry); | 446 | d_rehash(dentry); |
| 447 | 447 | ||
| 448 | return 0; | 448 | return 0; |
| @@ -489,7 +489,7 @@ static struct dentry * configfs_lookup(struct inode *dir, | |||
| 489 | */ | 489 | */ |
| 490 | if (dentry->d_name.len > NAME_MAX) | 490 | if (dentry->d_name.len > NAME_MAX) |
| 491 | return ERR_PTR(-ENAMETOOLONG); | 491 | return ERR_PTR(-ENAMETOOLONG); |
| 492 | dentry->d_op = &configfs_dentry_ops; | 492 | d_set_d_op(dentry, &configfs_dentry_ops); |
| 493 | d_add(dentry, NULL); | 493 | d_add(dentry, NULL); |
| 494 | return NULL; | 494 | return NULL; |
| 495 | } | 495 | } |
| @@ -683,7 +683,7 @@ static int create_default_group(struct config_group *parent_group, | |||
| 683 | ret = -ENOMEM; | 683 | ret = -ENOMEM; |
| 684 | child = d_alloc(parent, &name); | 684 | child = d_alloc(parent, &name); |
| 685 | if (child) { | 685 | if (child) { |
| 686 | child->d_op = &configfs_dentry_ops; | 686 | d_set_d_op(child, &configfs_dentry_ops); |
| 687 | d_add(child, NULL); | 687 | d_add(child, NULL); |
| 688 | 688 | ||
| 689 | ret = configfs_attach_group(&parent_group->cg_item, | 689 | ret = configfs_attach_group(&parent_group->cg_item, |
| @@ -1681,7 +1681,7 @@ int configfs_register_subsystem(struct configfs_subsystem *subsys) | |||
| 1681 | err = -ENOMEM; | 1681 | err = -ENOMEM; |
| 1682 | dentry = d_alloc(configfs_sb->s_root, &name); | 1682 | dentry = d_alloc(configfs_sb->s_root, &name); |
| 1683 | if (dentry) { | 1683 | if (dentry) { |
| 1684 | dentry->d_op = &configfs_dentry_ops; | 1684 | d_set_d_op(dentry, &configfs_dentry_ops); |
| 1685 | d_add(dentry, NULL); | 1685 | d_add(dentry, NULL); |
| 1686 | 1686 | ||
| 1687 | err = configfs_attach_group(sd->s_element, &group->cg_item, | 1687 | err = configfs_attach_group(sd->s_element, &group->cg_item, |
diff --git a/fs/dcache.c b/fs/dcache.c index 1d5cf511e1c7..f9693da3efbd 100644 --- a/fs/dcache.c +++ b/fs/dcache.c | |||
| @@ -398,7 +398,7 @@ repeat: | |||
| 398 | return; | 398 | return; |
| 399 | } | 399 | } |
| 400 | 400 | ||
| 401 | if (dentry->d_op && dentry->d_op->d_delete) { | 401 | if (dentry->d_flags & DCACHE_OP_DELETE) { |
| 402 | if (dentry->d_op->d_delete(dentry)) | 402 | if (dentry->d_op->d_delete(dentry)) |
| 403 | goto kill_it; | 403 | goto kill_it; |
| 404 | } | 404 | } |
| @@ -1301,6 +1301,28 @@ struct dentry *d_alloc_name(struct dentry *parent, const char *name) | |||
| 1301 | } | 1301 | } |
| 1302 | EXPORT_SYMBOL(d_alloc_name); | 1302 | EXPORT_SYMBOL(d_alloc_name); |
| 1303 | 1303 | ||
| 1304 | void d_set_d_op(struct dentry *dentry, const struct dentry_operations *op) | ||
| 1305 | { | ||
| 1306 | BUG_ON(dentry->d_op); | ||
| 1307 | BUG_ON(dentry->d_flags & (DCACHE_OP_HASH | | ||
| 1308 | DCACHE_OP_COMPARE | | ||
| 1309 | DCACHE_OP_REVALIDATE | | ||
| 1310 | DCACHE_OP_DELETE )); | ||
| 1311 | dentry->d_op = op; | ||
| 1312 | if (!op) | ||
| 1313 | return; | ||
| 1314 | if (op->d_hash) | ||
| 1315 | dentry->d_flags |= DCACHE_OP_HASH; | ||
| 1316 | if (op->d_compare) | ||
| 1317 | dentry->d_flags |= DCACHE_OP_COMPARE; | ||
| 1318 | if (op->d_revalidate) | ||
| 1319 | dentry->d_flags |= DCACHE_OP_REVALIDATE; | ||
| 1320 | if (op->d_delete) | ||
| 1321 | dentry->d_flags |= DCACHE_OP_DELETE; | ||
| 1322 | |||
| 1323 | } | ||
| 1324 | EXPORT_SYMBOL(d_set_d_op); | ||
| 1325 | |||
| 1304 | static void __d_instantiate(struct dentry *dentry, struct inode *inode) | 1326 | static void __d_instantiate(struct dentry *dentry, struct inode *inode) |
| 1305 | { | 1327 | { |
| 1306 | spin_lock(&dentry->d_lock); | 1328 | spin_lock(&dentry->d_lock); |
| @@ -1731,7 +1753,7 @@ seqretry: | |||
| 1731 | */ | 1753 | */ |
| 1732 | if (read_seqcount_retry(&dentry->d_seq, *seq)) | 1754 | if (read_seqcount_retry(&dentry->d_seq, *seq)) |
| 1733 | goto seqretry; | 1755 | goto seqretry; |
| 1734 | if (parent->d_op && parent->d_op->d_compare) { | 1756 | if (parent->d_flags & DCACHE_OP_COMPARE) { |
| 1735 | if (parent->d_op->d_compare(parent, *inode, | 1757 | if (parent->d_op->d_compare(parent, *inode, |
| 1736 | dentry, i, | 1758 | dentry, i, |
| 1737 | tlen, tname, name)) | 1759 | tlen, tname, name)) |
| @@ -1846,7 +1868,7 @@ struct dentry *__d_lookup(struct dentry *parent, struct qstr *name) | |||
| 1846 | */ | 1868 | */ |
| 1847 | tlen = dentry->d_name.len; | 1869 | tlen = dentry->d_name.len; |
| 1848 | tname = dentry->d_name.name; | 1870 | tname = dentry->d_name.name; |
| 1849 | if (parent->d_op && parent->d_op->d_compare) { | 1871 | if (parent->d_flags & DCACHE_OP_COMPARE) { |
| 1850 | if (parent->d_op->d_compare(parent, parent->d_inode, | 1872 | if (parent->d_op->d_compare(parent, parent->d_inode, |
| 1851 | dentry, dentry->d_inode, | 1873 | dentry, dentry->d_inode, |
| 1852 | tlen, tname, name)) | 1874 | tlen, tname, name)) |
| @@ -1887,7 +1909,7 @@ struct dentry *d_hash_and_lookup(struct dentry *dir, struct qstr *name) | |||
| 1887 | * routine may choose to leave the hash value unchanged. | 1909 | * routine may choose to leave the hash value unchanged. |
| 1888 | */ | 1910 | */ |
| 1889 | name->hash = full_name_hash(name->name, name->len); | 1911 | name->hash = full_name_hash(name->name, name->len); |
| 1890 | if (dir->d_op && dir->d_op->d_hash) { | 1912 | if (dir->d_flags & DCACHE_OP_HASH) { |
| 1891 | if (dir->d_op->d_hash(dir, dir->d_inode, name) < 0) | 1913 | if (dir->d_op->d_hash(dir, dir->d_inode, name) < 0) |
| 1892 | goto out; | 1914 | goto out; |
| 1893 | } | 1915 | } |
diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c index 5e5c7ec1fc98..f91b35db4c6e 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c | |||
| @@ -441,7 +441,7 @@ static struct dentry *ecryptfs_lookup(struct inode *ecryptfs_dir_inode, | |||
| 441 | struct qstr lower_name; | 441 | struct qstr lower_name; |
| 442 | int rc = 0; | 442 | int rc = 0; |
| 443 | 443 | ||
| 444 | ecryptfs_dentry->d_op = &ecryptfs_dops; | 444 | d_set_d_op(ecryptfs_dentry, &ecryptfs_dops); |
| 445 | if ((ecryptfs_dentry->d_name.len == 1 | 445 | if ((ecryptfs_dentry->d_name.len == 1 |
| 446 | && !strcmp(ecryptfs_dentry->d_name.name, ".")) | 446 | && !strcmp(ecryptfs_dentry->d_name.name, ".")) |
| 447 | || (ecryptfs_dentry->d_name.len == 2 | 447 | || (ecryptfs_dentry->d_name.len == 2 |
diff --git a/fs/ecryptfs/main.c b/fs/ecryptfs/main.c index a9dbd62518e6..351038675376 100644 --- a/fs/ecryptfs/main.c +++ b/fs/ecryptfs/main.c | |||
| @@ -189,7 +189,7 @@ int ecryptfs_interpose(struct dentry *lower_dentry, struct dentry *dentry, | |||
| 189 | if (special_file(lower_inode->i_mode)) | 189 | if (special_file(lower_inode->i_mode)) |
| 190 | init_special_inode(inode, lower_inode->i_mode, | 190 | init_special_inode(inode, lower_inode->i_mode, |
| 191 | lower_inode->i_rdev); | 191 | lower_inode->i_rdev); |
| 192 | dentry->d_op = &ecryptfs_dops; | 192 | d_set_d_op(dentry, &ecryptfs_dops); |
| 193 | fsstack_copy_attr_all(inode, lower_inode); | 193 | fsstack_copy_attr_all(inode, lower_inode); |
| 194 | /* This size will be overwritten for real files w/ headers and | 194 | /* This size will be overwritten for real files w/ headers and |
| 195 | * other metadata */ | 195 | * other metadata */ |
| @@ -594,7 +594,7 @@ static struct dentry *ecryptfs_mount(struct file_system_type *fs_type, int flags | |||
| 594 | deactivate_locked_super(s); | 594 | deactivate_locked_super(s); |
| 595 | goto out; | 595 | goto out; |
| 596 | } | 596 | } |
| 597 | s->s_root->d_op = &ecryptfs_dops; | 597 | d_set_d_op(s->s_root, &ecryptfs_dops); |
| 598 | s->s_root->d_sb = s; | 598 | s->s_root->d_sb = s; |
| 599 | s->s_root->d_parent = s->s_root; | 599 | s->s_root->d_parent = s->s_root; |
| 600 | 600 | ||
diff --git a/fs/fat/inode.c b/fs/fat/inode.c index 8cccfebee180..206351af7c58 100644 --- a/fs/fat/inode.c +++ b/fs/fat/inode.c | |||
| @@ -750,7 +750,7 @@ static struct dentry *fat_fh_to_dentry(struct super_block *sb, | |||
| 750 | */ | 750 | */ |
| 751 | result = d_obtain_alias(inode); | 751 | result = d_obtain_alias(inode); |
| 752 | if (!IS_ERR(result)) | 752 | if (!IS_ERR(result)) |
| 753 | result->d_op = sb->s_root->d_op; | 753 | d_set_d_op(result, sb->s_root->d_op); |
| 754 | return result; | 754 | return result; |
| 755 | } | 755 | } |
| 756 | 756 | ||
| @@ -800,7 +800,7 @@ static struct dentry *fat_get_parent(struct dentry *child) | |||
| 800 | 800 | ||
| 801 | parent = d_obtain_alias(inode); | 801 | parent = d_obtain_alias(inode); |
| 802 | if (!IS_ERR(parent)) | 802 | if (!IS_ERR(parent)) |
| 803 | parent->d_op = sb->s_root->d_op; | 803 | d_set_d_op(parent, sb->s_root->d_op); |
| 804 | out: | 804 | out: |
| 805 | unlock_super(sb); | 805 | unlock_super(sb); |
| 806 | 806 | ||
diff --git a/fs/fat/namei_msdos.c b/fs/fat/namei_msdos.c index 3b3e072d8982..35ffe43afa4b 100644 --- a/fs/fat/namei_msdos.c +++ b/fs/fat/namei_msdos.c | |||
| @@ -227,10 +227,10 @@ static struct dentry *msdos_lookup(struct inode *dir, struct dentry *dentry, | |||
| 227 | } | 227 | } |
| 228 | out: | 228 | out: |
| 229 | unlock_super(sb); | 229 | unlock_super(sb); |
| 230 | dentry->d_op = &msdos_dentry_operations; | 230 | d_set_d_op(dentry, &msdos_dentry_operations); |
| 231 | dentry = d_splice_alias(inode, dentry); | 231 | dentry = d_splice_alias(inode, dentry); |
| 232 | if (dentry) | 232 | if (dentry) |
| 233 | dentry->d_op = &msdos_dentry_operations; | 233 | d_set_d_op(dentry, &msdos_dentry_operations); |
| 234 | return dentry; | 234 | return dentry; |
| 235 | 235 | ||
| 236 | error: | 236 | error: |
| @@ -673,7 +673,7 @@ static int msdos_fill_super(struct super_block *sb, void *data, int silent) | |||
| 673 | } | 673 | } |
| 674 | 674 | ||
| 675 | sb->s_flags |= MS_NOATIME; | 675 | sb->s_flags |= MS_NOATIME; |
| 676 | sb->s_root->d_op = &msdos_dentry_operations; | 676 | d_set_d_op(sb->s_root, &msdos_dentry_operations); |
| 677 | unlock_super(sb); | 677 | unlock_super(sb); |
| 678 | return 0; | 678 | return 0; |
| 679 | } | 679 | } |
diff --git a/fs/fat/namei_vfat.c b/fs/fat/namei_vfat.c index 4fc06278db48..3be5ed7d859f 100644 --- a/fs/fat/namei_vfat.c +++ b/fs/fat/namei_vfat.c | |||
| @@ -766,11 +766,11 @@ static struct dentry *vfat_lookup(struct inode *dir, struct dentry *dentry, | |||
| 766 | 766 | ||
| 767 | out: | 767 | out: |
| 768 | unlock_super(sb); | 768 | unlock_super(sb); |
| 769 | dentry->d_op = sb->s_root->d_op; | 769 | d_set_d_op(dentry, sb->s_root->d_op); |
| 770 | dentry->d_time = dentry->d_parent->d_inode->i_version; | 770 | dentry->d_time = dentry->d_parent->d_inode->i_version; |
| 771 | dentry = d_splice_alias(inode, dentry); | 771 | dentry = d_splice_alias(inode, dentry); |
| 772 | if (dentry) { | 772 | if (dentry) { |
| 773 | dentry->d_op = sb->s_root->d_op; | 773 | d_set_d_op(dentry, sb->s_root->d_op); |
| 774 | dentry->d_time = dentry->d_parent->d_inode->i_version; | 774 | dentry->d_time = dentry->d_parent->d_inode->i_version; |
| 775 | } | 775 | } |
| 776 | return dentry; | 776 | return dentry; |
| @@ -1072,9 +1072,9 @@ static int vfat_fill_super(struct super_block *sb, void *data, int silent) | |||
| 1072 | } | 1072 | } |
| 1073 | 1073 | ||
| 1074 | if (MSDOS_SB(sb)->options.name_check != 's') | 1074 | if (MSDOS_SB(sb)->options.name_check != 's') |
| 1075 | sb->s_root->d_op = &vfat_ci_dentry_ops; | 1075 | d_set_d_op(sb->s_root, &vfat_ci_dentry_ops); |
| 1076 | else | 1076 | else |
| 1077 | sb->s_root->d_op = &vfat_dentry_ops; | 1077 | d_set_d_op(sb->s_root, &vfat_dentry_ops); |
| 1078 | 1078 | ||
| 1079 | unlock_super(sb); | 1079 | unlock_super(sb); |
| 1080 | return 0; | 1080 | return 0; |
diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index c9627c95482d..c9a8a426a395 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c | |||
| @@ -347,7 +347,7 @@ static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry, | |||
| 347 | } | 347 | } |
| 348 | 348 | ||
| 349 | entry = newent ? newent : entry; | 349 | entry = newent ? newent : entry; |
| 350 | entry->d_op = &fuse_dentry_operations; | 350 | d_set_d_op(entry, &fuse_dentry_operations); |
| 351 | if (outarg_valid) | 351 | if (outarg_valid) |
| 352 | fuse_change_entry_timeout(entry, &outarg); | 352 | fuse_change_entry_timeout(entry, &outarg); |
| 353 | else | 353 | else |
diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index 44e0a6c57e87..a8b31da19b93 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c | |||
| @@ -626,7 +626,7 @@ static struct dentry *fuse_get_dentry(struct super_block *sb, | |||
| 626 | 626 | ||
| 627 | entry = d_obtain_alias(inode); | 627 | entry = d_obtain_alias(inode); |
| 628 | if (!IS_ERR(entry) && get_node_id(inode) != FUSE_ROOT_ID) { | 628 | if (!IS_ERR(entry) && get_node_id(inode) != FUSE_ROOT_ID) { |
| 629 | entry->d_op = &fuse_dentry_operations; | 629 | d_set_d_op(entry, &fuse_dentry_operations); |
| 630 | fuse_invalidate_entry_cache(entry); | 630 | fuse_invalidate_entry_cache(entry); |
| 631 | } | 631 | } |
| 632 | 632 | ||
| @@ -728,7 +728,7 @@ static struct dentry *fuse_get_parent(struct dentry *child) | |||
| 728 | 728 | ||
| 729 | parent = d_obtain_alias(inode); | 729 | parent = d_obtain_alias(inode); |
| 730 | if (!IS_ERR(parent) && get_node_id(inode) != FUSE_ROOT_ID) { | 730 | if (!IS_ERR(parent) && get_node_id(inode) != FUSE_ROOT_ID) { |
| 731 | parent->d_op = &fuse_dentry_operations; | 731 | d_set_d_op(parent, &fuse_dentry_operations); |
| 732 | fuse_invalidate_entry_cache(parent); | 732 | fuse_invalidate_entry_cache(parent); |
| 733 | } | 733 | } |
| 734 | 734 | ||
diff --git a/fs/gfs2/export.c b/fs/gfs2/export.c index 5ab3839dfcb9..97012ecff560 100644 --- a/fs/gfs2/export.c +++ b/fs/gfs2/export.c | |||
| @@ -130,7 +130,7 @@ static struct dentry *gfs2_get_parent(struct dentry *child) | |||
| 130 | 130 | ||
| 131 | dentry = d_obtain_alias(gfs2_lookupi(child->d_inode, &gfs2_qdotdot, 1)); | 131 | dentry = d_obtain_alias(gfs2_lookupi(child->d_inode, &gfs2_qdotdot, 1)); |
| 132 | if (!IS_ERR(dentry)) | 132 | if (!IS_ERR(dentry)) |
| 133 | dentry->d_op = &gfs2_dops; | 133 | d_set_d_op(dentry, &gfs2_dops); |
| 134 | return dentry; | 134 | return dentry; |
| 135 | } | 135 | } |
| 136 | 136 | ||
| @@ -158,7 +158,7 @@ static struct dentry *gfs2_get_dentry(struct super_block *sb, | |||
| 158 | out_inode: | 158 | out_inode: |
| 159 | dentry = d_obtain_alias(inode); | 159 | dentry = d_obtain_alias(inode); |
| 160 | if (!IS_ERR(dentry)) | 160 | if (!IS_ERR(dentry)) |
| 161 | dentry->d_op = &gfs2_dops; | 161 | d_set_d_op(dentry, &gfs2_dops); |
| 162 | return dentry; | 162 | return dentry; |
| 163 | } | 163 | } |
| 164 | 164 | ||
diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c index 3eb1393f7b81..2aeabd4218cc 100644 --- a/fs/gfs2/ops_fstype.c +++ b/fs/gfs2/ops_fstype.c | |||
| @@ -440,7 +440,7 @@ static int gfs2_lookup_root(struct super_block *sb, struct dentry **dptr, | |||
| 440 | iput(inode); | 440 | iput(inode); |
| 441 | return -ENOMEM; | 441 | return -ENOMEM; |
| 442 | } | 442 | } |
| 443 | dentry->d_op = &gfs2_dops; | 443 | d_set_d_op(dentry, &gfs2_dops); |
| 444 | *dptr = dentry; | 444 | *dptr = dentry; |
| 445 | return 0; | 445 | return 0; |
| 446 | } | 446 | } |
diff --git a/fs/gfs2/ops_inode.c b/fs/gfs2/ops_inode.c index 12cbea7502c2..f28f89796f4d 100644 --- a/fs/gfs2/ops_inode.c +++ b/fs/gfs2/ops_inode.c | |||
| @@ -106,7 +106,7 @@ static struct dentry *gfs2_lookup(struct inode *dir, struct dentry *dentry, | |||
| 106 | { | 106 | { |
| 107 | struct inode *inode = NULL; | 107 | struct inode *inode = NULL; |
| 108 | 108 | ||
| 109 | dentry->d_op = &gfs2_dops; | 109 | d_set_d_op(dentry, &gfs2_dops); |
| 110 | 110 | ||
| 111 | inode = gfs2_lookupi(dir, &dentry->d_name, 0); | 111 | inode = gfs2_lookupi(dir, &dentry->d_name, 0); |
| 112 | if (inode && IS_ERR(inode)) | 112 | if (inode && IS_ERR(inode)) |
diff --git a/fs/hfs/dir.c b/fs/hfs/dir.c index 2b3b8611b41b..ea4aefe7c652 100644 --- a/fs/hfs/dir.c +++ b/fs/hfs/dir.c | |||
| @@ -25,7 +25,7 @@ static struct dentry *hfs_lookup(struct inode *dir, struct dentry *dentry, | |||
| 25 | struct inode *inode = NULL; | 25 | struct inode *inode = NULL; |
| 26 | int res; | 26 | int res; |
| 27 | 27 | ||
| 28 | dentry->d_op = &hfs_dentry_operations; | 28 | d_set_d_op(dentry, &hfs_dentry_operations); |
| 29 | 29 | ||
| 30 | hfs_find_init(HFS_SB(dir->i_sb)->cat_tree, &fd); | 30 | hfs_find_init(HFS_SB(dir->i_sb)->cat_tree, &fd); |
| 31 | hfs_cat_build_key(dir->i_sb, fd.search_key, dir->i_ino, &dentry->d_name); | 31 | hfs_cat_build_key(dir->i_sb, fd.search_key, dir->i_ino, &dentry->d_name); |
diff --git a/fs/hfs/super.c b/fs/hfs/super.c index ef4ee5716abe..0bef62aa4f42 100644 --- a/fs/hfs/super.c +++ b/fs/hfs/super.c | |||
| @@ -434,7 +434,7 @@ static int hfs_fill_super(struct super_block *sb, void *data, int silent) | |||
| 434 | if (!sb->s_root) | 434 | if (!sb->s_root) |
| 435 | goto bail_iput; | 435 | goto bail_iput; |
| 436 | 436 | ||
| 437 | sb->s_root->d_op = &hfs_dentry_operations; | 437 | d_set_d_op(sb->s_root, &hfs_dentry_operations); |
| 438 | 438 | ||
| 439 | /* everything's okay */ | 439 | /* everything's okay */ |
| 440 | return 0; | 440 | return 0; |
diff --git a/fs/hfsplus/dir.c b/fs/hfsplus/dir.c index 9d59c0571f59..ccab87145f7a 100644 --- a/fs/hfsplus/dir.c +++ b/fs/hfsplus/dir.c | |||
| @@ -37,7 +37,7 @@ static struct dentry *hfsplus_lookup(struct inode *dir, struct dentry *dentry, | |||
| 37 | 37 | ||
| 38 | sb = dir->i_sb; | 38 | sb = dir->i_sb; |
| 39 | 39 | ||
| 40 | dentry->d_op = &hfsplus_dentry_operations; | 40 | d_set_d_op(dentry, &hfsplus_dentry_operations); |
| 41 | dentry->d_fsdata = NULL; | 41 | dentry->d_fsdata = NULL; |
| 42 | hfs_find_init(HFSPLUS_SB(sb)->cat_tree, &fd); | 42 | hfs_find_init(HFSPLUS_SB(sb)->cat_tree, &fd); |
| 43 | hfsplus_cat_build_key(sb, fd.search_key, dir->i_ino, &dentry->d_name); | 43 | hfsplus_cat_build_key(sb, fd.search_key, dir->i_ino, &dentry->d_name); |
diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c index 182e83a9079e..ddf712e4700e 100644 --- a/fs/hfsplus/super.c +++ b/fs/hfsplus/super.c | |||
| @@ -419,7 +419,7 @@ static int hfsplus_fill_super(struct super_block *sb, void *data, int silent) | |||
| 419 | err = -ENOMEM; | 419 | err = -ENOMEM; |
| 420 | goto cleanup; | 420 | goto cleanup; |
| 421 | } | 421 | } |
| 422 | sb->s_root->d_op = &hfsplus_dentry_operations; | 422 | d_set_d_op(sb->s_root, &hfsplus_dentry_operations); |
| 423 | 423 | ||
| 424 | str.len = sizeof(HFSP_HIDDENDIR_NAME) - 1; | 424 | str.len = sizeof(HFSP_HIDDENDIR_NAME) - 1; |
| 425 | str.name = HFSP_HIDDENDIR_NAME; | 425 | str.name = HFSP_HIDDENDIR_NAME; |
diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c index 861113fcfc88..0bc81cf256b8 100644 --- a/fs/hostfs/hostfs_kern.c +++ b/fs/hostfs/hostfs_kern.c | |||
| @@ -612,7 +612,7 @@ struct dentry *hostfs_lookup(struct inode *ino, struct dentry *dentry, | |||
| 612 | goto out_put; | 612 | goto out_put; |
| 613 | 613 | ||
| 614 | d_add(dentry, inode); | 614 | d_add(dentry, inode); |
| 615 | dentry->d_op = &hostfs_dentry_ops; | 615 | d_set_d_op(dentry, &hostfs_dentry_ops); |
| 616 | return NULL; | 616 | return NULL; |
| 617 | 617 | ||
| 618 | out_put: | 618 | out_put: |
diff --git a/fs/hpfs/dentry.c b/fs/hpfs/dentry.c index 35526df1fd32..32c13a94e1e9 100644 --- a/fs/hpfs/dentry.c +++ b/fs/hpfs/dentry.c | |||
| @@ -65,5 +65,5 @@ static const struct dentry_operations hpfs_dentry_operations = { | |||
| 65 | 65 | ||
| 66 | void hpfs_set_dentry_operations(struct dentry *dentry) | 66 | void hpfs_set_dentry_operations(struct dentry *dentry) |
| 67 | { | 67 | { |
| 68 | dentry->d_op = &hpfs_dentry_operations; | 68 | d_set_d_op(dentry, &hpfs_dentry_operations); |
| 69 | } | 69 | } |
diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c index d8f3a652243d..844a7903c72f 100644 --- a/fs/isofs/inode.c +++ b/fs/isofs/inode.c | |||
| @@ -949,7 +949,7 @@ root_found: | |||
| 949 | table += 2; | 949 | table += 2; |
| 950 | if (opt.check == 'r') | 950 | if (opt.check == 'r') |
| 951 | table++; | 951 | table++; |
| 952 | s->s_root->d_op = &isofs_dentry_ops[table]; | 952 | d_set_d_op(s->s_root, &isofs_dentry_ops[table]); |
| 953 | 953 | ||
| 954 | kfree(opt.iocharset); | 954 | kfree(opt.iocharset); |
| 955 | 955 | ||
diff --git a/fs/isofs/namei.c b/fs/isofs/namei.c index 715f7d318046..679a849c3b27 100644 --- a/fs/isofs/namei.c +++ b/fs/isofs/namei.c | |||
| @@ -172,7 +172,7 @@ struct dentry *isofs_lookup(struct inode *dir, struct dentry *dentry, struct nam | |||
| 172 | struct inode *inode; | 172 | struct inode *inode; |
| 173 | struct page *page; | 173 | struct page *page; |
| 174 | 174 | ||
| 175 | dentry->d_op = dir->i_sb->s_root->d_op; | 175 | d_set_d_op(dentry, dir->i_sb->s_root->d_op); |
| 176 | 176 | ||
| 177 | page = alloc_page(GFP_USER); | 177 | page = alloc_page(GFP_USER); |
| 178 | if (!page) | 178 | if (!page) |
diff --git a/fs/jfs/namei.c b/fs/jfs/namei.c index 57f90dad8919..a151cbdec626 100644 --- a/fs/jfs/namei.c +++ b/fs/jfs/namei.c | |||
| @@ -1466,7 +1466,7 @@ static struct dentry *jfs_lookup(struct inode *dip, struct dentry *dentry, struc | |||
| 1466 | jfs_info("jfs_lookup: name = %s", name); | 1466 | jfs_info("jfs_lookup: name = %s", name); |
| 1467 | 1467 | ||
| 1468 | if (JFS_SBI(dip->i_sb)->mntflag & JFS_OS2) | 1468 | if (JFS_SBI(dip->i_sb)->mntflag & JFS_OS2) |
| 1469 | dentry->d_op = &jfs_ci_dentry_operations; | 1469 | d_set_d_op(dentry, &jfs_ci_dentry_operations); |
| 1470 | 1470 | ||
| 1471 | if ((name[0] == '.') && (len == 1)) | 1471 | if ((name[0] == '.') && (len == 1)) |
| 1472 | inum = dip->i_ino; | 1472 | inum = dip->i_ino; |
| @@ -1495,7 +1495,7 @@ static struct dentry *jfs_lookup(struct inode *dip, struct dentry *dentry, struc | |||
| 1495 | dentry = d_splice_alias(ip, dentry); | 1495 | dentry = d_splice_alias(ip, dentry); |
| 1496 | 1496 | ||
| 1497 | if (dentry && (JFS_SBI(dip->i_sb)->mntflag & JFS_OS2)) | 1497 | if (dentry && (JFS_SBI(dip->i_sb)->mntflag & JFS_OS2)) |
| 1498 | dentry->d_op = &jfs_ci_dentry_operations; | 1498 | d_set_d_op(dentry, &jfs_ci_dentry_operations); |
| 1499 | 1499 | ||
| 1500 | return dentry; | 1500 | return dentry; |
| 1501 | } | 1501 | } |
diff --git a/fs/jfs/super.c b/fs/jfs/super.c index b715b0f7bdfd..3150d766e0d4 100644 --- a/fs/jfs/super.c +++ b/fs/jfs/super.c | |||
| @@ -525,7 +525,7 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent) | |||
| 525 | goto out_no_root; | 525 | goto out_no_root; |
| 526 | 526 | ||
| 527 | if (sbi->mntflag & JFS_OS2) | 527 | if (sbi->mntflag & JFS_OS2) |
| 528 | sb->s_root->d_op = &jfs_ci_dentry_operations; | 528 | d_set_d_op(sb->s_root, &jfs_ci_dentry_operations); |
| 529 | 529 | ||
| 530 | /* logical blocks are represented by 40 bits in pxd_t, etc. */ | 530 | /* logical blocks are represented by 40 bits in pxd_t, etc. */ |
| 531 | sb->s_maxbytes = ((u64) sb->s_blocksize) << 40; | 531 | sb->s_maxbytes = ((u64) sb->s_blocksize) << 40; |
diff --git a/fs/libfs.c b/fs/libfs.c index 28b36663c44e..889311e3d06b 100644 --- a/fs/libfs.c +++ b/fs/libfs.c | |||
| @@ -59,7 +59,7 @@ struct dentry *simple_lookup(struct inode *dir, struct dentry *dentry, struct na | |||
| 59 | 59 | ||
| 60 | if (dentry->d_name.len > NAME_MAX) | 60 | if (dentry->d_name.len > NAME_MAX) |
| 61 | return ERR_PTR(-ENAMETOOLONG); | 61 | return ERR_PTR(-ENAMETOOLONG); |
| 62 | dentry->d_op = &simple_dentry_operations; | 62 | d_set_d_op(dentry, &simple_dentry_operations); |
| 63 | d_add(dentry, NULL); | 63 | d_add(dentry, NULL); |
| 64 | return NULL; | 64 | return NULL; |
| 65 | } | 65 | } |
diff --git a/fs/minix/namei.c b/fs/minix/namei.c index c0d35a3accef..1b9e07728a9f 100644 --- a/fs/minix/namei.c +++ b/fs/minix/namei.c | |||
| @@ -23,7 +23,7 @@ static struct dentry *minix_lookup(struct inode * dir, struct dentry *dentry, st | |||
| 23 | struct inode * inode = NULL; | 23 | struct inode * inode = NULL; |
| 24 | ino_t ino; | 24 | ino_t ino; |
| 25 | 25 | ||
| 26 | dentry->d_op = dir->i_sb->s_root->d_op; | 26 | d_set_d_op(dentry, dir->i_sb->s_root->d_op); |
| 27 | 27 | ||
| 28 | if (dentry->d_name.len > minix_sb(dir->i_sb)->s_namelen) | 28 | if (dentry->d_name.len > minix_sb(dir->i_sb)->s_namelen) |
| 29 | return ERR_PTR(-ENAMETOOLONG); | 29 | return ERR_PTR(-ENAMETOOLONG); |
diff --git a/fs/namei.c b/fs/namei.c index c731b50a6184..90bd2873e117 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
| @@ -587,6 +587,17 @@ do_revalidate(struct dentry *dentry, struct nameidata *nd) | |||
| 587 | return dentry; | 587 | return dentry; |
| 588 | } | 588 | } |
| 589 | 589 | ||
| 590 | static inline int need_reval_dot(struct dentry *dentry) | ||
| 591 | { | ||
| 592 | if (likely(!(dentry->d_flags & DCACHE_OP_REVALIDATE))) | ||
| 593 | return 0; | ||
| 594 | |||
| 595 | if (likely(!(dentry->d_sb->s_type->fs_flags & FS_REVAL_DOT))) | ||
| 596 | return 0; | ||
| 597 | |||
| 598 | return 1; | ||
| 599 | } | ||
| 600 | |||
| 590 | /* | 601 | /* |
| 591 | * force_reval_path - force revalidation of a dentry | 602 | * force_reval_path - force revalidation of a dentry |
| 592 | * | 603 | * |
| @@ -610,10 +621,9 @@ force_reval_path(struct path *path, struct nameidata *nd) | |||
| 610 | 621 | ||
| 611 | /* | 622 | /* |
| 612 | * only check on filesystems where it's possible for the dentry to | 623 | * only check on filesystems where it's possible for the dentry to |
| 613 | * become stale. It's assumed that if this flag is set then the | 624 | * become stale. |
| 614 | * d_revalidate op will also be defined. | ||
| 615 | */ | 625 | */ |
| 616 | if (!(dentry->d_sb->s_type->fs_flags & FS_REVAL_DOT)) | 626 | if (!need_reval_dot(dentry)) |
| 617 | return 0; | 627 | return 0; |
| 618 | 628 | ||
| 619 | status = dentry->d_op->d_revalidate(dentry, nd); | 629 | status = dentry->d_op->d_revalidate(dentry, nd); |
| @@ -1003,7 +1013,7 @@ static int do_lookup(struct nameidata *nd, struct qstr *name, | |||
| 1003 | * See if the low-level filesystem might want | 1013 | * See if the low-level filesystem might want |
| 1004 | * to use its own hash.. | 1014 | * to use its own hash.. |
| 1005 | */ | 1015 | */ |
| 1006 | if (parent->d_op && parent->d_op->d_hash) { | 1016 | if (unlikely(parent->d_flags & DCACHE_OP_HASH)) { |
| 1007 | int err = parent->d_op->d_hash(parent, nd->inode, name); | 1017 | int err = parent->d_op->d_hash(parent, nd->inode, name); |
| 1008 | if (err < 0) | 1018 | if (err < 0) |
| 1009 | return err; | 1019 | return err; |
| @@ -1029,7 +1039,7 @@ static int do_lookup(struct nameidata *nd, struct qstr *name, | |||
| 1029 | return -ECHILD; | 1039 | return -ECHILD; |
| 1030 | 1040 | ||
| 1031 | nd->seq = seq; | 1041 | nd->seq = seq; |
| 1032 | if (dentry->d_op && dentry->d_op->d_revalidate) { | 1042 | if (dentry->d_flags & DCACHE_OP_REVALIDATE) { |
| 1033 | /* We commonly drop rcu-walk here */ | 1043 | /* We commonly drop rcu-walk here */ |
| 1034 | if (nameidata_dentry_drop_rcu(nd, dentry)) | 1044 | if (nameidata_dentry_drop_rcu(nd, dentry)) |
| 1035 | return -ECHILD; | 1045 | return -ECHILD; |
| @@ -1043,7 +1053,7 @@ static int do_lookup(struct nameidata *nd, struct qstr *name, | |||
| 1043 | if (!dentry) | 1053 | if (!dentry) |
| 1044 | goto need_lookup; | 1054 | goto need_lookup; |
| 1045 | found: | 1055 | found: |
| 1046 | if (dentry->d_op && dentry->d_op->d_revalidate) | 1056 | if (dentry->d_flags & DCACHE_OP_REVALIDATE) |
| 1047 | goto need_revalidate; | 1057 | goto need_revalidate; |
| 1048 | done: | 1058 | done: |
| 1049 | path->mnt = mnt; | 1059 | path->mnt = mnt; |
| @@ -1281,8 +1291,7 @@ return_reval: | |||
| 1281 | * We bypassed the ordinary revalidation routines. | 1291 | * We bypassed the ordinary revalidation routines. |
| 1282 | * We may need to check the cached dentry for staleness. | 1292 | * We may need to check the cached dentry for staleness. |
| 1283 | */ | 1293 | */ |
| 1284 | if (nd->path.dentry && nd->path.dentry->d_sb && | 1294 | if (need_reval_dot(nd->path.dentry)) { |
| 1285 | (nd->path.dentry->d_sb->s_type->fs_flags & FS_REVAL_DOT)) { | ||
| 1286 | if (nameidata_drop_rcu_maybe(nd)) | 1295 | if (nameidata_drop_rcu_maybe(nd)) |
| 1287 | return -ECHILD; | 1296 | return -ECHILD; |
| 1288 | err = -ESTALE; | 1297 | err = -ESTALE; |
| @@ -1602,7 +1611,7 @@ static struct dentry *__lookup_hash(struct qstr *name, | |||
| 1602 | * See if the low-level filesystem might want | 1611 | * See if the low-level filesystem might want |
| 1603 | * to use its own hash.. | 1612 | * to use its own hash.. |
| 1604 | */ | 1613 | */ |
| 1605 | if (base->d_op && base->d_op->d_hash) { | 1614 | if (base->d_flags & DCACHE_OP_HASH) { |
| 1606 | err = base->d_op->d_hash(base, inode, name); | 1615 | err = base->d_op->d_hash(base, inode, name); |
| 1607 | dentry = ERR_PTR(err); | 1616 | dentry = ERR_PTR(err); |
| 1608 | if (err < 0) | 1617 | if (err < 0) |
| @@ -1616,7 +1625,7 @@ static struct dentry *__lookup_hash(struct qstr *name, | |||
| 1616 | */ | 1625 | */ |
| 1617 | dentry = d_lookup(base, name); | 1626 | dentry = d_lookup(base, name); |
| 1618 | 1627 | ||
| 1619 | if (dentry && dentry->d_op && dentry->d_op->d_revalidate) | 1628 | if (dentry && (dentry->d_flags & DCACHE_OP_REVALIDATE)) |
| 1620 | dentry = do_revalidate(dentry, nd); | 1629 | dentry = do_revalidate(dentry, nd); |
| 1621 | 1630 | ||
| 1622 | if (!dentry) | 1631 | if (!dentry) |
| @@ -2070,7 +2079,7 @@ static struct file *do_last(struct nameidata *nd, struct path *path, | |||
| 2070 | follow_dotdot(nd); | 2079 | follow_dotdot(nd); |
| 2071 | dir = nd->path.dentry; | 2080 | dir = nd->path.dentry; |
| 2072 | case LAST_DOT: | 2081 | case LAST_DOT: |
| 2073 | if (nd->path.mnt->mnt_sb->s_type->fs_flags & FS_REVAL_DOT) { | 2082 | if (need_reval_dot(dir)) { |
| 2074 | if (!dir->d_op->d_revalidate(dir, nd)) { | 2083 | if (!dir->d_op->d_revalidate(dir, nd)) { |
| 2075 | error = -ESTALE; | 2084 | error = -ESTALE; |
| 2076 | goto exit; | 2085 | goto exit; |
diff --git a/fs/ncpfs/dir.c b/fs/ncpfs/dir.c index 0ba3cdc95a44..4b9cbb28d7fa 100644 --- a/fs/ncpfs/dir.c +++ b/fs/ncpfs/dir.c | |||
| @@ -633,7 +633,7 @@ ncp_fill_cache(struct file *filp, void *dirent, filldir_t filldir, | |||
| 633 | entry->ino = iunique(dir->i_sb, 2); | 633 | entry->ino = iunique(dir->i_sb, 2); |
| 634 | inode = ncp_iget(dir->i_sb, entry); | 634 | inode = ncp_iget(dir->i_sb, entry); |
| 635 | if (inode) { | 635 | if (inode) { |
| 636 | newdent->d_op = &ncp_dentry_operations; | 636 | d_set_d_op(newdent, &ncp_dentry_operations); |
| 637 | d_instantiate(newdent, inode); | 637 | d_instantiate(newdent, inode); |
| 638 | if (!hashed) | 638 | if (!hashed) |
| 639 | d_rehash(newdent); | 639 | d_rehash(newdent); |
| @@ -889,7 +889,7 @@ static struct dentry *ncp_lookup(struct inode *dir, struct dentry *dentry, struc | |||
| 889 | if (inode) { | 889 | if (inode) { |
| 890 | ncp_new_dentry(dentry); | 890 | ncp_new_dentry(dentry); |
| 891 | add_entry: | 891 | add_entry: |
| 892 | dentry->d_op = &ncp_dentry_operations; | 892 | d_set_d_op(dentry, &ncp_dentry_operations); |
| 893 | d_add(dentry, inode); | 893 | d_add(dentry, inode); |
| 894 | error = 0; | 894 | error = 0; |
| 895 | } | 895 | } |
diff --git a/fs/ncpfs/inode.c b/fs/ncpfs/inode.c index 60047dbeb38d..0c75a5f3cafd 100644 --- a/fs/ncpfs/inode.c +++ b/fs/ncpfs/inode.c | |||
| @@ -717,7 +717,7 @@ static int ncp_fill_super(struct super_block *sb, void *raw_data, int silent) | |||
| 717 | sb->s_root = d_alloc_root(root_inode); | 717 | sb->s_root = d_alloc_root(root_inode); |
| 718 | if (!sb->s_root) | 718 | if (!sb->s_root) |
| 719 | goto out_no_root; | 719 | goto out_no_root; |
| 720 | sb->s_root->d_op = &ncp_root_dentry_operations; | 720 | d_set_d_op(sb->s_root, &ncp_root_dentry_operations); |
| 721 | return 0; | 721 | return 0; |
| 722 | 722 | ||
| 723 | out_no_root: | 723 | out_no_root: |
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index eb77471b8823..37e0a8bb077e 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c | |||
| @@ -438,7 +438,7 @@ void nfs_prime_dcache(struct dentry *parent, struct nfs_entry *entry) | |||
| 438 | if (dentry == NULL) | 438 | if (dentry == NULL) |
| 439 | return; | 439 | return; |
| 440 | 440 | ||
| 441 | dentry->d_op = NFS_PROTO(dir)->dentry_ops; | 441 | d_set_d_op(dentry, NFS_PROTO(dir)->dentry_ops); |
| 442 | inode = nfs_fhget(dentry->d_sb, entry->fh, entry->fattr); | 442 | inode = nfs_fhget(dentry->d_sb, entry->fh, entry->fattr); |
| 443 | if (IS_ERR(inode)) | 443 | if (IS_ERR(inode)) |
| 444 | goto out; | 444 | goto out; |
| @@ -1188,7 +1188,7 @@ static struct dentry *nfs_lookup(struct inode *dir, struct dentry * dentry, stru | |||
| 1188 | if (dentry->d_name.len > NFS_SERVER(dir)->namelen) | 1188 | if (dentry->d_name.len > NFS_SERVER(dir)->namelen) |
| 1189 | goto out; | 1189 | goto out; |
| 1190 | 1190 | ||
| 1191 | dentry->d_op = NFS_PROTO(dir)->dentry_ops; | 1191 | d_set_d_op(dentry, NFS_PROTO(dir)->dentry_ops); |
| 1192 | 1192 | ||
| 1193 | /* | 1193 | /* |
| 1194 | * If we're doing an exclusive create, optimize away the lookup | 1194 | * If we're doing an exclusive create, optimize away the lookup |
| @@ -1333,7 +1333,7 @@ static struct dentry *nfs_atomic_lookup(struct inode *dir, struct dentry *dentry | |||
| 1333 | res = ERR_PTR(-ENAMETOOLONG); | 1333 | res = ERR_PTR(-ENAMETOOLONG); |
| 1334 | goto out; | 1334 | goto out; |
| 1335 | } | 1335 | } |
| 1336 | dentry->d_op = NFS_PROTO(dir)->dentry_ops; | 1336 | d_set_d_op(dentry, NFS_PROTO(dir)->dentry_ops); |
| 1337 | 1337 | ||
| 1338 | /* Let vfs_create() deal with O_EXCL. Instantiate, but don't hash | 1338 | /* Let vfs_create() deal with O_EXCL. Instantiate, but don't hash |
| 1339 | * the dentry. */ | 1339 | * the dentry. */ |
diff --git a/fs/nfs/getroot.c b/fs/nfs/getroot.c index b3e36c3430de..c3a5a1126833 100644 --- a/fs/nfs/getroot.c +++ b/fs/nfs/getroot.c | |||
| @@ -121,7 +121,7 @@ struct dentry *nfs_get_root(struct super_block *sb, struct nfs_fh *mntfh) | |||
| 121 | security_d_instantiate(ret, inode); | 121 | security_d_instantiate(ret, inode); |
| 122 | 122 | ||
| 123 | if (ret->d_op == NULL) | 123 | if (ret->d_op == NULL) |
| 124 | ret->d_op = server->nfs_client->rpc_ops->dentry_ops; | 124 | d_set_d_op(ret, server->nfs_client->rpc_ops->dentry_ops); |
| 125 | out: | 125 | out: |
| 126 | nfs_free_fattr(fsinfo.fattr); | 126 | nfs_free_fattr(fsinfo.fattr); |
| 127 | return ret; | 127 | return ret; |
| @@ -228,7 +228,7 @@ struct dentry *nfs4_get_root(struct super_block *sb, struct nfs_fh *mntfh) | |||
| 228 | security_d_instantiate(ret, inode); | 228 | security_d_instantiate(ret, inode); |
| 229 | 229 | ||
| 230 | if (ret->d_op == NULL) | 230 | if (ret->d_op == NULL) |
| 231 | ret->d_op = server->nfs_client->rpc_ops->dentry_ops; | 231 | d_set_d_op(ret, server->nfs_client->rpc_ops->dentry_ops); |
| 232 | 232 | ||
| 233 | out: | 233 | out: |
| 234 | nfs_free_fattr(fattr); | 234 | nfs_free_fattr(fattr); |
diff --git a/fs/ocfs2/export.c b/fs/ocfs2/export.c index 19ad145d2af3..6adafa576065 100644 --- a/fs/ocfs2/export.c +++ b/fs/ocfs2/export.c | |||
| @@ -138,7 +138,7 @@ check_gen: | |||
| 138 | 138 | ||
| 139 | result = d_obtain_alias(inode); | 139 | result = d_obtain_alias(inode); |
| 140 | if (!IS_ERR(result)) | 140 | if (!IS_ERR(result)) |
| 141 | result->d_op = &ocfs2_dentry_ops; | 141 | d_set_d_op(result, &ocfs2_dentry_ops); |
| 142 | else | 142 | else |
| 143 | mlog_errno(PTR_ERR(result)); | 143 | mlog_errno(PTR_ERR(result)); |
| 144 | 144 | ||
| @@ -176,7 +176,7 @@ static struct dentry *ocfs2_get_parent(struct dentry *child) | |||
| 176 | 176 | ||
| 177 | parent = d_obtain_alias(ocfs2_iget(OCFS2_SB(dir->i_sb), blkno, 0, 0)); | 177 | parent = d_obtain_alias(ocfs2_iget(OCFS2_SB(dir->i_sb), blkno, 0, 0)); |
| 178 | if (!IS_ERR(parent)) | 178 | if (!IS_ERR(parent)) |
| 179 | parent->d_op = &ocfs2_dentry_ops; | 179 | d_set_d_op(parent, &ocfs2_dentry_ops); |
| 180 | 180 | ||
| 181 | bail_unlock: | 181 | bail_unlock: |
| 182 | ocfs2_inode_unlock(dir, 0); | 182 | ocfs2_inode_unlock(dir, 0); |
diff --git a/fs/ocfs2/namei.c b/fs/ocfs2/namei.c index ff5744e1e36f..d14cad6e2e41 100644 --- a/fs/ocfs2/namei.c +++ b/fs/ocfs2/namei.c | |||
| @@ -147,7 +147,7 @@ static struct dentry *ocfs2_lookup(struct inode *dir, struct dentry *dentry, | |||
| 147 | spin_unlock(&oi->ip_lock); | 147 | spin_unlock(&oi->ip_lock); |
| 148 | 148 | ||
| 149 | bail_add: | 149 | bail_add: |
| 150 | dentry->d_op = &ocfs2_dentry_ops; | 150 | d_set_d_op(dentry, &ocfs2_dentry_ops); |
| 151 | ret = d_splice_alias(inode, dentry); | 151 | ret = d_splice_alias(inode, dentry); |
| 152 | 152 | ||
| 153 | if (inode) { | 153 | if (inode) { |
| @@ -415,7 +415,7 @@ static int ocfs2_mknod(struct inode *dir, | |||
| 415 | mlog_errno(status); | 415 | mlog_errno(status); |
| 416 | goto leave; | 416 | goto leave; |
| 417 | } | 417 | } |
| 418 | dentry->d_op = &ocfs2_dentry_ops; | 418 | d_set_d_op(dentry, &ocfs2_dentry_ops); |
| 419 | 419 | ||
| 420 | status = ocfs2_add_entry(handle, dentry, inode, | 420 | status = ocfs2_add_entry(handle, dentry, inode, |
| 421 | OCFS2_I(inode)->ip_blkno, parent_fe_bh, | 421 | OCFS2_I(inode)->ip_blkno, parent_fe_bh, |
| @@ -743,7 +743,7 @@ static int ocfs2_link(struct dentry *old_dentry, | |||
| 743 | } | 743 | } |
| 744 | 744 | ||
| 745 | ihold(inode); | 745 | ihold(inode); |
| 746 | dentry->d_op = &ocfs2_dentry_ops; | 746 | d_set_d_op(dentry, &ocfs2_dentry_ops); |
| 747 | d_instantiate(dentry, inode); | 747 | d_instantiate(dentry, inode); |
| 748 | 748 | ||
| 749 | out_commit: | 749 | out_commit: |
| @@ -1794,7 +1794,7 @@ static int ocfs2_symlink(struct inode *dir, | |||
| 1794 | mlog_errno(status); | 1794 | mlog_errno(status); |
| 1795 | goto bail; | 1795 | goto bail; |
| 1796 | } | 1796 | } |
| 1797 | dentry->d_op = &ocfs2_dentry_ops; | 1797 | d_set_d_op(dentry, &ocfs2_dentry_ops); |
| 1798 | 1798 | ||
| 1799 | status = ocfs2_add_entry(handle, dentry, inode, | 1799 | status = ocfs2_add_entry(handle, dentry, inode, |
| 1800 | le64_to_cpu(fe->i_blkno), parent_fe_bh, | 1800 | le64_to_cpu(fe->i_blkno), parent_fe_bh, |
| @@ -2459,7 +2459,7 @@ int ocfs2_mv_orphaned_inode_to_new(struct inode *dir, | |||
| 2459 | goto out_commit; | 2459 | goto out_commit; |
| 2460 | } | 2460 | } |
| 2461 | 2461 | ||
| 2462 | dentry->d_op = &ocfs2_dentry_ops; | 2462 | d_set_d_op(dentry, &ocfs2_dentry_ops); |
| 2463 | d_instantiate(dentry, inode); | 2463 | d_instantiate(dentry, inode); |
| 2464 | status = 0; | 2464 | status = 0; |
| 2465 | out_commit: | 2465 | out_commit: |
| @@ -1004,7 +1004,7 @@ struct file *create_write_pipe(int flags) | |||
| 1004 | goto err_inode; | 1004 | goto err_inode; |
| 1005 | path.mnt = mntget(pipe_mnt); | 1005 | path.mnt = mntget(pipe_mnt); |
| 1006 | 1006 | ||
| 1007 | path.dentry->d_op = &pipefs_dentry_operations; | 1007 | d_set_d_op(path.dentry, &pipefs_dentry_operations); |
| 1008 | d_instantiate(path.dentry, inode); | 1008 | d_instantiate(path.dentry, inode); |
| 1009 | 1009 | ||
| 1010 | err = -ENFILE; | 1010 | err = -ENFILE; |
diff --git a/fs/proc/base.c b/fs/proc/base.c index d932fdb6a245..85f0a80912aa 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
| @@ -1969,7 +1969,7 @@ static struct dentry *proc_fd_instantiate(struct inode *dir, | |||
| 1969 | inode->i_op = &proc_pid_link_inode_operations; | 1969 | inode->i_op = &proc_pid_link_inode_operations; |
| 1970 | inode->i_size = 64; | 1970 | inode->i_size = 64; |
| 1971 | ei->op.proc_get_link = proc_fd_link; | 1971 | ei->op.proc_get_link = proc_fd_link; |
| 1972 | dentry->d_op = &tid_fd_dentry_operations; | 1972 | d_set_d_op(dentry, &tid_fd_dentry_operations); |
| 1973 | d_add(dentry, inode); | 1973 | d_add(dentry, inode); |
| 1974 | /* Close the race of the process dying before we return the dentry */ | 1974 | /* Close the race of the process dying before we return the dentry */ |
| 1975 | if (tid_fd_revalidate(dentry, NULL)) | 1975 | if (tid_fd_revalidate(dentry, NULL)) |
| @@ -2137,7 +2137,7 @@ static struct dentry *proc_fdinfo_instantiate(struct inode *dir, | |||
| 2137 | ei->fd = fd; | 2137 | ei->fd = fd; |
| 2138 | inode->i_mode = S_IFREG | S_IRUSR; | 2138 | inode->i_mode = S_IFREG | S_IRUSR; |
| 2139 | inode->i_fop = &proc_fdinfo_file_operations; | 2139 | inode->i_fop = &proc_fdinfo_file_operations; |
| 2140 | dentry->d_op = &tid_fd_dentry_operations; | 2140 | d_set_d_op(dentry, &tid_fd_dentry_operations); |
| 2141 | d_add(dentry, inode); | 2141 | d_add(dentry, inode); |
| 2142 | /* Close the race of the process dying before we return the dentry */ | 2142 | /* Close the race of the process dying before we return the dentry */ |
| 2143 | if (tid_fd_revalidate(dentry, NULL)) | 2143 | if (tid_fd_revalidate(dentry, NULL)) |
| @@ -2196,7 +2196,7 @@ static struct dentry *proc_pident_instantiate(struct inode *dir, | |||
| 2196 | if (p->fop) | 2196 | if (p->fop) |
| 2197 | inode->i_fop = p->fop; | 2197 | inode->i_fop = p->fop; |
| 2198 | ei->op = p->op; | 2198 | ei->op = p->op; |
| 2199 | dentry->d_op = &pid_dentry_operations; | 2199 | d_set_d_op(dentry, &pid_dentry_operations); |
| 2200 | d_add(dentry, inode); | 2200 | d_add(dentry, inode); |
| 2201 | /* Close the race of the process dying before we return the dentry */ | 2201 | /* Close the race of the process dying before we return the dentry */ |
| 2202 | if (pid_revalidate(dentry, NULL)) | 2202 | if (pid_revalidate(dentry, NULL)) |
| @@ -2615,7 +2615,7 @@ static struct dentry *proc_base_instantiate(struct inode *dir, | |||
| 2615 | if (p->fop) | 2615 | if (p->fop) |
| 2616 | inode->i_fop = p->fop; | 2616 | inode->i_fop = p->fop; |
| 2617 | ei->op = p->op; | 2617 | ei->op = p->op; |
| 2618 | dentry->d_op = &proc_base_dentry_operations; | 2618 | d_set_d_op(dentry, &proc_base_dentry_operations); |
| 2619 | d_add(dentry, inode); | 2619 | d_add(dentry, inode); |
| 2620 | error = NULL; | 2620 | error = NULL; |
| 2621 | out: | 2621 | out: |
| @@ -2926,7 +2926,7 @@ static struct dentry *proc_pid_instantiate(struct inode *dir, | |||
| 2926 | inode->i_nlink = 2 + pid_entry_count_dirs(tgid_base_stuff, | 2926 | inode->i_nlink = 2 + pid_entry_count_dirs(tgid_base_stuff, |
| 2927 | ARRAY_SIZE(tgid_base_stuff)); | 2927 | ARRAY_SIZE(tgid_base_stuff)); |
| 2928 | 2928 | ||
| 2929 | dentry->d_op = &pid_dentry_operations; | 2929 | d_set_d_op(dentry, &pid_dentry_operations); |
| 2930 | 2930 | ||
| 2931 | d_add(dentry, inode); | 2931 | d_add(dentry, inode); |
| 2932 | /* Close the race of the process dying before we return the dentry */ | 2932 | /* Close the race of the process dying before we return the dentry */ |
| @@ -3169,7 +3169,7 @@ static struct dentry *proc_task_instantiate(struct inode *dir, | |||
| 3169 | inode->i_nlink = 2 + pid_entry_count_dirs(tid_base_stuff, | 3169 | inode->i_nlink = 2 + pid_entry_count_dirs(tid_base_stuff, |
| 3170 | ARRAY_SIZE(tid_base_stuff)); | 3170 | ARRAY_SIZE(tid_base_stuff)); |
| 3171 | 3171 | ||
| 3172 | dentry->d_op = &pid_dentry_operations; | 3172 | d_set_d_op(dentry, &pid_dentry_operations); |
| 3173 | 3173 | ||
| 3174 | d_add(dentry, inode); | 3174 | d_add(dentry, inode); |
| 3175 | /* Close the race of the process dying before we return the dentry */ | 3175 | /* Close the race of the process dying before we return the dentry */ |
diff --git a/fs/proc/generic.c b/fs/proc/generic.c index 1d607be36d95..f766be29d2c7 100644 --- a/fs/proc/generic.c +++ b/fs/proc/generic.c | |||
| @@ -439,7 +439,7 @@ struct dentry *proc_lookup_de(struct proc_dir_entry *de, struct inode *dir, | |||
| 439 | out_unlock: | 439 | out_unlock: |
| 440 | 440 | ||
| 441 | if (inode) { | 441 | if (inode) { |
| 442 | dentry->d_op = &proc_dentry_operations; | 442 | d_set_d_op(dentry, &proc_dentry_operations); |
| 443 | d_add(dentry, inode); | 443 | d_add(dentry, inode); |
| 444 | return NULL; | 444 | return NULL; |
| 445 | } | 445 | } |
diff --git a/fs/proc/proc_sysctl.c b/fs/proc/proc_sysctl.c index 998e3a715bcc..35efd85a4d32 100644 --- a/fs/proc/proc_sysctl.c +++ b/fs/proc/proc_sysctl.c | |||
| @@ -120,7 +120,7 @@ static struct dentry *proc_sys_lookup(struct inode *dir, struct dentry *dentry, | |||
| 120 | goto out; | 120 | goto out; |
| 121 | 121 | ||
| 122 | err = NULL; | 122 | err = NULL; |
| 123 | dentry->d_op = &proc_sys_dentry_operations; | 123 | d_set_d_op(dentry, &proc_sys_dentry_operations); |
| 124 | d_add(dentry, inode); | 124 | d_add(dentry, inode); |
| 125 | 125 | ||
| 126 | out: | 126 | out: |
| @@ -201,7 +201,7 @@ static int proc_sys_fill_cache(struct file *filp, void *dirent, | |||
| 201 | dput(child); | 201 | dput(child); |
| 202 | return -ENOMEM; | 202 | return -ENOMEM; |
| 203 | } else { | 203 | } else { |
| 204 | child->d_op = &proc_sys_dentry_operations; | 204 | d_set_d_op(child, &proc_sys_dentry_operations); |
| 205 | d_add(child, inode); | 205 | d_add(child, inode); |
| 206 | } | 206 | } |
| 207 | } else { | 207 | } else { |
diff --git a/fs/reiserfs/xattr.c b/fs/reiserfs/xattr.c index 5d04a7828e7a..e0f0d7ea10a1 100644 --- a/fs/reiserfs/xattr.c +++ b/fs/reiserfs/xattr.c | |||
| @@ -990,7 +990,7 @@ int reiserfs_lookup_privroot(struct super_block *s) | |||
| 990 | strlen(PRIVROOT_NAME)); | 990 | strlen(PRIVROOT_NAME)); |
| 991 | if (!IS_ERR(dentry)) { | 991 | if (!IS_ERR(dentry)) { |
| 992 | REISERFS_SB(s)->priv_root = dentry; | 992 | REISERFS_SB(s)->priv_root = dentry; |
| 993 | dentry->d_op = &xattr_lookup_poison_ops; | 993 | d_set_d_op(dentry, &xattr_lookup_poison_ops); |
| 994 | if (dentry->d_inode) | 994 | if (dentry->d_inode) |
| 995 | dentry->d_inode->i_flags |= S_PRIVATE; | 995 | dentry->d_inode->i_flags |= S_PRIVATE; |
| 996 | } else | 996 | } else |
diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c index 27e1102e303e..3e076caa8daf 100644 --- a/fs/sysfs/dir.c +++ b/fs/sysfs/dir.c | |||
| @@ -701,7 +701,7 @@ static struct dentry * sysfs_lookup(struct inode *dir, struct dentry *dentry, | |||
| 701 | /* instantiate and hash dentry */ | 701 | /* instantiate and hash dentry */ |
| 702 | ret = d_find_alias(inode); | 702 | ret = d_find_alias(inode); |
| 703 | if (!ret) { | 703 | if (!ret) { |
| 704 | dentry->d_op = &sysfs_dentry_ops; | 704 | d_set_d_op(dentry, &sysfs_dentry_ops); |
| 705 | dentry->d_fsdata = sysfs_get(sd); | 705 | dentry->d_fsdata = sysfs_get(sd); |
| 706 | d_add(dentry, inode); | 706 | d_add(dentry, inode); |
| 707 | } else { | 707 | } else { |
diff --git a/fs/sysv/namei.c b/fs/sysv/namei.c index 7507aeb4c90e..b5e68da2db32 100644 --- a/fs/sysv/namei.c +++ b/fs/sysv/namei.c | |||
| @@ -48,7 +48,7 @@ static struct dentry *sysv_lookup(struct inode * dir, struct dentry * dentry, st | |||
| 48 | struct inode * inode = NULL; | 48 | struct inode * inode = NULL; |
| 49 | ino_t ino; | 49 | ino_t ino; |
| 50 | 50 | ||
| 51 | dentry->d_op = dir->i_sb->s_root->d_op; | 51 | d_set_d_op(dentry, dir->i_sb->s_root->d_op); |
| 52 | if (dentry->d_name.len > SYSV_NAMELEN) | 52 | if (dentry->d_name.len > SYSV_NAMELEN) |
| 53 | return ERR_PTR(-ENAMETOOLONG); | 53 | return ERR_PTR(-ENAMETOOLONG); |
| 54 | ino = sysv_inode_by_name(dentry); | 54 | ino = sysv_inode_by_name(dentry); |
diff --git a/fs/sysv/super.c b/fs/sysv/super.c index 3d9c62be0c10..76712aefc4ab 100644 --- a/fs/sysv/super.c +++ b/fs/sysv/super.c | |||
| @@ -346,7 +346,7 @@ static int complete_read_super(struct super_block *sb, int silent, int size) | |||
| 346 | if (sbi->s_forced_ro) | 346 | if (sbi->s_forced_ro) |
| 347 | sb->s_flags |= MS_RDONLY; | 347 | sb->s_flags |= MS_RDONLY; |
| 348 | if (sbi->s_truncate) | 348 | if (sbi->s_truncate) |
| 349 | sb->s_root->d_op = &sysv_dentry_operations; | 349 | d_set_d_op(sb->s_root, &sysv_dentry_operations); |
| 350 | return 1; | 350 | return 1; |
| 351 | } | 351 | } |
| 352 | 352 | ||
diff --git a/include/linux/dcache.h b/include/linux/dcache.h index e4414693065e..f4b40a751f09 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h | |||
| @@ -183,6 +183,11 @@ struct dentry_operations { | |||
| 183 | #define DCACHE_GENOCIDE 0x0200 | 183 | #define DCACHE_GENOCIDE 0x0200 |
| 184 | #define DCACHE_MOUNTED 0x0400 /* is a mountpoint */ | 184 | #define DCACHE_MOUNTED 0x0400 /* is a mountpoint */ |
| 185 | 185 | ||
| 186 | #define DCACHE_OP_HASH 0x1000 | ||
| 187 | #define DCACHE_OP_COMPARE 0x2000 | ||
| 188 | #define DCACHE_OP_REVALIDATE 0x4000 | ||
| 189 | #define DCACHE_OP_DELETE 0x8000 | ||
| 190 | |||
| 186 | 191 | ||
| 187 | extern spinlock_t dcache_inode_lock; | 192 | extern spinlock_t dcache_inode_lock; |
| 188 | extern seqlock_t rename_lock; | 193 | extern seqlock_t rename_lock; |
| @@ -201,6 +206,7 @@ extern struct dentry * d_materialise_unique(struct dentry *, struct inode *); | |||
| 201 | extern void __d_drop(struct dentry *dentry); | 206 | extern void __d_drop(struct dentry *dentry); |
| 202 | extern void d_drop(struct dentry *dentry); | 207 | extern void d_drop(struct dentry *dentry); |
| 203 | extern void d_delete(struct dentry *); | 208 | extern void d_delete(struct dentry *); |
| 209 | extern void d_set_d_op(struct dentry *dentry, const struct dentry_operations *op); | ||
| 204 | 210 | ||
| 205 | /* allocate/de-allocate */ | 211 | /* allocate/de-allocate */ |
| 206 | extern struct dentry * d_alloc(struct dentry *, const struct qstr *); | 212 | extern struct dentry * d_alloc(struct dentry *, const struct qstr *); |
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index 9f41470c3949..51cddc11cd85 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c | |||
| @@ -2222,7 +2222,7 @@ static struct dentry *cgroup_lookup(struct inode *dir, | |||
| 2222 | 2222 | ||
| 2223 | if (dentry->d_name.len > NAME_MAX) | 2223 | if (dentry->d_name.len > NAME_MAX) |
| 2224 | return ERR_PTR(-ENAMETOOLONG); | 2224 | return ERR_PTR(-ENAMETOOLONG); |
| 2225 | dentry->d_op = &cgroup_dentry_operations; | 2225 | d_set_d_op(dentry, &cgroup_dentry_operations); |
| 2226 | d_add(dentry, NULL); | 2226 | d_add(dentry, NULL); |
| 2227 | return NULL; | 2227 | return NULL; |
| 2228 | } | 2228 | } |
diff --git a/net/socket.c b/net/socket.c index 817dc92e9ef8..991e266bc7ae 100644 --- a/net/socket.c +++ b/net/socket.c | |||
| @@ -368,7 +368,7 @@ static int sock_alloc_file(struct socket *sock, struct file **f, int flags) | |||
| 368 | } | 368 | } |
| 369 | path.mnt = mntget(sock_mnt); | 369 | path.mnt = mntget(sock_mnt); |
| 370 | 370 | ||
| 371 | path.dentry->d_op = &sockfs_dentry_operations; | 371 | d_set_d_op(path.dentry, &sockfs_dentry_operations); |
| 372 | d_instantiate(path.dentry, SOCK_INODE(sock)); | 372 | d_instantiate(path.dentry, SOCK_INODE(sock)); |
| 373 | SOCK_INODE(sock)->i_fop = &socket_file_ops; | 373 | SOCK_INODE(sock)->i_fop = &socket_file_ops; |
| 374 | 374 | ||
diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c index 2899fe27f880..09f01f41e55a 100644 --- a/net/sunrpc/rpc_pipe.c +++ b/net/sunrpc/rpc_pipe.c | |||
| @@ -591,7 +591,7 @@ static struct dentry *__rpc_lookup_create(struct dentry *parent, | |||
| 591 | } | 591 | } |
| 592 | } | 592 | } |
| 593 | if (!dentry->d_inode) | 593 | if (!dentry->d_inode) |
| 594 | dentry->d_op = &rpc_dentry_operations; | 594 | d_set_d_op(dentry, &rpc_dentry_operations); |
| 595 | out_err: | 595 | out_err: |
| 596 | return dentry; | 596 | return dentry; |
| 597 | } | 597 | } |
