[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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]

Powered by Linux