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