diff options
| author | Nick Piggin <npiggin@kernel.dk> | 2011-01-07 17:49:55 +1100 | 
|---|---|---|
| committer | Nick Piggin <npiggin@kernel.dk> | 2011-01-07 17:50:28 +1100 | 
| commit | fb045adb99d9b7c562dc7fef834857f78249daa1 (patch) | |
| tree | 1fd6a4024fffeec568abe100d730589bfdb81c38 /fs | |
| parent | 5f57cbcc02cf18f6b22ef4066bb10afeb8f930ff (diff) | |
| download | olio-linux-3.10-fb045adb99d9b7c562dc7fef834857f78249daa1.tar.xz olio-linux-3.10-fb045adb99d9b7c562dc7fef834857f78249daa1.zip  | |
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>
Diffstat (limited to 'fs')
56 files changed, 159 insertions, 128 deletions
diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c index f6f9081e6d2..df8bbb358d5 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,  	}  	if (v9ses->cache) -		dentry->d_op = &v9fs_cached_dentry_operations; +		d_set_d_op(dentry, &v9fs_cached_dentry_operations);  	else -		dentry->d_op = &v9fs_dentry_operations; +		d_set_d_op(dentry, &v9fs_dentry_operations);  	d_instantiate(dentry, inode);  	err = v9fs_fid_add(dentry, fid); @@ -749,7 +749,7 @@ v9fs_vfs_create_dotl(struct inode *dir, struct dentry *dentry, int omode,  				err);  			goto error;  		} -		dentry->d_op = &v9fs_cached_dentry_operations; +		d_set_d_op(dentry, &v9fs_cached_dentry_operations);  		d_instantiate(dentry, inode);  		err = v9fs_fid_add(dentry, fid);  		if (err < 0) @@ -767,7 +767,7 @@ v9fs_vfs_create_dotl(struct inode *dir, struct dentry *dentry, int omode,  			err = PTR_ERR(inode);  			goto error;  		} -		dentry->d_op = &v9fs_dentry_operations; +		d_set_d_op(dentry, &v9fs_dentry_operations);  		d_instantiate(dentry, inode);  	}  	/* Now set the ACL based on the default value */ @@ -956,7 +956,7 @@ static int v9fs_vfs_mkdir_dotl(struct inode *dir,  				err);  			goto error;  		} -		dentry->d_op = &v9fs_cached_dentry_operations; +		d_set_d_op(dentry, &v9fs_cached_dentry_operations);  		d_instantiate(dentry, inode);  		err = v9fs_fid_add(dentry, fid);  		if (err < 0) @@ -973,7 +973,7 @@ static int v9fs_vfs_mkdir_dotl(struct inode *dir,  			err = PTR_ERR(inode);  			goto error;  		} -		dentry->d_op = &v9fs_dentry_operations; +		d_set_d_op(dentry, &v9fs_dentry_operations);  		d_instantiate(dentry, inode);  	}  	/* 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,  inst_out:  	if (v9ses->cache) -		dentry->d_op = &v9fs_cached_dentry_operations; +		d_set_d_op(dentry, &v9fs_cached_dentry_operations);  	else -		dentry->d_op = &v9fs_dentry_operations; +		d_set_d_op(dentry, &v9fs_dentry_operations);  	d_add(dentry, inode);  	return NULL; @@ -1709,7 +1709,7 @@ v9fs_vfs_symlink_dotl(struct inode *dir, struct dentry *dentry,  					err);  			goto error;  		} -		dentry->d_op = &v9fs_cached_dentry_operations; +		d_set_d_op(dentry, &v9fs_cached_dentry_operations);  		d_instantiate(dentry, inode);  		err = v9fs_fid_add(dentry, fid);  		if (err < 0) @@ -1722,7 +1722,7 @@ v9fs_vfs_symlink_dotl(struct inode *dir, struct dentry *dentry,  			err = PTR_ERR(inode);  			goto error;  		} -		dentry->d_op = &v9fs_dentry_operations; +		d_set_d_op(dentry, &v9fs_dentry_operations);  		d_instantiate(dentry, inode);  	} @@ -1856,7 +1856,7 @@ v9fs_vfs_link_dotl(struct dentry *old_dentry, struct inode *dir,  		ihold(old_dentry->d_inode);  	} -	dentry->d_op = old_dentry->d_op; +	d_set_d_op(dentry, old_dentry->d_op);  	d_instantiate(dentry, old_dentry->d_inode);  	return err; @@ -1980,7 +1980,7 @@ v9fs_vfs_mknod_dotl(struct inode *dir, struct dentry *dentry, int omode,  				err);  			goto error;  		} -		dentry->d_op = &v9fs_cached_dentry_operations; +		d_set_d_op(dentry, &v9fs_cached_dentry_operations);  		d_instantiate(dentry, inode);  		err = v9fs_fid_add(dentry, fid);  		if (err < 0) @@ -1996,7 +1996,7 @@ v9fs_vfs_mknod_dotl(struct inode *dir, struct dentry *dentry, int omode,  			err = PTR_ERR(inode);  			goto error;  		} -		dentry->d_op = &v9fs_dentry_operations; +		d_set_d_op(dentry, &v9fs_dentry_operations);  		d_instantiate(dentry, inode);  	}  	/* Now set the ACL based on the default value */ diff --git a/fs/adfs/dir.c b/fs/adfs/dir.c index a11e5e10271..bf7693c384f 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)  	struct object_info obj;  	int error; -	dentry->d_op = &adfs_dentry_operations;	 +	d_set_d_op(dentry, &adfs_dentry_operations);  	lock_kernel();  	error = adfs_dir_lookup_byname(dir, &dentry->d_name, &obj);  	if (error == 0) { diff --git a/fs/adfs/super.c b/fs/adfs/super.c index 47dffc513a2..a4041b52fbc 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)  		adfs_error(sb, "get root inode failed\n");  		goto error;  	} else -		sb->s_root->d_op = &adfs_dentry_operations; +		d_set_d_op(sb->s_root, &adfs_dentry_operations);  	unlock_kernel();  	return 0; diff --git a/fs/affs/namei.c b/fs/affs/namei.c index 5aca08c2110..944a4042fb6 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)  		if (IS_ERR(inode))  			return ERR_CAST(inode);  	} -	dentry->d_op = AFFS_SB(sb)->s_flags & SF_INTL ? &affs_intl_dentry_operations : &affs_dentry_operations; +	d_set_d_op(dentry, AFFS_SB(sb)->s_flags & SF_INTL ? &affs_intl_dentry_operations : &affs_dentry_operations);  	d_add(dentry, inode);  	return NULL;  } diff --git a/fs/affs/super.c b/fs/affs/super.c index 4c18fcfb0a1..d39081bbe7c 100644 --- a/fs/affs/super.c +++ b/fs/affs/super.c @@ -482,7 +482,7 @@ got_root:  		printk(KERN_ERR "AFFS: Get root inode failed\n");  		goto out_error;  	} -	sb->s_root->d_op = &affs_dentry_operations; +	d_set_d_op(sb->s_root, &affs_dentry_operations);  	pr_debug("AFFS: s_flags=%lX\n",sb->s_flags);  	return 0; diff --git a/fs/afs/dir.c b/fs/afs/dir.c index 2c18cde2700..b8bb7e7148d 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,  	}  success: -	dentry->d_op = &afs_fs_dentry_operations; +	d_set_d_op(dentry, &afs_fs_dentry_operations);  	d_add(dentry, inode);  	_leave(" = 0 { vn=%u u=%u } -> { ino=%lu v=%llu }", diff --git a/fs/anon_inodes.c b/fs/anon_inodes.c index 57ce55b2564..aca8806fa20 100644 --- a/fs/anon_inodes.c +++ b/fs/anon_inodes.c @@ -113,7 +113,7 @@ struct file *anon_inode_getfile(const char *name,  	 */  	ihold(anon_inode_inode); -	path.dentry->d_op = &anon_inodefs_dentry_operations; +	d_set_d_op(path.dentry, &anon_inodefs_dentry_operations);  	d_instantiate(path.dentry, anon_inode_inode);  	error = -ENFILE; diff --git a/fs/autofs4/inode.c b/fs/autofs4/inode.c index ac87e49fa70..a7bdb9dcac8 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)  		goto fail_iput;  	pipe = NULL; -	root->d_op = &autofs4_sb_dentry_operations; +	d_set_d_op(root, &autofs4_sb_dentry_operations);  	root->d_fsdata = ino;  	/* Can this call block? */ diff --git a/fs/autofs4/root.c b/fs/autofs4/root.c index 10ca68a96dc..bfe3f2eb684 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  		 * we check for the hashed dentry and return the newly  		 * hashed dentry.  		 */ -		dentry->d_op = &autofs4_root_dentry_operations; +		d_set_d_op(dentry, &autofs4_root_dentry_operations);  		/*  		 * And we need to ensure that the same dentry is used for @@ -710,9 +710,9 @@ static int autofs4_dir_symlink(struct inode *dir,  	d_add(dentry, inode);  	if (dir == dir->i_sb->s_root->d_inode) -		dentry->d_op = &autofs4_root_dentry_operations; +		d_set_d_op(dentry, &autofs4_root_dentry_operations);  	else -		dentry->d_op = &autofs4_dentry_operations; +		d_set_d_op(dentry, &autofs4_dentry_operations);  	dentry->d_fsdata = ino;  	ino->dentry = dget(dentry); @@ -845,9 +845,9 @@ static int autofs4_dir_mkdir(struct inode *dir, struct dentry *dentry, int mode)  	d_add(dentry, inode);  	if (dir == dir->i_sb->s_root->d_inode) -		dentry->d_op = &autofs4_root_dentry_operations; +		d_set_d_op(dentry, &autofs4_root_dentry_operations);  	else -		dentry->d_op = &autofs4_dentry_operations; +		d_set_d_op(dentry, &autofs4_dentry_operations);  	dentry->d_fsdata = ino;  	ino->dentry = dget(dentry); diff --git a/fs/btrfs/export.c b/fs/btrfs/export.c index 659f532d26a..0ccf9a8afcd 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,  	dentry = d_obtain_alias(inode);  	if (!IS_ERR(dentry)) -		dentry->d_op = &btrfs_dentry_operations; +		d_set_d_op(dentry, &btrfs_dentry_operations);  	return dentry;  fail:  	srcu_read_unlock(&fs_info->subvol_srcu, index); @@ -225,7 +225,7 @@ static struct dentry *btrfs_get_parent(struct dentry *child)  	key.offset = 0;  	dentry = d_obtain_alias(btrfs_iget(root->fs_info->sb, &key, root, NULL));  	if (!IS_ERR(dentry)) -		dentry->d_op = &btrfs_dentry_operations; +		d_set_d_op(dentry, &btrfs_dentry_operations);  	return dentry;  fail:  	btrfs_free_path(path); diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index f9d2994a42a..63e4546b478 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)  	int index;  	int ret; -	dentry->d_op = &btrfs_dentry_operations; +	d_set_d_op(dentry, &btrfs_dentry_operations);  	if (dentry->d_name.len > BTRFS_NAME_LEN)  		return ERR_PTR(-ENAMETOOLONG); diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c index 58abc3da611..cc01cf82676 100644 --- a/fs/ceph/dir.c +++ b/fs/ceph/dir.c @@ -42,11 +42,11 @@ int ceph_init_dentry(struct dentry *dentry)  	if (dentry->d_parent == NULL ||   /* nfs fh_to_dentry */  	    ceph_snap(dentry->d_parent->d_inode) == CEPH_NOSNAP) -		dentry->d_op = &ceph_dentry_ops; +		d_set_d_op(dentry, &ceph_dentry_ops);  	else if (ceph_snap(dentry->d_parent->d_inode) == CEPH_SNAPDIR) -		dentry->d_op = &ceph_snapdir_dentry_ops; +		d_set_d_op(dentry, &ceph_snapdir_dentry_ops);  	else -		dentry->d_op = &ceph_snap_dentry_ops; +		d_set_d_op(dentry, &ceph_snap_dentry_ops);  	di = kmem_cache_alloc(ceph_dentry_cachep, GFP_NOFS | __GFP_ZERO);  	if (!di) diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c index 88bfe686ac0..e3b10ca6d45 100644 --- a/fs/cifs/dir.c +++ b/fs/cifs/dir.c @@ -135,9 +135,9 @@ static void setup_cifs_dentry(struct cifsTconInfo *tcon,  			      struct inode *newinode)  {  	if (tcon->nocase) -		direntry->d_op = &cifs_ci_dentry_ops; +		d_set_d_op(direntry, &cifs_ci_dentry_ops);  	else -		direntry->d_op = &cifs_dentry_ops; +		d_set_d_op(direntry, &cifs_dentry_ops);  	d_instantiate(direntry, newinode);  } @@ -421,9 +421,9 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, int mode,  		rc = cifs_get_inode_info_unix(&newinode, full_path,  						inode->i_sb, xid);  		if (pTcon->nocase) -			direntry->d_op = &cifs_ci_dentry_ops; +			d_set_d_op(direntry, &cifs_ci_dentry_ops);  		else -			direntry->d_op = &cifs_dentry_ops; +			d_set_d_op(direntry, &cifs_dentry_ops);  		if (rc == 0)  			d_instantiate(direntry, newinode); @@ -604,9 +604,9 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry,  	if ((rc == 0) && (newInode != NULL)) {  		if (pTcon->nocase) -			direntry->d_op = &cifs_ci_dentry_ops; +			d_set_d_op(direntry, &cifs_ci_dentry_ops);  		else -			direntry->d_op = &cifs_dentry_ops; +			d_set_d_op(direntry, &cifs_dentry_ops);  		d_add(direntry, newInode);  		if (posix_open) {  			filp = lookup_instantiate_filp(nd, direntry, @@ -634,9 +634,9 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry,  		rc = 0;  		direntry->d_time = jiffies;  		if (pTcon->nocase) -			direntry->d_op = &cifs_ci_dentry_ops; +			d_set_d_op(direntry, &cifs_ci_dentry_ops);  		else -			direntry->d_op = &cifs_dentry_ops; +			d_set_d_op(direntry, &cifs_dentry_ops);  		d_add(direntry, NULL);  	/*	if it was once a directory (but how can we tell?) we could do  		shrink_dcache_parent(direntry); */ diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index 99b9a2cc14b..2a239d878e8 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)  	to set uid/gid */  			inc_nlink(inode);  			if (pTcon->nocase) -				direntry->d_op = &cifs_ci_dentry_ops; +				d_set_d_op(direntry, &cifs_ci_dentry_ops);  			else -				direntry->d_op = &cifs_dentry_ops; +				d_set_d_op(direntry, &cifs_dentry_ops);  			cifs_unix_basic_to_fattr(&fattr, pInfo, cifs_sb);  			cifs_fill_uniqueid(inode->i_sb, &fattr); @@ -1363,9 +1363,9 @@ mkdir_get_info:  						 inode->i_sb, xid, NULL);  		if (pTcon->nocase) -			direntry->d_op = &cifs_ci_dentry_ops; +			d_set_d_op(direntry, &cifs_ci_dentry_ops);  		else -			direntry->d_op = &cifs_dentry_ops; +			d_set_d_op(direntry, &cifs_dentry_ops);  		d_instantiate(direntry, newinode);  		 /* setting nlink not necessary except in cases where we  		  * failed to get it from the server or was set bogus */ diff --git a/fs/cifs/link.c b/fs/cifs/link.c index 85cdbf831e7..fe2f6a93c49 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)  			      rc);  		} else {  			if (pTcon->nocase) -				direntry->d_op = &cifs_ci_dentry_ops; +				d_set_d_op(direntry, &cifs_ci_dentry_ops);  			else -				direntry->d_op = &cifs_dentry_ops; +				d_set_d_op(direntry, &cifs_dentry_ops);  			d_instantiate(direntry, newinode);  		}  	} diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c index ee463aeca0b..ec5b68e3b92 100644 --- a/fs/cifs/readdir.c +++ b/fs/cifs/readdir.c @@ -103,9 +103,9 @@ cifs_readdir_lookup(struct dentry *parent, struct qstr *name,  	}  	if (cifs_sb_master_tcon(CIFS_SB(sb))->nocase) -		dentry->d_op = &cifs_ci_dentry_ops; +		d_set_d_op(dentry, &cifs_ci_dentry_ops);  	else -		dentry->d_op = &cifs_dentry_ops; +		d_set_d_op(dentry, &cifs_dentry_ops);  	alias = d_materialise_unique(dentry, inode);  	if (alias != NULL) { diff --git a/fs/coda/dir.c b/fs/coda/dir.c index 9e37e8bc9b8..aa40c811f8d 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  		return ERR_PTR(error);  exit: -	entry->d_op = &coda_dentry_operations; +	d_set_d_op(entry, &coda_dentry_operations);  	if (inode && (type & CODA_NOCACHE))  		coda_flag_inode(inode, C_VATTR | C_PURGE); diff --git a/fs/configfs/dir.c b/fs/configfs/dir.c index e9acea440ff..36637a8c1ed 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  		return error;  	} -	dentry->d_op = &configfs_dentry_ops; +	d_set_d_op(dentry, &configfs_dentry_ops);  	d_rehash(dentry);  	return 0; @@ -489,7 +489,7 @@ static struct dentry * configfs_lookup(struct inode *dir,  		 */  		if (dentry->d_name.len > NAME_MAX)  			return ERR_PTR(-ENAMETOOLONG); -		dentry->d_op = &configfs_dentry_ops; +		d_set_d_op(dentry, &configfs_dentry_ops);  		d_add(dentry, NULL);  		return NULL;  	} @@ -683,7 +683,7 @@ static int create_default_group(struct config_group *parent_group,  	ret = -ENOMEM;  	child = d_alloc(parent, &name);  	if (child) { -		child->d_op = &configfs_dentry_ops; +		d_set_d_op(child, &configfs_dentry_ops);  		d_add(child, NULL);  		ret = configfs_attach_group(&parent_group->cg_item, @@ -1681,7 +1681,7 @@ int configfs_register_subsystem(struct configfs_subsystem *subsys)  	err = -ENOMEM;  	dentry = d_alloc(configfs_sb->s_root, &name);  	if (dentry) { -		dentry->d_op = &configfs_dentry_ops; +		d_set_d_op(dentry, &configfs_dentry_ops);  		d_add(dentry, NULL);  		err = configfs_attach_group(sd->s_element, &group->cg_item, diff --git a/fs/dcache.c b/fs/dcache.c index 1d5cf511e1c..f9693da3efb 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -398,7 +398,7 @@ repeat:  		return;  	} -	if (dentry->d_op && dentry->d_op->d_delete) { +	if (dentry->d_flags & DCACHE_OP_DELETE) {  		if (dentry->d_op->d_delete(dentry))  			goto kill_it;  	} @@ -1301,6 +1301,28 @@ struct dentry *d_alloc_name(struct dentry *parent, const char *name)  }  EXPORT_SYMBOL(d_alloc_name); +void d_set_d_op(struct dentry *dentry, const struct dentry_operations *op) +{ +	BUG_ON(dentry->d_op); +	BUG_ON(dentry->d_flags & (DCACHE_OP_HASH	| +				DCACHE_OP_COMPARE	| +				DCACHE_OP_REVALIDATE	| +				DCACHE_OP_DELETE )); +	dentry->d_op = op; +	if (!op) +		return; +	if (op->d_hash) +		dentry->d_flags |= DCACHE_OP_HASH; +	if (op->d_compare) +		dentry->d_flags |= DCACHE_OP_COMPARE; +	if (op->d_revalidate) +		dentry->d_flags |= DCACHE_OP_REVALIDATE; +	if (op->d_delete) +		dentry->d_flags |= DCACHE_OP_DELETE; + +} +EXPORT_SYMBOL(d_set_d_op); +  static void __d_instantiate(struct dentry *dentry, struct inode *inode)  {  	spin_lock(&dentry->d_lock); @@ -1731,7 +1753,7 @@ seqretry:  		 */  		if (read_seqcount_retry(&dentry->d_seq, *seq))  			goto seqretry; -		if (parent->d_op && parent->d_op->d_compare) { +		if (parent->d_flags & DCACHE_OP_COMPARE) {  			if (parent->d_op->d_compare(parent, *inode,  						dentry, i,  						tlen, tname, name)) @@ -1846,7 +1868,7 @@ struct dentry *__d_lookup(struct dentry *parent, struct qstr *name)  		 */  		tlen = dentry->d_name.len;  		tname = dentry->d_name.name; -		if (parent->d_op && parent->d_op->d_compare) { +		if (parent->d_flags & DCACHE_OP_COMPARE) {  			if (parent->d_op->d_compare(parent, parent->d_inode,  						dentry, dentry->d_inode,  						tlen, tname, name)) @@ -1887,7 +1909,7 @@ struct dentry *d_hash_and_lookup(struct dentry *dir, struct qstr *name)  	 * routine may choose to leave the hash value unchanged.  	 */  	name->hash = full_name_hash(name->name, name->len); -	if (dir->d_op && dir->d_op->d_hash) { +	if (dir->d_flags & DCACHE_OP_HASH) {  		if (dir->d_op->d_hash(dir, dir->d_inode, name) < 0)  			goto out;  	} diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c index 5e5c7ec1fc9..f91b35db4c6 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,  	struct qstr lower_name;  	int rc = 0; -	ecryptfs_dentry->d_op = &ecryptfs_dops; +	d_set_d_op(ecryptfs_dentry, &ecryptfs_dops);  	if ((ecryptfs_dentry->d_name.len == 1  	     && !strcmp(ecryptfs_dentry->d_name.name, "."))  	    || (ecryptfs_dentry->d_name.len == 2 diff --git a/fs/ecryptfs/main.c b/fs/ecryptfs/main.c index a9dbd62518e..35103867537 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,  	if (special_file(lower_inode->i_mode))  		init_special_inode(inode, lower_inode->i_mode,  				   lower_inode->i_rdev); -	dentry->d_op = &ecryptfs_dops; +	d_set_d_op(dentry, &ecryptfs_dops);  	fsstack_copy_attr_all(inode, lower_inode);  	/* This size will be overwritten for real files w/ headers and  	 * other metadata */ @@ -594,7 +594,7 @@ static struct dentry *ecryptfs_mount(struct file_system_type *fs_type, int flags  		deactivate_locked_super(s);  		goto out;  	} -	s->s_root->d_op = &ecryptfs_dops; +	d_set_d_op(s->s_root, &ecryptfs_dops);  	s->s_root->d_sb = s;  	s->s_root->d_parent = s->s_root; diff --git a/fs/fat/inode.c b/fs/fat/inode.c index 8cccfebee18..206351af7c5 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,  	 */  	result = d_obtain_alias(inode);  	if (!IS_ERR(result)) -		result->d_op = sb->s_root->d_op; +		d_set_d_op(result, sb->s_root->d_op);  	return result;  } @@ -800,7 +800,7 @@ static struct dentry *fat_get_parent(struct dentry *child)  	parent = d_obtain_alias(inode);  	if (!IS_ERR(parent)) -		parent->d_op = sb->s_root->d_op; +		d_set_d_op(parent, sb->s_root->d_op);  out:  	unlock_super(sb); diff --git a/fs/fat/namei_msdos.c b/fs/fat/namei_msdos.c index 3b3e072d898..35ffe43afa4 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,  	}  out:  	unlock_super(sb); -	dentry->d_op = &msdos_dentry_operations; +	d_set_d_op(dentry, &msdos_dentry_operations);  	dentry = d_splice_alias(inode, dentry);  	if (dentry) -		dentry->d_op = &msdos_dentry_operations; +		d_set_d_op(dentry, &msdos_dentry_operations);  	return dentry;  error: @@ -673,7 +673,7 @@ static int msdos_fill_super(struct super_block *sb, void *data, int silent)  	}  	sb->s_flags |= MS_NOATIME; -	sb->s_root->d_op = &msdos_dentry_operations; +	d_set_d_op(sb->s_root, &msdos_dentry_operations);  	unlock_super(sb);  	return 0;  } diff --git a/fs/fat/namei_vfat.c b/fs/fat/namei_vfat.c index 4fc06278db4..3be5ed7d859 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,  out:  	unlock_super(sb); -	dentry->d_op = sb->s_root->d_op; +	d_set_d_op(dentry, sb->s_root->d_op);  	dentry->d_time = dentry->d_parent->d_inode->i_version;  	dentry = d_splice_alias(inode, dentry);  	if (dentry) { -		dentry->d_op = sb->s_root->d_op; +		d_set_d_op(dentry, sb->s_root->d_op);  		dentry->d_time = dentry->d_parent->d_inode->i_version;  	}  	return dentry; @@ -1072,9 +1072,9 @@ static int vfat_fill_super(struct super_block *sb, void *data, int silent)  	}  	if (MSDOS_SB(sb)->options.name_check != 's') -		sb->s_root->d_op = &vfat_ci_dentry_ops; +		d_set_d_op(sb->s_root, &vfat_ci_dentry_ops);  	else -		sb->s_root->d_op = &vfat_dentry_ops; +		d_set_d_op(sb->s_root, &vfat_dentry_ops);  	unlock_super(sb);  	return 0; diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index c9627c95482..c9a8a426a39 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,  	}  	entry = newent ? newent : entry; -	entry->d_op = &fuse_dentry_operations; +	d_set_d_op(entry, &fuse_dentry_operations);  	if (outarg_valid)  		fuse_change_entry_timeout(entry, &outarg);  	else diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index 44e0a6c57e8..a8b31da19b9 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,  	entry = d_obtain_alias(inode);  	if (!IS_ERR(entry) && get_node_id(inode) != FUSE_ROOT_ID) { -		entry->d_op = &fuse_dentry_operations; +		d_set_d_op(entry, &fuse_dentry_operations);  		fuse_invalidate_entry_cache(entry);  	} @@ -728,7 +728,7 @@ static struct dentry *fuse_get_parent(struct dentry *child)  	parent = d_obtain_alias(inode);  	if (!IS_ERR(parent) && get_node_id(inode) != FUSE_ROOT_ID) { -		parent->d_op = &fuse_dentry_operations; +		d_set_d_op(parent, &fuse_dentry_operations);  		fuse_invalidate_entry_cache(parent);  	} diff --git a/fs/gfs2/export.c b/fs/gfs2/export.c index 5ab3839dfcb..97012ecff56 100644 --- a/fs/gfs2/export.c +++ b/fs/gfs2/export.c @@ -130,7 +130,7 @@ static struct dentry *gfs2_get_parent(struct dentry *child)  	dentry = d_obtain_alias(gfs2_lookupi(child->d_inode, &gfs2_qdotdot, 1));  	if (!IS_ERR(dentry)) -		dentry->d_op = &gfs2_dops; +		d_set_d_op(dentry, &gfs2_dops);  	return dentry;  } @@ -158,7 +158,7 @@ static struct dentry *gfs2_get_dentry(struct super_block *sb,  out_inode:  	dentry = d_obtain_alias(inode);  	if (!IS_ERR(dentry)) -		dentry->d_op = &gfs2_dops; +		d_set_d_op(dentry, &gfs2_dops);  	return dentry;  } diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c index 3eb1393f7b8..2aeabd4218c 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,  		iput(inode);  		return -ENOMEM;  	} -	dentry->d_op = &gfs2_dops; +	d_set_d_op(dentry, &gfs2_dops);  	*dptr = dentry;  	return 0;  } diff --git a/fs/gfs2/ops_inode.c b/fs/gfs2/ops_inode.c index 12cbea7502c..f28f89796f4 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,  {  	struct inode *inode = NULL; -	dentry->d_op = &gfs2_dops; +	d_set_d_op(dentry, &gfs2_dops);  	inode = gfs2_lookupi(dir, &dentry->d_name, 0);  	if (inode && IS_ERR(inode)) diff --git a/fs/hfs/dir.c b/fs/hfs/dir.c index 2b3b8611b41..ea4aefe7c65 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,  	struct inode *inode = NULL;  	int res; -	dentry->d_op = &hfs_dentry_operations; +	d_set_d_op(dentry, &hfs_dentry_operations);  	hfs_find_init(HFS_SB(dir->i_sb)->cat_tree, &fd);  	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 ef4ee5716ab..0bef62aa4f4 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)  	if (!sb->s_root)  		goto bail_iput; -	sb->s_root->d_op = &hfs_dentry_operations; +	d_set_d_op(sb->s_root, &hfs_dentry_operations);  	/* everything's okay */  	return 0; diff --git a/fs/hfsplus/dir.c b/fs/hfsplus/dir.c index 9d59c0571f5..ccab87145f7 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,  	sb = dir->i_sb; -	dentry->d_op = &hfsplus_dentry_operations; +	d_set_d_op(dentry, &hfsplus_dentry_operations);  	dentry->d_fsdata = NULL;  	hfs_find_init(HFSPLUS_SB(sb)->cat_tree, &fd);  	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 182e83a9079..ddf712e4700 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)  		err = -ENOMEM;  		goto cleanup;  	} -	sb->s_root->d_op = &hfsplus_dentry_operations; +	d_set_d_op(sb->s_root, &hfsplus_dentry_operations);  	str.len = sizeof(HFSP_HIDDENDIR_NAME) - 1;  	str.name = HFSP_HIDDENDIR_NAME; diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c index 861113fcfc8..0bc81cf256b 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,  		goto out_put;  	d_add(dentry, inode); -	dentry->d_op = &hostfs_dentry_ops; +	d_set_d_op(dentry, &hostfs_dentry_ops);  	return NULL;   out_put: diff --git a/fs/hpfs/dentry.c b/fs/hpfs/dentry.c index 35526df1fd3..32c13a94e1e 100644 --- a/fs/hpfs/dentry.c +++ b/fs/hpfs/dentry.c @@ -65,5 +65,5 @@ static const struct dentry_operations hpfs_dentry_operations = {  void hpfs_set_dentry_operations(struct dentry *dentry)  { -	dentry->d_op = &hpfs_dentry_operations; +	d_set_d_op(dentry, &hpfs_dentry_operations);  } diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c index d8f3a652243..844a7903c72 100644 --- a/fs/isofs/inode.c +++ b/fs/isofs/inode.c @@ -949,7 +949,7 @@ root_found:  		table += 2;  	if (opt.check == 'r')  		table++; -	s->s_root->d_op = &isofs_dentry_ops[table]; +	d_set_d_op(s->s_root, &isofs_dentry_ops[table]);  	kfree(opt.iocharset); diff --git a/fs/isofs/namei.c b/fs/isofs/namei.c index 715f7d31804..679a849c3b2 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  	struct inode *inode;  	struct page *page; -	dentry->d_op = dir->i_sb->s_root->d_op; +	d_set_d_op(dentry, dir->i_sb->s_root->d_op);  	page = alloc_page(GFP_USER);  	if (!page) diff --git a/fs/jfs/namei.c b/fs/jfs/namei.c index 57f90dad891..a151cbdec62 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  	jfs_info("jfs_lookup: name = %s", name);  	if (JFS_SBI(dip->i_sb)->mntflag & JFS_OS2) -		dentry->d_op = &jfs_ci_dentry_operations; +		d_set_d_op(dentry, &jfs_ci_dentry_operations);  	if ((name[0] == '.') && (len == 1))  		inum = dip->i_ino; @@ -1495,7 +1495,7 @@ static struct dentry *jfs_lookup(struct inode *dip, struct dentry *dentry, struc  	dentry = d_splice_alias(ip, dentry);  	if (dentry && (JFS_SBI(dip->i_sb)->mntflag & JFS_OS2)) -		dentry->d_op = &jfs_ci_dentry_operations; +		d_set_d_op(dentry, &jfs_ci_dentry_operations);  	return dentry;  } diff --git a/fs/jfs/super.c b/fs/jfs/super.c index b715b0f7bdf..3150d766e0d 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)  		goto out_no_root;  	if (sbi->mntflag & JFS_OS2) -		sb->s_root->d_op = &jfs_ci_dentry_operations; +		d_set_d_op(sb->s_root, &jfs_ci_dentry_operations);  	/* logical blocks are represented by 40 bits in pxd_t, etc. */  	sb->s_maxbytes = ((u64) sb->s_blocksize) << 40; diff --git a/fs/libfs.c b/fs/libfs.c index 28b36663c44..889311e3d06 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  	if (dentry->d_name.len > NAME_MAX)  		return ERR_PTR(-ENAMETOOLONG); -	dentry->d_op = &simple_dentry_operations; +	d_set_d_op(dentry, &simple_dentry_operations);  	d_add(dentry, NULL);  	return NULL;  } diff --git a/fs/minix/namei.c b/fs/minix/namei.c index c0d35a3acce..1b9e07728a9 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  	struct inode * inode = NULL;  	ino_t ino; -	dentry->d_op = dir->i_sb->s_root->d_op; +	d_set_d_op(dentry, dir->i_sb->s_root->d_op);  	if (dentry->d_name.len > minix_sb(dir->i_sb)->s_namelen)  		return ERR_PTR(-ENAMETOOLONG); diff --git a/fs/namei.c b/fs/namei.c index c731b50a618..90bd2873e11 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -587,6 +587,17 @@ do_revalidate(struct dentry *dentry, struct nameidata *nd)  	return dentry;  } +static inline int need_reval_dot(struct dentry *dentry) +{ +	if (likely(!(dentry->d_flags & DCACHE_OP_REVALIDATE))) +		return 0; + +	if (likely(!(dentry->d_sb->s_type->fs_flags & FS_REVAL_DOT))) +		return 0; + +	return 1; +} +  /*   * force_reval_path - force revalidation of a dentry   * @@ -610,10 +621,9 @@ force_reval_path(struct path *path, struct nameidata *nd)  	/*  	 * only check on filesystems where it's possible for the dentry to -	 * become stale. It's assumed that if this flag is set then the -	 * d_revalidate op will also be defined. +	 * become stale.  	 */ -	if (!(dentry->d_sb->s_type->fs_flags & FS_REVAL_DOT)) +	if (!need_reval_dot(dentry))  		return 0;  	status = dentry->d_op->d_revalidate(dentry, nd); @@ -1003,7 +1013,7 @@ static int do_lookup(struct nameidata *nd, struct qstr *name,  	 * See if the low-level filesystem might want  	 * to use its own hash..  	 */ -	if (parent->d_op && parent->d_op->d_hash) { +	if (unlikely(parent->d_flags & DCACHE_OP_HASH)) {  		int err = parent->d_op->d_hash(parent, nd->inode, name);  		if (err < 0)  			return err; @@ -1029,7 +1039,7 @@ static int do_lookup(struct nameidata *nd, struct qstr *name,  			return -ECHILD;  		nd->seq = seq; -		if (dentry->d_op && dentry->d_op->d_revalidate) { +		if (dentry->d_flags & DCACHE_OP_REVALIDATE) {  			/* We commonly drop rcu-walk here */  			if (nameidata_dentry_drop_rcu(nd, dentry))  				return -ECHILD; @@ -1043,7 +1053,7 @@ static int do_lookup(struct nameidata *nd, struct qstr *name,  		if (!dentry)  			goto need_lookup;  found: -		if (dentry->d_op && dentry->d_op->d_revalidate) +		if (dentry->d_flags & DCACHE_OP_REVALIDATE)  			goto need_revalidate;  done:  		path->mnt = mnt; @@ -1281,8 +1291,7 @@ return_reval:  		 * We bypassed the ordinary revalidation routines.  		 * We may need to check the cached dentry for staleness.  		 */ -		if (nd->path.dentry && nd->path.dentry->d_sb && -		    (nd->path.dentry->d_sb->s_type->fs_flags & FS_REVAL_DOT)) { +		if (need_reval_dot(nd->path.dentry)) {  			if (nameidata_drop_rcu_maybe(nd))  				return -ECHILD;  			err = -ESTALE; @@ -1602,7 +1611,7 @@ static struct dentry *__lookup_hash(struct qstr *name,  	 * See if the low-level filesystem might want  	 * to use its own hash..  	 */ -	if (base->d_op && base->d_op->d_hash) { +	if (base->d_flags & DCACHE_OP_HASH) {  		err = base->d_op->d_hash(base, inode, name);  		dentry = ERR_PTR(err);  		if (err < 0) @@ -1616,7 +1625,7 @@ static struct dentry *__lookup_hash(struct qstr *name,  	 */  	dentry = d_lookup(base, name); -	if (dentry && dentry->d_op && dentry->d_op->d_revalidate) +	if (dentry && (dentry->d_flags & DCACHE_OP_REVALIDATE))  		dentry = do_revalidate(dentry, nd);  	if (!dentry) @@ -2070,7 +2079,7 @@ static struct file *do_last(struct nameidata *nd, struct path *path,  		follow_dotdot(nd);  		dir = nd->path.dentry;  	case LAST_DOT: -		if (nd->path.mnt->mnt_sb->s_type->fs_flags & FS_REVAL_DOT) { +		if (need_reval_dot(dir)) {  			if (!dir->d_op->d_revalidate(dir, nd)) {  				error = -ESTALE;  				goto exit; diff --git a/fs/ncpfs/dir.c b/fs/ncpfs/dir.c index 0ba3cdc95a4..4b9cbb28d7f 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,  		entry->ino = iunique(dir->i_sb, 2);  		inode = ncp_iget(dir->i_sb, entry);  		if (inode) { -			newdent->d_op = &ncp_dentry_operations; +			d_set_d_op(newdent, &ncp_dentry_operations);  			d_instantiate(newdent, inode);  			if (!hashed)  				d_rehash(newdent); @@ -889,7 +889,7 @@ static struct dentry *ncp_lookup(struct inode *dir, struct dentry *dentry, struc  	if (inode) {  		ncp_new_dentry(dentry);  add_entry: -		dentry->d_op = &ncp_dentry_operations; +		d_set_d_op(dentry, &ncp_dentry_operations);  		d_add(dentry, inode);  		error = 0;  	} diff --git a/fs/ncpfs/inode.c b/fs/ncpfs/inode.c index 60047dbeb38..0c75a5f3caf 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)  	sb->s_root = d_alloc_root(root_inode);          if (!sb->s_root)  		goto out_no_root; -	sb->s_root->d_op = &ncp_root_dentry_operations; +	d_set_d_op(sb->s_root, &ncp_root_dentry_operations);  	return 0;  out_no_root: diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index eb77471b882..37e0a8bb077 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)  	if (dentry == NULL)  		return; -	dentry->d_op = NFS_PROTO(dir)->dentry_ops; +	d_set_d_op(dentry, NFS_PROTO(dir)->dentry_ops);  	inode = nfs_fhget(dentry->d_sb, entry->fh, entry->fattr);  	if (IS_ERR(inode))  		goto out; @@ -1188,7 +1188,7 @@ static struct dentry *nfs_lookup(struct inode *dir, struct dentry * dentry, stru  	if (dentry->d_name.len > NFS_SERVER(dir)->namelen)  		goto out; -	dentry->d_op = NFS_PROTO(dir)->dentry_ops; +	d_set_d_op(dentry, NFS_PROTO(dir)->dentry_ops);  	/*  	 * 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  		res = ERR_PTR(-ENAMETOOLONG);  		goto out;  	} -	dentry->d_op = NFS_PROTO(dir)->dentry_ops; +	d_set_d_op(dentry, NFS_PROTO(dir)->dentry_ops);  	/* Let vfs_create() deal with O_EXCL. Instantiate, but don't hash  	 * the dentry. */ diff --git a/fs/nfs/getroot.c b/fs/nfs/getroot.c index b3e36c3430d..c3a5a112683 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)  	security_d_instantiate(ret, inode);  	if (ret->d_op == NULL) -		ret->d_op = server->nfs_client->rpc_ops->dentry_ops; +		d_set_d_op(ret, server->nfs_client->rpc_ops->dentry_ops);  out:  	nfs_free_fattr(fsinfo.fattr);  	return ret; @@ -228,7 +228,7 @@ struct dentry *nfs4_get_root(struct super_block *sb, struct nfs_fh *mntfh)  	security_d_instantiate(ret, inode);  	if (ret->d_op == NULL) -		ret->d_op = server->nfs_client->rpc_ops->dentry_ops; +		d_set_d_op(ret, server->nfs_client->rpc_ops->dentry_ops);  out:  	nfs_free_fattr(fattr); diff --git a/fs/ocfs2/export.c b/fs/ocfs2/export.c index 19ad145d2af..6adafa57606 100644 --- a/fs/ocfs2/export.c +++ b/fs/ocfs2/export.c @@ -138,7 +138,7 @@ check_gen:  	result = d_obtain_alias(inode);  	if (!IS_ERR(result)) -		result->d_op = &ocfs2_dentry_ops; +		d_set_d_op(result, &ocfs2_dentry_ops);  	else  		mlog_errno(PTR_ERR(result)); @@ -176,7 +176,7 @@ static struct dentry *ocfs2_get_parent(struct dentry *child)  	parent = d_obtain_alias(ocfs2_iget(OCFS2_SB(dir->i_sb), blkno, 0, 0));  	if (!IS_ERR(parent)) -		parent->d_op = &ocfs2_dentry_ops; +		d_set_d_op(parent, &ocfs2_dentry_ops);  bail_unlock:  	ocfs2_inode_unlock(dir, 0); diff --git a/fs/ocfs2/namei.c b/fs/ocfs2/namei.c index ff5744e1e36..d14cad6e2e4 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,  	spin_unlock(&oi->ip_lock);  bail_add: -	dentry->d_op = &ocfs2_dentry_ops; +	d_set_d_op(dentry, &ocfs2_dentry_ops);  	ret = d_splice_alias(inode, dentry);  	if (inode) { @@ -415,7 +415,7 @@ static int ocfs2_mknod(struct inode *dir,  		mlog_errno(status);  		goto leave;  	} -	dentry->d_op = &ocfs2_dentry_ops; +	d_set_d_op(dentry, &ocfs2_dentry_ops);  	status = ocfs2_add_entry(handle, dentry, inode,  				 OCFS2_I(inode)->ip_blkno, parent_fe_bh, @@ -743,7 +743,7 @@ static int ocfs2_link(struct dentry *old_dentry,  	}  	ihold(inode); -	dentry->d_op = &ocfs2_dentry_ops; +	d_set_d_op(dentry, &ocfs2_dentry_ops);  	d_instantiate(dentry, inode);  out_commit: @@ -1794,7 +1794,7 @@ static int ocfs2_symlink(struct inode *dir,  		mlog_errno(status);  		goto bail;  	} -	dentry->d_op = &ocfs2_dentry_ops; +	d_set_d_op(dentry, &ocfs2_dentry_ops);  	status = ocfs2_add_entry(handle, dentry, inode,  				 le64_to_cpu(fe->i_blkno), parent_fe_bh, @@ -2459,7 +2459,7 @@ int ocfs2_mv_orphaned_inode_to_new(struct inode *dir,  		goto out_commit;  	} -	dentry->d_op = &ocfs2_dentry_ops; +	d_set_d_op(dentry, &ocfs2_dentry_ops);  	d_instantiate(dentry, inode);  	status = 0;  out_commit: diff --git a/fs/pipe.c b/fs/pipe.c index ae3592dcc88..01a78656781 100644 --- a/fs/pipe.c +++ b/fs/pipe.c @@ -1004,7 +1004,7 @@ struct file *create_write_pipe(int flags)  		goto err_inode;  	path.mnt = mntget(pipe_mnt); -	path.dentry->d_op = &pipefs_dentry_operations; +	d_set_d_op(path.dentry, &pipefs_dentry_operations);  	d_instantiate(path.dentry, inode);  	err = -ENFILE; diff --git a/fs/proc/base.c b/fs/proc/base.c index d932fdb6a24..85f0a80912a 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -1969,7 +1969,7 @@ static struct dentry *proc_fd_instantiate(struct inode *dir,  	inode->i_op = &proc_pid_link_inode_operations;  	inode->i_size = 64;  	ei->op.proc_get_link = proc_fd_link; -	dentry->d_op = &tid_fd_dentry_operations; +	d_set_d_op(dentry, &tid_fd_dentry_operations);  	d_add(dentry, inode);  	/* Close the race of the process dying before we return the dentry */  	if (tid_fd_revalidate(dentry, NULL)) @@ -2137,7 +2137,7 @@ static struct dentry *proc_fdinfo_instantiate(struct inode *dir,  	ei->fd = fd;  	inode->i_mode = S_IFREG | S_IRUSR;  	inode->i_fop = &proc_fdinfo_file_operations; -	dentry->d_op = &tid_fd_dentry_operations; +	d_set_d_op(dentry, &tid_fd_dentry_operations);  	d_add(dentry, inode);  	/* Close the race of the process dying before we return the dentry */  	if (tid_fd_revalidate(dentry, NULL)) @@ -2196,7 +2196,7 @@ static struct dentry *proc_pident_instantiate(struct inode *dir,  	if (p->fop)  		inode->i_fop = p->fop;  	ei->op = p->op; -	dentry->d_op = &pid_dentry_operations; +	d_set_d_op(dentry, &pid_dentry_operations);  	d_add(dentry, inode);  	/* Close the race of the process dying before we return the dentry */  	if (pid_revalidate(dentry, NULL)) @@ -2615,7 +2615,7 @@ static struct dentry *proc_base_instantiate(struct inode *dir,  	if (p->fop)  		inode->i_fop = p->fop;  	ei->op = p->op; -	dentry->d_op = &proc_base_dentry_operations; +	d_set_d_op(dentry, &proc_base_dentry_operations);  	d_add(dentry, inode);  	error = NULL;  out: @@ -2926,7 +2926,7 @@ static struct dentry *proc_pid_instantiate(struct inode *dir,  	inode->i_nlink = 2 + pid_entry_count_dirs(tgid_base_stuff,  		ARRAY_SIZE(tgid_base_stuff)); -	dentry->d_op = &pid_dentry_operations; +	d_set_d_op(dentry, &pid_dentry_operations);  	d_add(dentry, inode);  	/* 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,  	inode->i_nlink = 2 + pid_entry_count_dirs(tid_base_stuff,  		ARRAY_SIZE(tid_base_stuff)); -	dentry->d_op = &pid_dentry_operations; +	d_set_d_op(dentry, &pid_dentry_operations);  	d_add(dentry, inode);  	/* 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 1d607be36d9..f766be29d2c 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,  out_unlock:  	if (inode) { -		dentry->d_op = &proc_dentry_operations; +		d_set_d_op(dentry, &proc_dentry_operations);  		d_add(dentry, inode);  		return NULL;  	} diff --git a/fs/proc/proc_sysctl.c b/fs/proc/proc_sysctl.c index 998e3a715bc..35efd85a4d3 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,  		goto out;  	err = NULL; -	dentry->d_op = &proc_sys_dentry_operations; +	d_set_d_op(dentry, &proc_sys_dentry_operations);  	d_add(dentry, inode);  out: @@ -201,7 +201,7 @@ static int proc_sys_fill_cache(struct file *filp, void *dirent,  				dput(child);  				return -ENOMEM;  			} else { -				child->d_op = &proc_sys_dentry_operations; +				d_set_d_op(child, &proc_sys_dentry_operations);  				d_add(child, inode);  			}  		} else { diff --git a/fs/reiserfs/xattr.c b/fs/reiserfs/xattr.c index 5d04a7828e7..e0f0d7ea10a 100644 --- a/fs/reiserfs/xattr.c +++ b/fs/reiserfs/xattr.c @@ -990,7 +990,7 @@ int reiserfs_lookup_privroot(struct super_block *s)  				strlen(PRIVROOT_NAME));  	if (!IS_ERR(dentry)) {  		REISERFS_SB(s)->priv_root = dentry; -		dentry->d_op = &xattr_lookup_poison_ops; +		d_set_d_op(dentry, &xattr_lookup_poison_ops);  		if (dentry->d_inode)  			dentry->d_inode->i_flags |= S_PRIVATE;  	} else diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c index 27e1102e303..3e076caa8da 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,  	/* instantiate and hash dentry */  	ret = d_find_alias(inode);  	if (!ret) { -		dentry->d_op = &sysfs_dentry_ops; +		d_set_d_op(dentry, &sysfs_dentry_ops);  		dentry->d_fsdata = sysfs_get(sd);  		d_add(dentry, inode);  	} else { diff --git a/fs/sysv/namei.c b/fs/sysv/namei.c index 7507aeb4c90..b5e68da2db3 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  	struct inode * inode = NULL;  	ino_t ino; -	dentry->d_op = dir->i_sb->s_root->d_op; +	d_set_d_op(dentry, dir->i_sb->s_root->d_op);  	if (dentry->d_name.len > SYSV_NAMELEN)  		return ERR_PTR(-ENAMETOOLONG);  	ino = sysv_inode_by_name(dentry); diff --git a/fs/sysv/super.c b/fs/sysv/super.c index 3d9c62be0c1..76712aefc4a 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)  	if (sbi->s_forced_ro)  		sb->s_flags |= MS_RDONLY;  	if (sbi->s_truncate) -		sb->s_root->d_op = &sysv_dentry_operations; +		d_set_d_op(sb->s_root, &sysv_dentry_operations);  	return 1;  }  |