* [Cluster-devel] [PATCH] GFS2: Improve statfs and quota usability, try 3
@ 2009-10-20 7:39 Benjamin Marzinski
2009-10-21 16:32 ` Steven Whitehouse
0 siblings, 1 reply; 2+ messages in thread
From: Benjamin Marzinski @ 2009-10-20 7:39 UTC (permalink / raw)
To: cluster-devel.redhat.com
GFS2 now has three new mount options, statfs_quantum, quota_quantum and
statfs_percent. statfs_quantum and quota_quantum simply allow you to
set the tunables of the same name. Setting setting statfs_quantum to 0
will also turn on the statfs_slow tunable. statfs_percent accepts an
integer between 0 and 100. Numbers between 1 and 100 will cause GFS2 to
do any early sync when the local number of blocks free changes by at
least statfs_percent from the totoal number of blocks free. Setting
statfs_percent to 0 disables this.
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
---
fs/gfs2/incore.h | 4 ++
fs/gfs2/ops_fstype.c | 14 ++++++++--
fs/gfs2/quota.c | 21 +++++++++++++--
fs/gfs2/quota.h | 2 +
fs/gfs2/super.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++---
5 files changed, 100 insertions(+), 10 deletions(-)
Index: gfs2-2.6-nmw/fs/gfs2/incore.h
===================================================================
--- gfs2-2.6-nmw.orig/fs/gfs2/incore.h
+++ gfs2-2.6-nmw/fs/gfs2/incore.h
@@ -430,6 +430,9 @@ struct gfs2_args {
unsigned int ar_discard:1; /* discard requests */
unsigned int ar_errors:2; /* errors=withdraw | panic */
int ar_commit; /* Commit interval */
+ int ar_statfs_quantum; /* The fast statfs interval */
+ int ar_quota_quantum; /* The quota interval */
+ int ar_statfs_percent; /* The % change to force sync */
};
struct gfs2_tune {
@@ -558,6 +561,7 @@ struct gfs2_sbd {
spinlock_t sd_statfs_spin;
struct gfs2_statfs_change_host sd_statfs_master;
struct gfs2_statfs_change_host sd_statfs_local;
+ int sd_statfs_force_sync;
/* Resource group stuff */
Index: gfs2-2.6-nmw/fs/gfs2/ops_fstype.c
===================================================================
--- gfs2-2.6-nmw.orig/fs/gfs2/ops_fstype.c
+++ gfs2-2.6-nmw/fs/gfs2/ops_fstype.c
@@ -63,13 +63,10 @@ static void gfs2_tune_init(struct gfs2_t
gt->gt_quota_warn_period = 10;
gt->gt_quota_scale_num = 1;
gt->gt_quota_scale_den = 1;
- gt->gt_quota_quantum = 60;
gt->gt_new_files_jdata = 0;
gt->gt_max_readahead = 1 << 18;
gt->gt_stall_secs = 600;
gt->gt_complain_secs = 10;
- gt->gt_statfs_quantum = 30;
- gt->gt_statfs_slow = 0;
}
static struct gfs2_sbd *init_sbd(struct super_block *sb)
@@ -1153,6 +1150,15 @@ static int fill_super(struct super_block
sdp->sd_fsb2bb = 1 << sdp->sd_fsb2bb_shift;
sdp->sd_tune.gt_log_flush_secs = sdp->sd_args.ar_commit;
+ sdp->sd_tune.gt_quota_quantum = sdp->sd_args.ar_quota_quantum;
+ if (sdp->sd_args.ar_statfs_quantum) {
+ sdp->sd_tune.gt_statfs_slow = 0;
+ sdp->sd_tune.gt_statfs_quantum = sdp->sd_args.ar_statfs_quantum;
+ }
+ else {
+ sdp->sd_tune.gt_statfs_slow = 1;
+ sdp->sd_tune.gt_statfs_quantum = 30;
+ }
error = init_names(sdp, silent);
if (error)
@@ -1308,6 +1314,8 @@ static int gfs2_get_sb(struct file_syste
args.ar_quota = GFS2_QUOTA_DEFAULT;
args.ar_data = GFS2_DATA_DEFAULT;
args.ar_commit = 60;
+ args.ar_statfs_quantum = 30;
+ args.ar_quota_quantum = 60;
args.ar_errors = GFS2_ERRORS_DEFAULT;
error = gfs2_mount_args(&args, data);
Index: gfs2-2.6-nmw/fs/gfs2/super.c
===================================================================
--- gfs2-2.6-nmw.orig/fs/gfs2/super.c
+++ gfs2-2.6-nmw/fs/gfs2/super.c
@@ -70,6 +70,9 @@ enum {
Opt_commit,
Opt_err_withdraw,
Opt_err_panic,
+ Opt_statfs_quantum,
+ Opt_statfs_percent,
+ Opt_quota_quantum,
Opt_error,
};
@@ -101,6 +104,9 @@ static const match_table_t tokens = {
{Opt_commit, "commit=%d"},
{Opt_err_withdraw, "errors=withdraw"},
{Opt_err_panic, "errors=panic"},
+ {Opt_statfs_quantum, "statfs_quantum=%d"},
+ {Opt_statfs_percent, "statfs_percent=%d"},
+ {Opt_quota_quantum, "quota_quantum=%d"},
{Opt_error, NULL}
};
@@ -214,6 +220,28 @@ int gfs2_mount_args(struct gfs2_args *ar
return rv ? rv : -EINVAL;
}
break;
+ case Opt_statfs_quantum:
+ rv = match_int(&tmp[0], &args->ar_statfs_quantum);
+ if (rv || args->ar_statfs_quantum < 0) {
+ printk(KERN_WARNING "GFS2: statfs_quantum mount option requires a non-negative numeric argument\n");
+ return rv ? rv : -EINVAL;
+ }
+ break;
+ case Opt_quota_quantum:
+ rv = match_int(&tmp[0], &args->ar_quota_quantum);
+ if (rv || args->ar_quota_quantum <= 0) {
+ printk(KERN_WARNING "GFS2: quota_quantum mount option requires a positive numeric argument\n");
+ return rv ? rv : -EINVAL;
+ }
+ break;
+ case Opt_statfs_percent:
+ rv = match_int(&tmp[0], &args->ar_statfs_percent);
+ if (rv || args->ar_statfs_percent < 0 ||
+ args->ar_statfs_percent > 100) {
+ printk(KERN_WARNING "statfs_percent mount option requires a numeric argument between 0 and 100\n");
+ return rv ? rv : -EINVAL;
+ }
+ break;
case Opt_err_withdraw:
args->ar_errors = GFS2_ERRORS_WITHDRAW;
break;
@@ -442,7 +470,9 @@ void gfs2_statfs_change(struct gfs2_sbd
{
struct gfs2_inode *l_ip = GFS2_I(sdp->sd_sc_inode);
struct gfs2_statfs_change_host *l_sc = &sdp->sd_statfs_local;
+ struct gfs2_statfs_change_host *m_sc = &sdp->sd_statfs_master;
struct buffer_head *l_bh;
+ int percent, sync_percent;
int error;
error = gfs2_meta_inode_buffer(l_ip, &l_bh);
@@ -456,9 +486,17 @@ void gfs2_statfs_change(struct gfs2_sbd
l_sc->sc_free += free;
l_sc->sc_dinodes += dinodes;
gfs2_statfs_change_out(l_sc, l_bh->b_data + sizeof(struct gfs2_dinode));
+ if (m_sc->sc_free)
+ percent = (100 * l_sc->sc_free) / m_sc->sc_free;
+ else
+ percent = 100;
spin_unlock(&sdp->sd_statfs_spin);
brelse(l_bh);
+ sync_percent = sdp->sd_args.ar_statfs_percent;
+ if (sync_percent && (percent >= sync_percent ||
+ percent <= -sync_percent))
+ gfs2_wake_up_statfs(sdp);
}
void update_statfs(struct gfs2_sbd *sdp, struct buffer_head *m_bh,
@@ -522,6 +560,7 @@ int gfs2_statfs_sync(struct super_block
goto out_bh2;
update_statfs(sdp, m_bh, l_bh);
+ sdp->sd_statfs_force_sync = 0;
gfs2_trans_end(sdp);
@@ -1062,6 +1101,11 @@ static int gfs2_remount_fs(struct super_
spin_lock(>->gt_spin);
args.ar_commit = gt->gt_log_flush_secs;
+ args.ar_quota_quantum = gt->gt_quota_quantum;
+ if (gt->gt_statfs_slow)
+ args.ar_statfs_quantum = 0;
+ else
+ args.ar_statfs_quantum = gt->gt_statfs_quantum;
spin_unlock(>->gt_spin);
error = gfs2_mount_args(&args, data);
if (error)
@@ -1100,6 +1144,15 @@ static int gfs2_remount_fs(struct super_
sb->s_flags &= ~MS_POSIXACL;
spin_lock(>->gt_spin);
gt->gt_log_flush_secs = args.ar_commit;
+ gt->gt_quota_quantum = args.ar_quota_quantum;
+ if (args.ar_statfs_quantum) {
+ gt->gt_statfs_slow = 0;
+ gt->gt_statfs_quantum = args.ar_statfs_quantum;
+ }
+ else {
+ gt->gt_statfs_slow = 1;
+ gt->gt_statfs_quantum = 30;
+ }
spin_unlock(>->gt_spin);
gfs2_online_uevent(sdp);
@@ -1180,7 +1233,7 @@ static int gfs2_show_options(struct seq_
{
struct gfs2_sbd *sdp = mnt->mnt_sb->s_fs_info;
struct gfs2_args *args = &sdp->sd_args;
- int lfsecs;
+ int val;
if (is_ancestor(mnt->mnt_root, sdp->sd_master_dir))
seq_printf(s, ",meta");
@@ -1241,9 +1294,17 @@ static int gfs2_show_options(struct seq_
}
if (args->ar_discard)
seq_printf(s, ",discard");
- lfsecs = sdp->sd_tune.gt_log_flush_secs;
- if (lfsecs != 60)
- seq_printf(s, ",commit=%d", lfsecs);
+ val = sdp->sd_tune.gt_log_flush_secs;
+ if (val != 60)
+ seq_printf(s, ",commit=%d", val);
+ val = sdp->sd_tune.gt_statfs_quantum;
+ if (val != 30)
+ seq_printf(s, ",statfs_quantum=%d", val);
+ val = sdp->sd_tune.gt_quota_quantum;
+ if (val != 60)
+ seq_printf(s, ",quota_quantum=%d", val);
+ if (args->ar_statfs_percent)
+ seq_printf(s, ",statfs_percent=%d", args->ar_statfs_percent);
if (args->ar_errors != GFS2_ERRORS_DEFAULT) {
const char *state;
Index: gfs2-2.6-nmw/fs/gfs2/quota.c
===================================================================
--- gfs2-2.6-nmw.orig/fs/gfs2/quota.c
+++ gfs2-2.6-nmw/fs/gfs2/quota.c
@@ -1336,6 +1336,14 @@ static void quotad_check_trunc_list(stru
}
}
+void gfs2_wake_up_statfs(struct gfs2_sbd *sdp) {
+ if (!sdp->sd_statfs_force_sync) {
+ sdp->sd_statfs_force_sync = 1;
+ wake_up(&sdp->sd_quota_wait);
+ }
+}
+
+
/**
* gfs2_quotad - Write cached quota changes into the quota file
* @sdp: Pointer to GFS2 superblock
@@ -1355,8 +1363,15 @@ int gfs2_quotad(void *data)
while (!kthread_should_stop()) {
/* Update the master statfs file */
- quotad_check_timeo(sdp, "statfs", gfs2_statfs_sync, t,
- &statfs_timeo, &tune->gt_statfs_quantum);
+ if (sdp->sd_statfs_force_sync) {
+ int error = gfs2_statfs_sync(sdp->sd_vfs, 0);
+ quotad_error(sdp, "statfs", error);
+ statfs_timeo = gfs2_tune_get(sdp, gt_statfs_quantum) * HZ;
+ }
+ else
+ quotad_check_timeo(sdp, "statfs", gfs2_statfs_sync, t,
+ &statfs_timeo,
+ &tune->gt_statfs_quantum);
/* Update quota file */
quotad_check_timeo(sdp, "sync", gfs2_quota_sync, t,
@@ -1373,7 +1388,7 @@ int gfs2_quotad(void *data)
spin_lock(&sdp->sd_trunc_lock);
empty = list_empty(&sdp->sd_trunc_list);
spin_unlock(&sdp->sd_trunc_lock);
- if (empty)
+ if (empty && !sdp->sd_statfs_force_sync)
t -= schedule_timeout(t);
else
t = 0;
Index: gfs2-2.6-nmw/fs/gfs2/quota.h
===================================================================
--- gfs2-2.6-nmw.orig/fs/gfs2/quota.h
+++ gfs2-2.6-nmw/fs/gfs2/quota.h
@@ -32,6 +32,8 @@ extern int gfs2_quota_init(struct gfs2_s
extern void gfs2_quota_cleanup(struct gfs2_sbd *sdp);
extern int gfs2_quotad(void *data);
+extern void gfs2_wake_up_statfs(struct gfs2_sbd *sdp);
+
static inline int gfs2_quota_lock_check(struct gfs2_inode *ip)
{
struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
^ permalink raw reply [flat|nested] 2+ messages in thread
* [Cluster-devel] [PATCH] GFS2: Improve statfs and quota usability, try 3
2009-10-20 7:39 [Cluster-devel] [PATCH] GFS2: Improve statfs and quota usability, try 3 Benjamin Marzinski
@ 2009-10-21 16:32 ` Steven Whitehouse
0 siblings, 0 replies; 2+ messages in thread
From: Steven Whitehouse @ 2009-10-21 16:32 UTC (permalink / raw)
To: cluster-devel.redhat.com
Hi,
Now in the -nmw tree. Thanks,
Steve.
On Tue, 2009-10-20 at 02:39 -0500, Benjamin Marzinski wrote:
> GFS2 now has three new mount options, statfs_quantum, quota_quantum and
> statfs_percent. statfs_quantum and quota_quantum simply allow you to
> set the tunables of the same name. Setting setting statfs_quantum to 0
> will also turn on the statfs_slow tunable. statfs_percent accepts an
> integer between 0 and 100. Numbers between 1 and 100 will cause GFS2 to
> do any early sync when the local number of blocks free changes by at
> least statfs_percent from the totoal number of blocks free. Setting
> statfs_percent to 0 disables this.
>
> Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
> ---
> fs/gfs2/incore.h | 4 ++
> fs/gfs2/ops_fstype.c | 14 ++++++++--
> fs/gfs2/quota.c | 21 +++++++++++++--
> fs/gfs2/quota.h | 2 +
> fs/gfs2/super.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++---
> 5 files changed, 100 insertions(+), 10 deletions(-)
>
> Index: gfs2-2.6-nmw/fs/gfs2/incore.h
> ===================================================================
> --- gfs2-2.6-nmw.orig/fs/gfs2/incore.h
> +++ gfs2-2.6-nmw/fs/gfs2/incore.h
> @@ -430,6 +430,9 @@ struct gfs2_args {
> unsigned int ar_discard:1; /* discard requests */
> unsigned int ar_errors:2; /* errors=withdraw | panic */
> int ar_commit; /* Commit interval */
> + int ar_statfs_quantum; /* The fast statfs interval */
> + int ar_quota_quantum; /* The quota interval */
> + int ar_statfs_percent; /* The % change to force sync */
> };
>
> struct gfs2_tune {
> @@ -558,6 +561,7 @@ struct gfs2_sbd {
> spinlock_t sd_statfs_spin;
> struct gfs2_statfs_change_host sd_statfs_master;
> struct gfs2_statfs_change_host sd_statfs_local;
> + int sd_statfs_force_sync;
>
> /* Resource group stuff */
>
> Index: gfs2-2.6-nmw/fs/gfs2/ops_fstype.c
> ===================================================================
> --- gfs2-2.6-nmw.orig/fs/gfs2/ops_fstype.c
> +++ gfs2-2.6-nmw/fs/gfs2/ops_fstype.c
> @@ -63,13 +63,10 @@ static void gfs2_tune_init(struct gfs2_t
> gt->gt_quota_warn_period = 10;
> gt->gt_quota_scale_num = 1;
> gt->gt_quota_scale_den = 1;
> - gt->gt_quota_quantum = 60;
> gt->gt_new_files_jdata = 0;
> gt->gt_max_readahead = 1 << 18;
> gt->gt_stall_secs = 600;
> gt->gt_complain_secs = 10;
> - gt->gt_statfs_quantum = 30;
> - gt->gt_statfs_slow = 0;
> }
>
> static struct gfs2_sbd *init_sbd(struct super_block *sb)
> @@ -1153,6 +1150,15 @@ static int fill_super(struct super_block
> sdp->sd_fsb2bb = 1 << sdp->sd_fsb2bb_shift;
>
> sdp->sd_tune.gt_log_flush_secs = sdp->sd_args.ar_commit;
> + sdp->sd_tune.gt_quota_quantum = sdp->sd_args.ar_quota_quantum;
> + if (sdp->sd_args.ar_statfs_quantum) {
> + sdp->sd_tune.gt_statfs_slow = 0;
> + sdp->sd_tune.gt_statfs_quantum = sdp->sd_args.ar_statfs_quantum;
> + }
> + else {
> + sdp->sd_tune.gt_statfs_slow = 1;
> + sdp->sd_tune.gt_statfs_quantum = 30;
> + }
>
> error = init_names(sdp, silent);
> if (error)
> @@ -1308,6 +1314,8 @@ static int gfs2_get_sb(struct file_syste
> args.ar_quota = GFS2_QUOTA_DEFAULT;
> args.ar_data = GFS2_DATA_DEFAULT;
> args.ar_commit = 60;
> + args.ar_statfs_quantum = 30;
> + args.ar_quota_quantum = 60;
> args.ar_errors = GFS2_ERRORS_DEFAULT;
>
> error = gfs2_mount_args(&args, data);
> Index: gfs2-2.6-nmw/fs/gfs2/super.c
> ===================================================================
> --- gfs2-2.6-nmw.orig/fs/gfs2/super.c
> +++ gfs2-2.6-nmw/fs/gfs2/super.c
> @@ -70,6 +70,9 @@ enum {
> Opt_commit,
> Opt_err_withdraw,
> Opt_err_panic,
> + Opt_statfs_quantum,
> + Opt_statfs_percent,
> + Opt_quota_quantum,
> Opt_error,
> };
>
> @@ -101,6 +104,9 @@ static const match_table_t tokens = {
> {Opt_commit, "commit=%d"},
> {Opt_err_withdraw, "errors=withdraw"},
> {Opt_err_panic, "errors=panic"},
> + {Opt_statfs_quantum, "statfs_quantum=%d"},
> + {Opt_statfs_percent, "statfs_percent=%d"},
> + {Opt_quota_quantum, "quota_quantum=%d"},
> {Opt_error, NULL}
> };
>
> @@ -214,6 +220,28 @@ int gfs2_mount_args(struct gfs2_args *ar
> return rv ? rv : -EINVAL;
> }
> break;
> + case Opt_statfs_quantum:
> + rv = match_int(&tmp[0], &args->ar_statfs_quantum);
> + if (rv || args->ar_statfs_quantum < 0) {
> + printk(KERN_WARNING "GFS2: statfs_quantum mount option requires a non-negative numeric argument\n");
> + return rv ? rv : -EINVAL;
> + }
> + break;
> + case Opt_quota_quantum:
> + rv = match_int(&tmp[0], &args->ar_quota_quantum);
> + if (rv || args->ar_quota_quantum <= 0) {
> + printk(KERN_WARNING "GFS2: quota_quantum mount option requires a positive numeric argument\n");
> + return rv ? rv : -EINVAL;
> + }
> + break;
> + case Opt_statfs_percent:
> + rv = match_int(&tmp[0], &args->ar_statfs_percent);
> + if (rv || args->ar_statfs_percent < 0 ||
> + args->ar_statfs_percent > 100) {
> + printk(KERN_WARNING "statfs_percent mount option requires a numeric argument between 0 and 100\n");
> + return rv ? rv : -EINVAL;
> + }
> + break;
> case Opt_err_withdraw:
> args->ar_errors = GFS2_ERRORS_WITHDRAW;
> break;
> @@ -442,7 +470,9 @@ void gfs2_statfs_change(struct gfs2_sbd
> {
> struct gfs2_inode *l_ip = GFS2_I(sdp->sd_sc_inode);
> struct gfs2_statfs_change_host *l_sc = &sdp->sd_statfs_local;
> + struct gfs2_statfs_change_host *m_sc = &sdp->sd_statfs_master;
> struct buffer_head *l_bh;
> + int percent, sync_percent;
> int error;
>
> error = gfs2_meta_inode_buffer(l_ip, &l_bh);
> @@ -456,9 +486,17 @@ void gfs2_statfs_change(struct gfs2_sbd
> l_sc->sc_free += free;
> l_sc->sc_dinodes += dinodes;
> gfs2_statfs_change_out(l_sc, l_bh->b_data + sizeof(struct gfs2_dinode));
> + if (m_sc->sc_free)
> + percent = (100 * l_sc->sc_free) / m_sc->sc_free;
> + else
> + percent = 100;
> spin_unlock(&sdp->sd_statfs_spin);
>
> brelse(l_bh);
> + sync_percent = sdp->sd_args.ar_statfs_percent;
> + if (sync_percent && (percent >= sync_percent ||
> + percent <= -sync_percent))
> + gfs2_wake_up_statfs(sdp);
> }
>
> void update_statfs(struct gfs2_sbd *sdp, struct buffer_head *m_bh,
> @@ -522,6 +560,7 @@ int gfs2_statfs_sync(struct super_block
> goto out_bh2;
>
> update_statfs(sdp, m_bh, l_bh);
> + sdp->sd_statfs_force_sync = 0;
>
> gfs2_trans_end(sdp);
>
> @@ -1062,6 +1101,11 @@ static int gfs2_remount_fs(struct super_
>
> spin_lock(>->gt_spin);
> args.ar_commit = gt->gt_log_flush_secs;
> + args.ar_quota_quantum = gt->gt_quota_quantum;
> + if (gt->gt_statfs_slow)
> + args.ar_statfs_quantum = 0;
> + else
> + args.ar_statfs_quantum = gt->gt_statfs_quantum;
> spin_unlock(>->gt_spin);
> error = gfs2_mount_args(&args, data);
> if (error)
> @@ -1100,6 +1144,15 @@ static int gfs2_remount_fs(struct super_
> sb->s_flags &= ~MS_POSIXACL;
> spin_lock(>->gt_spin);
> gt->gt_log_flush_secs = args.ar_commit;
> + gt->gt_quota_quantum = args.ar_quota_quantum;
> + if (args.ar_statfs_quantum) {
> + gt->gt_statfs_slow = 0;
> + gt->gt_statfs_quantum = args.ar_statfs_quantum;
> + }
> + else {
> + gt->gt_statfs_slow = 1;
> + gt->gt_statfs_quantum = 30;
> + }
> spin_unlock(>->gt_spin);
>
> gfs2_online_uevent(sdp);
> @@ -1180,7 +1233,7 @@ static int gfs2_show_options(struct seq_
> {
> struct gfs2_sbd *sdp = mnt->mnt_sb->s_fs_info;
> struct gfs2_args *args = &sdp->sd_args;
> - int lfsecs;
> + int val;
>
> if (is_ancestor(mnt->mnt_root, sdp->sd_master_dir))
> seq_printf(s, ",meta");
> @@ -1241,9 +1294,17 @@ static int gfs2_show_options(struct seq_
> }
> if (args->ar_discard)
> seq_printf(s, ",discard");
> - lfsecs = sdp->sd_tune.gt_log_flush_secs;
> - if (lfsecs != 60)
> - seq_printf(s, ",commit=%d", lfsecs);
> + val = sdp->sd_tune.gt_log_flush_secs;
> + if (val != 60)
> + seq_printf(s, ",commit=%d", val);
> + val = sdp->sd_tune.gt_statfs_quantum;
> + if (val != 30)
> + seq_printf(s, ",statfs_quantum=%d", val);
> + val = sdp->sd_tune.gt_quota_quantum;
> + if (val != 60)
> + seq_printf(s, ",quota_quantum=%d", val);
> + if (args->ar_statfs_percent)
> + seq_printf(s, ",statfs_percent=%d", args->ar_statfs_percent);
> if (args->ar_errors != GFS2_ERRORS_DEFAULT) {
> const char *state;
>
> Index: gfs2-2.6-nmw/fs/gfs2/quota.c
> ===================================================================
> --- gfs2-2.6-nmw.orig/fs/gfs2/quota.c
> +++ gfs2-2.6-nmw/fs/gfs2/quota.c
> @@ -1336,6 +1336,14 @@ static void quotad_check_trunc_list(stru
> }
> }
>
> +void gfs2_wake_up_statfs(struct gfs2_sbd *sdp) {
> + if (!sdp->sd_statfs_force_sync) {
> + sdp->sd_statfs_force_sync = 1;
> + wake_up(&sdp->sd_quota_wait);
> + }
> +}
> +
> +
> /**
> * gfs2_quotad - Write cached quota changes into the quota file
> * @sdp: Pointer to GFS2 superblock
> @@ -1355,8 +1363,15 @@ int gfs2_quotad(void *data)
> while (!kthread_should_stop()) {
>
> /* Update the master statfs file */
> - quotad_check_timeo(sdp, "statfs", gfs2_statfs_sync, t,
> - &statfs_timeo, &tune->gt_statfs_quantum);
> + if (sdp->sd_statfs_force_sync) {
> + int error = gfs2_statfs_sync(sdp->sd_vfs, 0);
> + quotad_error(sdp, "statfs", error);
> + statfs_timeo = gfs2_tune_get(sdp, gt_statfs_quantum) * HZ;
> + }
> + else
> + quotad_check_timeo(sdp, "statfs", gfs2_statfs_sync, t,
> + &statfs_timeo,
> + &tune->gt_statfs_quantum);
>
> /* Update quota file */
> quotad_check_timeo(sdp, "sync", gfs2_quota_sync, t,
> @@ -1373,7 +1388,7 @@ int gfs2_quotad(void *data)
> spin_lock(&sdp->sd_trunc_lock);
> empty = list_empty(&sdp->sd_trunc_list);
> spin_unlock(&sdp->sd_trunc_lock);
> - if (empty)
> + if (empty && !sdp->sd_statfs_force_sync)
> t -= schedule_timeout(t);
> else
> t = 0;
> Index: gfs2-2.6-nmw/fs/gfs2/quota.h
> ===================================================================
> --- gfs2-2.6-nmw.orig/fs/gfs2/quota.h
> +++ gfs2-2.6-nmw/fs/gfs2/quota.h
> @@ -32,6 +32,8 @@ extern int gfs2_quota_init(struct gfs2_s
> extern void gfs2_quota_cleanup(struct gfs2_sbd *sdp);
> extern int gfs2_quotad(void *data);
>
> +extern void gfs2_wake_up_statfs(struct gfs2_sbd *sdp);
> +
> static inline int gfs2_quota_lock_check(struct gfs2_inode *ip)
> {
> struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2009-10-21 16:32 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-10-20 7:39 [Cluster-devel] [PATCH] GFS2: Improve statfs and quota usability, try 3 Benjamin Marzinski
2009-10-21 16:32 ` Steven Whitehouse
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).