Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fb045adb authored by Nick Piggin's avatar Nick Piggin
Browse files

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: default avatarNick Piggin <npiggin@kernel.dk>
parent 5f57cbcc
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -2233,7 +2233,7 @@ pfm_alloc_file(pfm_context_t *ctx)
	}
	path.mnt = mntget(pfmfs_mnt);

	path.dentry->d_op = &pfmfs_dentry_operations;
	d_set_d_op(path.dentry, &pfmfs_dentry_operations);
	d_add(path.dentry, inode);

	file = alloc_file(&path, FMODE_READ, &pfm_file_ops);
+1 −1
Original line number Diff line number Diff line
@@ -237,7 +237,7 @@ static struct dentry *autofs_root_lookup(struct inode *dir, struct dentry *dentr
	 *
	 * We need to do this before we release the directory semaphore.
	 */
	dentry->d_op = &autofs_dentry_operations;
	d_set_d_op(dentry, &autofs_dentry_operations);
	dentry->d_flags |= DCACHE_AUTOFS_PENDING;
	d_add(dentry, NULL);

+4 −4
Original line number Diff line number Diff line
@@ -398,9 +398,9 @@ smb_new_dentry(struct dentry *dentry)
	struct smb_sb_info *server = server_from_dentry(dentry);

	if (server->mnt->flags & SMB_MOUNT_CASE)
		dentry->d_op = &smbfs_dentry_operations_case;
		d_set_d_op(dentry, &smbfs_dentry_operations_case);
	else
		dentry->d_op = &smbfs_dentry_operations;
		d_set_d_op(dentry, &smbfs_dentry_operations);
	dentry->d_time = jiffies;
}

@@ -462,9 +462,9 @@ smb_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd)
	add_entry:
			server = server_from_dentry(dentry);
			if (server->mnt->flags & SMB_MOUNT_CASE)
				dentry->d_op = &smbfs_dentry_operations_case;
				d_set_d_op(dentry, &smbfs_dentry_operations_case);
			else
				dentry->d_op = &smbfs_dentry_operations;
				d_set_d_op(dentry, &smbfs_dentry_operations);

			d_add(dentry, inode);
			smb_renew_times(dentry);
+13 −13
Original line number Diff line number Diff line
@@ -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 */
+1 −1
Original line number Diff line number Diff line
@@ -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) {
Loading