cluster: RHEL58 - GFS: add ability to turn off inode pre-fetch on readdir

Bob Peterson rpeterso at fedoraproject.org
Wed Sep 14 21:07:26 UTC 2011


Gitweb:        http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=6689362008847088660603c7a041968fb33b50be
Commit:        6689362008847088660603c7a041968fb33b50be
Parent:        1a810eac13bb49f85e0e3c5a17e05d06ba6a5037
Author:        Bob Peterson <rpeterso at redhat.com>
AuthorDate:    Wed Sep 14 15:03:10 2011 -0500
Committer:     Bob Peterson <rpeterso at redhat.com>
CommitterDate: Wed Sep 14 15:08:15 2011 -0500

GFS: add ability to turn off inode pre-fetch on readdir

This patch adds a new GFS mount option "noprefetch" which turns off
inode pre-fetch when doing readdir.  This option changes the performance
characteristics and lets some use cases run much faster.

rhbz#732129
---
 gfs-kernel/src/gfs/incore.h    |    1 +
 gfs-kernel/src/gfs/mount.c     |    6 ++++++
 gfs-kernel/src/gfs/ops_file.c  |    3 +++
 gfs-kernel/src/gfs/ops_inode.c |    6 ++++--
 gfs-kernel/src/gfs/ops_super.c |    3 +++
 5 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/gfs-kernel/src/gfs/incore.h b/gfs-kernel/src/gfs/incore.h
index 67f7e10..af53aef 100644
--- a/gfs-kernel/src/gfs/incore.h
+++ b/gfs-kernel/src/gfs/incore.h
@@ -867,6 +867,7 @@ struct gfs_args {
 	int ar_suiddir; /* suiddir support */
 	int ar_noquota; /* Turn off quota support */
 	int ar_noatime; /* Turn off atime updates */
+	int ar_noprefetch; /* Turn on/off inode pre-fetch from readdir */
 };
 
 struct gfs_tune {
diff --git a/gfs-kernel/src/gfs/mount.c b/gfs-kernel/src/gfs/mount.c
index 741667a..4a16486 100644
--- a/gfs-kernel/src/gfs/mount.c
+++ b/gfs-kernel/src/gfs/mount.c
@@ -162,6 +162,12 @@ gfs_make_args(char *data_arg, struct gfs_args *args, int remount)
 		else if (!strcmp(x, "noacl"))
 			args->ar_posix_acls = FALSE;
 
+		else if (!strcmp(x, "noprefetch"))
+			args->ar_noprefetch = TRUE;
+
+		else if (!strcmp(x, "prefetch"))
+			args->ar_noprefetch = FALSE;
+
 		else if (!strcmp(x, "suiddir"))
 			args->ar_suiddir = TRUE;
 
diff --git a/gfs-kernel/src/gfs/ops_file.c b/gfs-kernel/src/gfs/ops_file.c
index 03fcc73..aa2ed3b 100644
--- a/gfs-kernel/src/gfs/ops_file.c
+++ b/gfs-kernel/src/gfs/ops_file.c
@@ -1175,7 +1175,10 @@ high_stat_rate(struct gfs_inode *ip)
 	struct timeval now, diff;
 	unsigned long milli = 0;
 	unsigned int rate = 0; /* stats per second in this dir */
+	struct gfs_sbd *sdp = ip->i_sbd;
 
+	if (sdp->sd_args.ar_noprefetch)
+		return 1;
 	do_gettimeofday(&now);
 	diff.tv_sec = now.tv_sec - ip->i_dir_stat_st.tv_sec;
 	diff.tv_usec = now.tv_usec - ip->i_dir_stat_st.tv_usec;
diff --git a/gfs-kernel/src/gfs/ops_inode.c b/gfs-kernel/src/gfs/ops_inode.c
index ae836dc..7607926 100644
--- a/gfs-kernel/src/gfs/ops_inode.c
+++ b/gfs-kernel/src/gfs/ops_inode.c
@@ -1511,6 +1511,7 @@ gfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
 	struct inode *inode = dentry->d_inode, *p_inode = NULL;
 	struct gfs_inode *ip = get_v2ip(inode), *pi = NULL;
 	struct gfs_holder gh;
+	struct gfs_sbd *sdp = ip->i_sbd;
 	int error;
 
 	atomic_inc(&ip->i_sbd->sd_ops_inode);
@@ -1518,8 +1519,9 @@ gfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
 	error = gfs_glock_nq_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &gh);
 	if (!error) {
 		generic_fillattr(inode, stat);
-		if (S_ISREG(inode->i_mode) && dentry->d_parent 
-		    && dentry->d_parent->d_inode) {
+		if (!sdp->sd_args.ar_noprefetch &&
+		    S_ISREG(inode->i_mode) && dentry->d_parent &&
+		    dentry->d_parent->d_inode) {
 			p_inode = igrab(dentry->d_parent->d_inode);
 			if (p_inode) {
 				pi = get_v2ip(p_inode);
diff --git a/gfs-kernel/src/gfs/ops_super.c b/gfs-kernel/src/gfs/ops_super.c
index 1838e5d..1fa7faf 100644
--- a/gfs-kernel/src/gfs/ops_super.c
+++ b/gfs-kernel/src/gfs/ops_super.c
@@ -330,6 +330,7 @@ gfs_remount_fs(struct super_block *sb, int *flags, char *data)
 		sdp->sd_args.ar_posix_acls = FALSE;
 		sb->s_flags &= ~MS_POSIXACL;
 	}
+	sdp->sd_args.ar_noprefetch = args->ar_noprefetch;
 
 	if (*flags & (MS_NOATIME | MS_NODIRATIME))
 		set_bit(SDF_NOATIME, &sdp->sd_flags);
@@ -453,6 +454,8 @@ gfs_show_options(struct seq_file *s, struct vfsmount *mnt)
 		seq_printf(s, ",noquota");
 	if (args->ar_suiddir)
 		seq_printf(s, ",suiddir");
+	if (args->ar_noprefetch)
+		seq_printf(s, ",noprefetch");
 	if (args->ar_errors) {
 		seq_printf(s, ",errors=");
 		if (args->ar_errors == GFS_ERRORS_PANIC)


More information about the cluster-commits mailing list