xfs
[Top] [All Lists]

[PATCH] less AGs for single disks configs.

Subject: [PATCH] less AGs for single disks configs.
From: Niv Sardi <xaiki@xxxxxxxxxxxxx>
Date: Tue, 30 Oct 2007 12:26:35 +1100
This patch modifies get_subvol_stripe_wrapper() to return 0 on multi disk 
configs,
<0 on error, and >0 on single disk configs (Ideally I'd like it to be able to 
return the
count of disks or something more usefull).

it then uses the output of the new get_subvol_stripe_wrapper() in 
calc_default_ag_geometry()
to get bigger AGs when in single disk configs (currently only x2 bigger).
---
 xfsprogs/include/volume.h  |    2 +-
 xfsprogs/libdisk/drivers.c |   15 ++++++++-------
 xfsprogs/mkfs/xfs_mkfs.c   |   18 ++++++++++++------
 3 files changed, 21 insertions(+), 14 deletions(-)

diff --git a/xfsprogs/include/volume.h b/xfsprogs/include/volume.h
index 0cc931d..e4cd26c 100644
--- a/xfsprogs/include/volume.h
+++ b/xfsprogs/include/volume.h
@@ -46,7 +46,7 @@ typedef enum sv_type_e {
        SVTYPE_LAST             =255
 } sv_type_t;
 
-extern void get_subvol_stripe_wrapper (char *, sv_type_t, int *, int *, int *);
+extern int  get_subvol_stripe_wrapper (char *, sv_type_t, int *, int *, int *);
 extern int  get_driver_block_major (const char *, int);
 
 #endif /* __VOLUME_H__ */
diff --git a/xfsprogs/libdisk/drivers.c b/xfsprogs/libdisk/drivers.c
index 26c6ec1..9bdc270 100644
--- a/xfsprogs/libdisk/drivers.c
+++ b/xfsprogs/libdisk/drivers.c
@@ -18,7 +18,7 @@
 
 #include "drivers.h"
 
-void
+int
 get_subvol_stripe_wrapper(
        char            *dev,
        sv_type_t       type,
@@ -29,7 +29,7 @@ get_subvol_stripe_wrapper(
        struct stat64   sb;
 
        if (dev == NULL)
-               return;
+               return -ENODEV;
 
        if (stat64(dev, &sb)) {
                fprintf(stderr, _("Cannot stat %s: %s\n"),
@@ -38,16 +38,17 @@ get_subvol_stripe_wrapper(
        }
 
        if (  dm_get_subvol_stripe(dev, type, sunit, swidth, sectalign, &sb))
-               return;
+               return 0;
        if (  md_get_subvol_stripe(dev, type, sunit, swidth, sectalign, &sb))
-               return;
+               return 0;
        if ( lvm_get_subvol_stripe(dev, type, sunit, swidth, sectalign, &sb))
-               return;
+               return 0;
        if ( xvm_get_subvol_stripe(dev, type, sunit, swidth, sectalign, &sb))
-               return;
+               return 0;
        if (evms_get_subvol_stripe(dev, type, sunit, swidth, sectalign, &sb))
-               return;
+               return 0;
 
+       return 1;
        /* ... add new device drivers here */
 }
 
diff --git a/xfsprogs/mkfs/xfs_mkfs.c b/xfsprogs/mkfs/xfs_mkfs.c
index 78c2c77..1eb8cf9 100644
--- a/xfsprogs/mkfs/xfs_mkfs.c
+++ b/xfsprogs/mkfs/xfs_mkfs.c
@@ -393,6 +393,7 @@ void
 calc_default_ag_geometry(
        int             blocklog,
        __uint64_t      dblocks,
+       int             dswidth,
        __uint64_t      *agsize,
        __uint64_t      *agcount)
 {
@@ -428,12 +429,13 @@ calc_default_ag_geometry(
         *
         * This scales us up smoothly between min/max AG sizes.
         */
+
        if (dblocks > GIGABYTES(512, blocklog))
-               shift = 5;
+               shift = 5 - (dswidth == 0);
        else if (dblocks > GIGABYTES(8, blocklog))
-               shift = 4;
+               shift = 4 - (dswidth == 0);
        else if (dblocks >= MEGABYTES(128, blocklog))
-               shift = 3;
+               shift = 3 - (dswidth == 0);
        else
                ASSERT(0);
        blocks = dblocks >> shift;
@@ -1771,10 +1773,14 @@ _("size %s specified for log subvolume is too large, 
maximum is %lld blocks\n"),
                agsize /= blocksize;
                agcount = dblocks / agsize + (dblocks % agsize != 0);
 
-       } else if (daflag)      /* User-specified AG size */
+       } else if (daflag)      /* User-specified AG count */
                agsize = dblocks / agcount + (dblocks % agcount != 0);
-       else
-               calc_default_ag_geometry(blocklog, dblocks, &agsize, &agcount);
+       else {
+               get_subvol_stripe_wrapper(dfile, SVTYPE_DATA,
+                               &xlv_dsunit, &xlv_dswidth, &sectoralign);
+
+               calc_default_ag_geometry(blocklog, dblocks, xlv_dswidth, 
&agsize, &agcount);
+       }
 
        /*
         * If the last AG is too small, reduce the filesystem size
-- 
1.5.3.4


--azLHFNyN32YCQGCU--


<Prev in Thread] Current Thread [Next in Thread>
  • [PATCH] less AGs for single disks configs., Niv Sardi <=