Re: [ogfs-dev]RFC: Reclaim the excess freemeta blocks
Dear Dominik,
Here is the patch for printing rgrp statistics info and reclaiming free
metadata blocks in a spcific rgrp.
Any comments ?
Best Regards,
Stan
--
Opinions expressed are those of the author and do not represent Intel
Corporation
"gpg --recv-keys --keyserver wwwkeys.pgp.net E1390A7F"
{E1390A7F:3AD1 1B0C 2019 E183 0CFF 55E8 369A 8B75 E139 0A7F}
? kernel_patches/2.4.21/Makefile
? kernel_patches/2.4.21/Makefile.in
Index: man/ogfs_tool.8
===================================================================
RCS file: /cvsroot/opengfs/opengfs/man/ogfs_tool.8,v
retrieving revision 1.2
diff -a -u -r1.2 ogfs_tool.8
--- man/ogfs_tool.8 9 Jul 2003 08:02:13 -0000 1.2
+++ man/ogfs_tool.8 11 Jul 2003 11:16:18 -0000
@@ -23,6 +23,11 @@
printed is more detailed than a standard "df".
.in
.sp
+\fBrgrpstat\fP \fIMountPoint\fR \fI[rnum]\fR
+.in +5
+Print out the statistics info of a given resource group.
+.in
+.sp
\fBdbprint\fP
.in +5
Print out a list of debugging flags that can be turned on and off in OpenGFS.
@@ -74,7 +79,12 @@
Causes any unused inodes to be thrown out of memory.
.in
.sp
-\fBreclaim\fP \fIMountPoint\fR
+\fBreclaimone\fP \fIMountPoint\fR \fI[rnum]\fR
+.in +5
+Reclaim all freemeta blocks from one resource groups.
+.in
+.sp
+\fBreclaimall\fP \fIMountPoint\fR
.in +5
Reclaim all freemeta blocks from all resource groups.
.in
Index: src/fs/blklist.c
===================================================================
RCS file: /cvsroot/opengfs/opengfs/src/fs/blklist.c,v
retrieving revision 1.32
diff -a -u -r1.32 blklist.c
--- src/fs/blklist.c 9 Jul 2003 08:02:14 -0000 1.32
+++ src/fs/blklist.c 11 Jul 2003 11:16:19 -0000
@@ -2045,72 +2045,61 @@
/**
- * ogfs_reclaim_freemeta - reclaim excess free metadata block
+ * ogfs_reclaim_one - reclaim all free metadata block from one rgrp
* @sdp: the filesystem
- * @arg:
+ * @rnum: rgrp number
* */
-int ogfs_reclaim_freemeta(ogfs_sbd_t *sdp, void *arg)
+int ogfs_reclaim_one(ogfs_sbd_t *sdp, unsigned int rnum)
{
- int error, rnum;
- uint32 freemeta;
+ uint32 freemeta;
unsigned int buf;
uint32 length;
ogfs_bitmap_t *bits = NULL;
ogfs_rgrpd_t *rgd;
-
- error = ogfs_rindex_hold(sdp);
+ int error = 0;
+
+ rgd = ogfs_rgrpd_get_by_num(sdp, rnum);
+ if (rgd == NULL)
+ return error;
+
+ error = ogfs_glock_rg(rgd, 0);
if (error) {
+ ogfs_rgrpd_put(rgd);
return error;
}
-
- for ( rnum = 0 ; rnum < sdp->sd_rgcount; rnum++) {
-
- rgd = ogfs_rgrpd_get_by_num(sdp, rnum);
- if (rgd == NULL)
- continue;
- error = ogfs_glock_rg(rgd, 0);
+ length = rgd->rd_ri.ri_length;
+ freemeta = rgd->rd_rg.rg_freemeta;
+ if (freemeta > 0) {
+ error = ogfs_trans_begin(sdp, TRANS_BMAP, length + 1, 0);
if (error) {
- ogfs_rgrpd_put(rgd);
- continue;
- }
-
- length = rgd->rd_ri.ri_length;
- freemeta = rgd->rd_rg.rg_freemeta;
- if (freemeta > 0) {
- error = ogfs_trans_begin(sdp, TRANS_BMAP, length + 1, 0);
- if (error) {
- ogfs_gunlock_rg(rgd, 0);
- ogfs_rgrpd_put(rgd);
- ogfs_rindex_release(sdp);
- return error;
- }
- } else {
ogfs_gunlock_rg(rgd, 0);
ogfs_rgrpd_put(rgd);
- continue;
+ return error;
}
-
- for (buf = 0; buf < length; buf++) {
- bits = &rgd->rd_bits[buf];
- freemeta -= ogfs_travel_bitmap(BH_DATA(rgd->rd_bh[buf]) + bits->bi_offset,
- bits->bi_len, OGFS_BLKST_FREEMETA,
- OGFS_BLKST_FREE);
- ogfs_trans_add_bh(sdp, rgd->rd_bh[buf]);
- }
- rgd->rd_rg.rg_free += (rgd->rd_rg.rg_freemeta - freemeta);
- rgd->rd_rg.rg_freemeta = freemeta;
- ogfs_trans_add_bh(sdp, rgd->rd_bh[0]);
- ogfs_rgrp_out(&rgd->rd_rg, BH_DATA(rgd->rd_bh[0]));
- rgrp_lvb_own(rgd);
- set_bit(RDF_SYNC_B4_ALLOC, &rgd->rd_flags);
- ogfs_trans_end(sdp);
+ } else {
ogfs_gunlock_rg(rgd, 0);
ogfs_rgrpd_put(rgd);
- }
-
- ogfs_rindex_release(sdp);
+ return error;
+ }
+
+ for (buf = 0; buf < length; buf++) {
+ bits = &rgd->rd_bits[buf];
+ freemeta -= ogfs_travel_bitmap(BH_DATA(rgd->rd_bh[buf]) + bits->bi_offset,
+ bits->bi_len, OGFS_BLKST_FREEMETA,
+ OGFS_BLKST_FREE);
+ ogfs_trans_add_bh(sdp, rgd->rd_bh[buf]);
+ }
+ rgd->rd_rg.rg_free += (rgd->rd_rg.rg_freemeta - freemeta);
+ rgd->rd_rg.rg_freemeta = freemeta;
+ ogfs_trans_add_bh(sdp, rgd->rd_bh[0]);
+ ogfs_rgrp_out(&rgd->rd_rg, BH_DATA(rgd->rd_bh[0]));
+ rgrp_lvb_own(rgd);
+ set_bit(RDF_SYNC_B4_ALLOC, &rgd->rd_flags);
+ ogfs_trans_end(sdp);
+ ogfs_gunlock_rg(rgd, 0);
+ ogfs_rgrpd_put(rgd);
return error;
-
}
+
Index: src/fs/blklist.h
===================================================================
RCS file: /cvsroot/opengfs/opengfs/src/fs/blklist.h,v
retrieving revision 1.8
diff -a -u -r1.8 blklist.h
--- src/fs/blklist.h 9 Jul 2003 08:02:14 -0000 1.8
+++ src/fs/blklist.h 11 Jul 2003 11:16:19 -0000
@@ -62,6 +62,6 @@
int ogfs_rlist_add(ogfs_sbd_t * sdp, ogfs_rgrp_list_t * rlist, uint64 block);
void ogfs_rlist_sort(ogfs_rgrp_list_t * rlist);
void ogfs_rlist_free(ogfs_rgrp_list_t * rlist);
-int ogfs_reclaim_freemeta(ogfs_sbd_t *sdp, void *arg);
+int ogfs_reclaim_one(ogfs_sbd_t *sdp, unsigned int rnum);
#endif /* _BLKLIST_H */
Index: src/fs/ioctl.c
===================================================================
RCS file: /cvsroot/opengfs/opengfs/src/fs/ioctl.c,v
retrieving revision 1.18
diff -a -u -r1.18 ioctl.c
--- src/fs/ioctl.c 9 Jul 2003 08:02:14 -0000 1.18
+++ src/fs/ioctl.c 11 Jul 2003 11:16:19 -0000
@@ -417,12 +417,88 @@
}
/**
- * ogfs_reclaim_freemeta_ioctl - ioctl function for reclaiming excess
+ * ogfs_stat_rgrp_ioctl - Print out statistics info of a rgrp
+ * @sdp: the filesystem
+ * @arg: the ogfs_usage_t structure
+ *
+ * Returns: 0 on success, -EXXX on failure
+ */
+
+int
+ogfs_stat_rgrp_ioctl(ogfs_sbd_t * sdp, void *arg)
+{
+ ogfs_rgrpstat_t stat;
+ int error = 0;
+
+ if(copy_from_user(&stat, arg, sizeof(ogfs_rgrpstat_t))){
+ error = -EFAULT;
+ goto out;
+ };
+
+ memset(&(stat.usage), 0, sizeof(ogfs_usage_t));
+ stat.usage.block_size = sdp->sd_sb.sb_bsize;
+
+ error = ogfs_rindex_hold(sdp);
+ if (error) {
+ return error;
+ }
+
+ error = ogfs_stat_rgrp(sdp, stat.rnum, &(stat.usage));
+ if (error)
+ goto out;
+
+
+ if (copy_to_user(arg, &stat, sizeof(ogfs_rgrpstat_t)))
+ error = -EFAULT;
+
+out:
+ ogfs_rindex_release(sdp);
+ return error;
+}
+
+/**
+ * ogfs_reclaim_one_ioctl - ioctl function for reclaiming all free metadata
+ * block from one rgrp
+ * @sdp: the filesystem
+ * @arg: rgrp number
+ * */
+int ogfs_reclaim_one_ioctl(ogfs_sbd_t *sdp, void *arg)
+{
+ int error;
+ unsigned int rnum = *(unsigned int *)arg;
+
+ error = ogfs_rindex_hold(sdp);
+ if (error) {
+ return error;
+ }
+
+ error=ogfs_reclaim_one(sdp, rnum);
+
+ ogfs_rindex_release(sdp);
+ return error;
+}
+
+/**
+ * ogfs_reclaim_all_ioctl - ioctl function for reclaiming all
* free metadata block
* @sdp: the filesystem
- * @arg:
* */
-int ogfs_reclaim_freemeta_ioctl(ogfs_sbd_t *sdp, void *arg)
+int ogfs_reclaim_all_ioctl(ogfs_sbd_t *sdp)
{
- return ogfs_reclaim_freemeta(sdp, arg);
+ int error;
+ unsigned int rnum;
+
+ error = ogfs_rindex_hold(sdp);
+ if (error) {
+ return error;
+ }
+
+ for ( rnum = 0 ; rnum < sdp->sd_rgcount; rnum++) {
+ error=ogfs_reclaim_one(sdp, rnum);
+ if (error)
+ break;
+ }
+
+ ogfs_rindex_release(sdp);
+ return error;
}
Index: src/fs/ioctl.h
===================================================================
RCS file: /cvsroot/opengfs/opengfs/src/fs/ioctl.h,v
retrieving revision 1.5
diff -a -u -r1.5 ioctl.h
--- src/fs/ioctl.h 9 Jul 2003 08:02:14 -0000 1.5
+++ src/fs/ioctl.h 11 Jul 2003 11:16:19 -0000
@@ -25,7 +25,9 @@
int ogfs_jwrite_ioctl(ogfs_inode_t * ip, void *arg);
int ogfs_stat_ogfs_ioctl(ogfs_sbd_t * sdp, void *arg);
+int ogfs_stat_rgrp_ioctl(ogfs_sbd_t * sdp, void *arg);
-int ogfs_reclaim_freemeta_ioctl(ogfs_sbd_t * sdp, void *arg);
+int ogfs_reclaim_one_ioctl(ogfs_sbd_t * sdp, void *arg);
+int ogfs_reclaim_all_ioctl(ogfs_sbd_t * sdp);
#endif /* _IOCTL_H */
Index: src/fs/ogfs_ioctl.h
===================================================================
RCS file: /cvsroot/opengfs/opengfs/src/fs/ogfs_ioctl.h,v
retrieving revision 1.4
diff -a -u -r1.4 ogfs_ioctl.h
--- src/fs/ogfs_ioctl.h 9 Jul 2003 08:02:14 -0000 1.4
+++ src/fs/ogfs_ioctl.h 11 Jul 2003 11:16:19 -0000
@@ -15,25 +15,27 @@
/* Ioctls implemented */
-#define OGFS_DEBUG_ON _GFSC_(1)
-#define OGFS_DEBUG_OFF _GFSC_(2)
-#define OGFS_DEBUG_DUMP _GFSC_(3)
+#define OGFS_DEBUG_ON _GFSC_(1)
+#define OGFS_DEBUG_OFF _GFSC_(2)
+#define OGFS_DEBUG_DUMP _GFSC_(3)
-#define OGFS_PRINT_FRAG _GFSC_(4)
-#define OGFS_SHRINK _GFSC_(5)
+#define OGFS_PRINT_FRAG _GFSC_(4)
+#define OGFS_SHRINK _GFSC_(5)
-#define OGFS_PROF_DUMP _GFSC_(6)
+#define OGFS_PROF_DUMP _GFSC_(6)
#define OGFS_OBYNUM _GFSC_(7)
#define OGFS_GET_SUPER _GFSC_(8)
-#define OGFS_JREAD _GFSC_(9)
-#define OGFS_JWRITE _GFSC_(10)
+#define OGFS_JREAD _GFSC_(9)
+#define OGFS_JWRITE _GFSC_(10)
-#define OGFS_LOCK_DUMP _GFSC_(11)
+#define OGFS_LOCK_DUMP _GFSC_(11)
-#define OGFS_STATGFS _GFSC_(12)
+#define OGFS_STATGFS _GFSC_(12)
+#define OGFS_STATRGRP _GFSC_(13)
-#define OGFS_RECLAIM_FREEMETA _GFSC_(13)
+#define OGFS_RECLAIM_ONE _GFSC_(14)
+#define OGFS_RECLAIM_ALL _GFSC_(15)
/* Structure for profiling ioctl() */
@@ -66,5 +68,12 @@
uint64 free_meta;
};
typedef struct ogfs_usage ogfs_usage_t;
+
+/* Structure for RGRP statistics info */
+struct ogfs_rgrpstat {
+ unsigned int rnum;
+ struct ogfs_usage usage;
+};
+typedef struct ogfs_rgrpstat ogfs_rgrpstat_t;
#endif /* _OGFS_IOCTL_H */
Index: src/fs/super.c
===================================================================
RCS file: /cvsroot/opengfs/opengfs/src/fs/super.c,v
retrieving revision 1.21
diff -a -u -r1.21 super.c
--- src/fs/super.c 23 May 2003 18:57:56 -0000 1.21
+++ src/fs/super.c 11 Jul 2003 11:16:19 -0000
@@ -752,6 +752,66 @@
}
/**
+ * ogfs_stat_rgrp - fill rgrp statistics info
+ * @sdp: the filesystem
+ * @rnum: rgrp number
+ * @usage: the usage structure
+ *
+ * Returns: 0 on success, -EXXX on failure
+ */
+
+int
+ogfs_stat_rgrp(ogfs_sbd_t * sdp, unsigned int rnum, ogfs_usage_t * usage)
+{
+ ogfs_rgrpd_t *rgd = NULL;
+ int error = 0;
+
+ rgd = ogfs_rgrpd_get_by_num(sdp, rnum);
+ if (!rgd)
+ return -ENOENT;
+
+ error = ogfs_glock_rg(rgd, GL_SHARED | GL_SKIP);
+ if (error) {
+ ogfs_rgrpd_put(rgd);
+ return error;
+ }
+ OGFS_ASSERT(rgd->rd_rs.rs_magic == OGFS_MAGIC,);
+
+ /* Either lvb has no owner or the current machine owns
+ * it. Everything is fine. */
+ if (!rgd->rd_rs.rs_owner
+ || rgd->rd_rs.rs_owner ==
+ sdp->sd_lockstruct.ls_jid + 1) {
+ IFDB(GFN_STAT_OGFS,
+ ogfs_rindex_print(&rgd->rd_ri, FALSE);
+ ogfs_rgrp_save_print(&rgd->rd_rs, FALSE);
+ );
+
+ usage->total_blocks += rgd->rd_ri.ri_data;
+ usage->free += rgd->rd_rs.rs_free;
+ usage->used_dinode += rgd->rd_rs.rs_useddi;
+ usage->free_dinode += rgd->rd_rs.rs_freedi;
+ usage->used_meta += rgd->rd_rs.rs_usedmeta;
+ usage->free_meta += rgd->rd_rs.rs_freemeta;
+
+ ogfs_gunlock_rg(rgd, GL_SKIP);
+
+ } else {
+ /* Another machine owns the lvb, i.e. it is
+ * crashed and the data is stal. Reinitialise
+ * it. */
+ ogfs_gunlock_rg(rgd, GL_SKIP);
+
+ error = ogfs_rgrp_lvb_init(rgd, TRUE);
+ }
+
+ ogfs_rgrpd_put(rgd);
+
+ return error;
+}
+
+
+/**
* ogfs_stat_ogfs - Do a statfs
* @sdp: the filesystem
* @usage: the usage structure
@@ -763,9 +823,8 @@
int
ogfs_stat_ogfs(ogfs_sbd_t * sdp, ogfs_usage_t * usage, int interruptible)
{
- ogfs_rgrpd_t *rgd = NULL;
- uint64 hint = 0;
- int error;
+ uint64 rnum;
+ int error = 0;
ENTER(GFN_STAT_OGFS);
@@ -774,60 +833,17 @@
error = ogfs_rindex_hold(sdp);
if (error)
- goto fail;
+ return error;
- for (;;) {
- rgd = ogfs_rgrpd_get_with_hint(sdp, hint);
- if (!rgd)
+ for ( rnum = 0 ; rnum < sdp->sd_rgcount; rnum++) {
+ error = ogfs_stat_rgrp(sdp, rnum, usage);
+
+ if (error)
break;
-
- for (;;) {
- error = ogfs_glock_rg(rgd, GL_SHARED | GL_SKIP);
- if (error)
- goto fail_rgrpd_put;
-
- OGFS_ASSERT(rgd->rd_rs.rs_magic == OGFS_MAGIC,);
-
- /* Either lvb has no owner or the current machine owns
- * it. Everything is fine. */
- if (!rgd->rd_rs.rs_owner
- || rgd->rd_rs.rs_owner ==
- sdp->sd_lockstruct.ls_jid + 1) {
- IFDB(GFN_STAT_OGFS,
- ogfs_rindex_print(&rgd->rd_ri, FALSE);
- ogfs_rgrp_save_print(&rgd->rd_rs, FALSE);
- );
-
- usage->total_blocks += rgd->rd_ri.ri_data;
- usage->free += rgd->rd_rs.rs_free;
- usage->used_dinode += rgd->rd_rs.rs_useddi;
- usage->free_dinode += rgd->rd_rs.rs_freedi;
- usage->used_meta += rgd->rd_rs.rs_usedmeta;
- usage->free_meta += rgd->rd_rs.rs_freemeta;
-
- ogfs_gunlock_rg(rgd, GL_SKIP);
-
- break;
- } else {
- /* Another machine owns the lvb, i.e. it is
- * crashed and the data is stal. Reinitialise
- * it. */
- ogfs_gunlock_rg(rgd, GL_SKIP);
-
- error = ogfs_rgrp_lvb_init(rgd, TRUE);
- if (error)
- goto fail_rgrpd_put;
-
- continue;
- }
- }
-
- hint = rgd->rd_ri.ri_addr + 1;
- ogfs_rgrpd_put(rgd);
-
+
if (interruptible && osi_pending_signals()) {
error = -ERESTARTSYS;
- goto fail_rindex_relse;
+ break;
}
}
@@ -835,15 +851,5 @@
EXIT(GFN_STAT_OGFS);
- return 0;
-
- fail_rgrpd_put:
- ogfs_rgrpd_put(rgd);
-
- fail_rindex_relse:
- ogfs_rindex_release(sdp);
-
- fail:
- EXIT(GFN_STAT_OGFS);
return error;
}
Index: src/fs/super.h
===================================================================
RCS file: /cvsroot/opengfs/opengfs/src/fs/super.h,v
retrieving revision 1.5
diff -a -u -r1.5 super.h
--- src/fs/super.h 4 Mar 2003 10:51:15 -0000 1.5
+++ src/fs/super.h 11 Jul 2003 11:16:20 -0000
@@ -32,6 +32,7 @@
int ogfs_update_datarget(ogfs_sbd_t * sdp, ogfs_ipreserv_t * res);
int ogfs_stat_ogfs(ogfs_sbd_t * sdp, ogfs_usage_t * usage, int interruptible);
+int ogfs_stat_rgrp(ogfs_sbd_t * sdp, unsigned int rnum, ogfs_usage_t * usage);
/* These are architecture specific functions
Either implement them or stub them out in your arch_* directory. */
Index: src/fs/arch_linux_2_4/file.c
===================================================================
RCS file: /cvsroot/opengfs/opengfs/src/fs/arch_linux_2_4/file.c,v
retrieving revision 1.18
diff -a -u -r1.18 file.c
--- src/fs/arch_linux_2_4/file.c 9 Jul 2003 08:02:14 -0000 1.18
+++ src/fs/arch_linux_2_4/file.c 11 Jul 2003 11:16:20 -0000
@@ -881,9 +881,19 @@
error = ogfs_stat_ogfs_ioctl(sdp, (void *) arg);
break;
- case OGFS_RECLAIM_FREEMETA:
+ case OGFS_STATRGRP:
+ error = ogfs_stat_rgrp_ioctl(sdp, (void *) arg);
+ break;
+
+ case OGFS_RECLAIM_ONE:
lock_kernel();
- error = ogfs_reclaim_freemeta_ioctl(sdp, (void *) arg);
+ error = ogfs_reclaim_one_ioctl(sdp, (void*) arg);
+ unlock_kernel();
+ break;
+
+ case OGFS_RECLAIM_ALL:
+ lock_kernel();
+ error = ogfs_reclaim_all_ioctl(sdp);
unlock_kernel();
break;
Index: src/tools/ogfs_tool/main.c
===================================================================
RCS file: /cvsroot/opengfs/opengfs/src/tools/ogfs_tool/main.c,v
retrieving revision 1.9
diff -a -u -r1.9 main.c
--- src/tools/ogfs_tool/main.c 9 Jul 2003 08:02:15 -0000 1.9
+++ src/tools/ogfs_tool/main.c 11 Jul 2003 11:16:20 -0000
@@ -67,8 +67,11 @@
"Shrink the Linux Dcache for a file system:\n",
" ogfs_tool shrink <filename>\n",
"\n",
- "Reclaim the excess free metadata blocks:\n",
- " ogfs_tool reclaim <filename>\n",
+ "Reclaim all the free metadata blocks from one rgrp:\n",
+ " ogfs_tool reclaimone <filename> rgrp_num\n",
+ "\n",
+ "Reclaim all the free metadata blocks:\n",
+ " ogfs_tool reclaimall <filename>\n",
"\n",
"Have OGFS dump its lock state:\n",
" ogfs_tool lockdump <OGFS_directory>\n",
@@ -76,6 +79,9 @@
"Do an OGFS specific \"df\"\n",
" ogfs_tool df <OGFS_directory>\n",
"\n",
+ "Print rgrp statistics info\n",
+ " ogfs_tool rgrpstat <OGFS_directory> rgrp_num\n",
+ "\n",
"Tune an OGFS superblock\n",
" ogfs_tool sb device proto [newval]\n",
" ogfs_tool sb device table [newval]\n",
@@ -213,6 +219,82 @@
close(fd);
}
+/* dump_usage()
+ *
+ * Description:
+ * Decode and dump usage info for FS.
+ *
+ * Input(s):
+ * usage - ogfs_usage_t struct.
+ * */
+
+void dump_usage(ogfs_usage_t usage)
+{
+ uint64 used_data;
+
+ used_data = usage.total_blocks - usage.free -
+ (usage.used_dinode + usage.free_dinode) -
+ (usage.used_meta + usage.free_meta);
+
+
+ printf("Block size = %u\n", usage.block_size);
+ printf("%-15s%-15s%-15s%-15s%-15s\n", "Type", "Total", "Used",
+ "Free", "use%");
+ printf("------------------------------------------------------------------------\n");
+ printf("%-15s%-15" FMT_64 "u%-15" FMT_64 "u%-15" FMT_64 "u%u%%\n",
+ "inodes", usage.used_dinode + usage.free_dinode,
+ usage.used_dinode, usage.free_dinode,
+ (unsigned int) (100.0 * usage.used_dinode /
+ (usage.used_dinode + usage.free_dinode) +
+ 0.5));
+ printf("%-15s%-15" FMT_64 "u%-15" FMT_64 "u%-15" FMT_64 "u%u%%\n",
+ "metadata", usage.used_meta + usage.free_meta,
+ usage.used_meta, usage.free_meta,
+ (unsigned int) (100.0 * usage.used_meta /
+ (usage.used_meta + usage.free_meta) + 0.5));
+ printf("%-15s%-15" FMT_64 "u%-15" FMT_64 "u%-15" FMT_64 "u%u%%\n",
+ "data", used_data + usage.free, used_data, usage.free,
+ (unsigned int) (100.0 * used_data /
+ (used_data + usage.free) + 0.5));
+
+}
+
+/*
+ *
+ * void rgrpstat()
+ *
+ * Description:
+ * Print rgrp statistics info
+ *
+ * Input(s):
+ * argc -
+ * **argv -
+ *
+ */
+
+void rgrpstat(int argc, char **argv)
+{
+ int fd;
+ ogfs_rgrpstat_t stat;
+
+ if (argc != 4)
+ die("not enough arguments\n");
+
+ stat.rnum = strtoul(argv[3], (char *)NULL, 10);
+
+ fd = open(argv[2], O_RDONLY);
+ if (fd < 0)
+ die("can't open %s: %s\n", argv[2], strerror(errno));
+
+
+ if (ioctl(fd, OGFS_STATRGRP, &stat) < 0)
+ die("error doing ioctl: %s\n", strerror(errno));
+
+ printf("RGRP No. %lu\n", stat.rnum);
+ dump_usage(stat.usage);
+
+ close(fd);
+}
/*
*
@@ -231,7 +313,6 @@
{
int fd;
ogfs_usage_t usage;
- uint64 used_data;
if (argc != 3)
@@ -246,42 +327,56 @@
if (ioctl(fd, OGFS_STATGFS, &usage) < 0)
die("error doing ioctl: %s\n", strerror(errno));
+ printf("File System Usage Info:\n");
+ dump_usage(usage);
+
+ close(fd);
+}
- used_data = usage.total_blocks - usage.free -
- (usage.used_dinode + usage.free_dinode) -
- (usage.used_meta + usage.free_meta);
+/*
+ *
+ * void reclaimone()
+ *
+ * Description:
+ * This routine uses an ioctl command to ask OGFS reclaim all the free
+ * metadata blocks from one rgrp.
+ *
+ * Input(s):
+ * argc -
+ * **argv -
+ *
+ */
+void reclaimone(int argc, char **argv)
+{
+ int fd;
+ int rnum = 0;
- printf("Block size = %u\n", usage.block_size);
- printf("%-15s%-15s%-15s%-15s%-15s\n", "Type", "Total", "Used",
- "Free", "use%");
- printf("------------------------------------------------------------------------\n");
- printf("%-15s%-15" FMT_64 "u%-15" FMT_64 "u%-15" FMT_64 "u%u%%\n",
- "inodes", usage.used_dinode + usage.free_dinode,
- usage.used_dinode, usage.free_dinode,
- (unsigned int) (100.0 * usage.used_dinode /
- (usage.used_dinode + usage.free_dinode) +
- 0.5));
- printf("%-15s%-15" FMT_64 "u%-15" FMT_64 "u%-15" FMT_64 "u%u%%\n",
- "metadata", usage.used_meta + usage.free_meta,
- usage.used_meta, usage.free_meta,
- (unsigned int) (100.0 * usage.used_meta /
- (usage.used_meta + usage.free_meta) + 0.5));
- printf("%-15s%-15" FMT_64 "u%-15" FMT_64 "u%-15" FMT_64 "u%u%%\n",
- "data", used_data + usage.free, used_data, usage.free,
- (unsigned int) (100.0 * used_data /
- (used_data + usage.free) + 0.5));
+
+ if (argc != 4)
+ die("not enough arguments\n");
+
+ rnum = strtoul(argv[3], (char *)NULL, 10);
+
+ fd = open(argv[2], O_RDONLY);
+ if (fd < 0)
+ die("can't open %s: %s\n", argv[2], strerror(errno));
+
+
+ if (ioctl(fd, OGFS_RECLAIM_ONE, &rnum) < 0)
+ die("error doing ioctl: %s\n", strerror(errno));
close(fd);
}
+
/*
*
- * void reclaim()
+ * void reclaimall()
*
* Description:
- * This routine uses an ioctl command to ask OGFS reclaim the excess free
+ * This routine uses an ioctl command to ask OGFS reclaim all the free
* metadata blocks.
*
* Input(s):
@@ -290,7 +385,7 @@
*
*/
-void reclaim(int argc, char **argv)
+void reclaimall(int argc, char **argv)
{
int fd;
@@ -304,7 +399,7 @@
die("can't open %s: %s\n", argv[2], strerror(errno));
- if (ioctl(fd, OGFS_RECLAIM_FREEMETA, NULL) < 0)
+ if (ioctl(fd, OGFS_RECLAIM_ALL, NULL) < 0)
die("error doing ioctl: %s\n", strerror(errno));
@@ -340,10 +435,14 @@
dump_lockstate(argc, argv);
} else if (strcmp(argv[1], "df") == 0) {
do_df(argc, argv);
+ } else if (strcmp(argv[1], "rgrpstat") == 0) {
+ rgrpstat(argc, argv);
} else if (strcmp(argv[1], "sb") == 0) {
do_sb(argc, argv);
- } else if (strcmp(argv[1], "reclaim") == 0) {
- reclaim(argc, argv);
+ } else if (strcmp(argv[1], "reclaimone") == 0) {
+ reclaimone(argc, argv);
+ } else if (strcmp(argv[1], "reclaimall") == 0) {
+ reclaimall(argc, argv);
} else if (strcmp(argv[1], "-h") == 0 ||
strcmp(argv[1], "--help") == 0) {
print_usage();
-------------------------------------------------------
This SF.Net email sponsored by: Parasoft
Error proof Web apps, automate testing & more.
Download & eval WebKing and get a free book.
www.parasoft.com/bulletproofapps1
_______________________________________________
Opengfs-devel mailing list
Opengfs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opengfs-devel
[Kernel]
[Security]
[Bugtraq]
[Photo]
[Yosemite]
[MIPS Linux]
[ARM Linux]
[Linux Clusters]
[Linux RAID]
[Yosemite Hiking]
[Linux Resources]