]> Pileus Git - ~andy/linux/blobdiff - fs/gfs2/super.c
GFS2: Display nobarrier option in /proc/mounts
[~andy/linux] / fs / gfs2 / super.c
index 3fee2fd3ae436a7117c42884833522f2c2ed7834..c282ad41f3d1860bba4301495a7303de40b57d06 100644 (file)
@@ -73,6 +73,8 @@ enum {
        Opt_statfs_quantum,
        Opt_statfs_percent,
        Opt_quota_quantum,
+       Opt_barrier,
+       Opt_nobarrier,
        Opt_error,
 };
 
@@ -107,6 +109,8 @@ static const match_table_t tokens = {
        {Opt_statfs_quantum, "statfs_quantum=%d"},
        {Opt_statfs_percent, "statfs_percent=%d"},
        {Opt_quota_quantum, "quota_quantum=%d"},
+       {Opt_barrier, "barrier"},
+       {Opt_nobarrier, "nobarrier"},
        {Opt_error, NULL}
 };
 
@@ -253,6 +257,12 @@ int gfs2_mount_args(struct gfs2_args *args, char *options)
                        }
                        args->ar_errors = GFS2_ERRORS_PANIC;
                        break;
+               case Opt_barrier:
+                       args->ar_nobarrier = 0;
+                       break;
+               case Opt_nobarrier:
+                       args->ar_nobarrier = 1;
+                       break;
                case Opt_error:
                default:
                        printk(KERN_WARNING "GFS2: invalid mount option: %s\n", o);
@@ -472,7 +482,8 @@ void gfs2_statfs_change(struct gfs2_sbd *sdp, s64 total, s64 free,
        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;
+       s64 x, y;
+       int need_sync = 0;
        int error;
 
        error = gfs2_meta_inode_buffer(l_ip, &l_bh);
@@ -486,16 +497,16 @@ void gfs2_statfs_change(struct gfs2_sbd *sdp, s64 total, s64 free,
        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;
+       if (sdp->sd_args.ar_statfs_percent) {
+               x = 100 * l_sc->sc_free;
+               y = m_sc->sc_free * sdp->sd_args.ar_statfs_percent;
+               if (x >= y || x <= -y)
+                       need_sync = 1;
+       }
        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))
+       if (need_sync)
                gfs2_wake_up_statfs(sdp);
 }
 
@@ -1142,6 +1153,10 @@ static int gfs2_remount_fs(struct super_block *sb, int *flags, char *data)
                sb->s_flags |= MS_POSIXACL;
        else
                sb->s_flags &= ~MS_POSIXACL;
+       if (sdp->sd_args.ar_nobarrier)
+               set_bit(SDF_NOBARRIERS, &sdp->sd_flags);
+       else
+               clear_bit(SDF_NOBARRIERS, &sdp->sd_flags);
        spin_lock(&gt->gt_spin);
        gt->gt_log_flush_secs = args.ar_commit;
        gt->gt_quota_quantum = args.ar_quota_quantum;
@@ -1321,6 +1336,9 @@ static int gfs2_show_options(struct seq_file *s, struct vfsmount *mnt)
                }
                seq_printf(s, ",errors=%s", state);
        }
+       if (test_bit(SDF_NOBARRIERS, &sdp->sd_flags))
+               seq_printf(s, ",nobarrier");
+
        return 0;
 }