changeset 388:36569f389824

Add garbage collection control
author charles <charles>
date Mon, 15 Mar 2010 23:10:33 +0000
parents 8e0094175e71
children 10fe81fa4682
files yaffs_fs.c yaffs_guts.c yaffs_guts.h
diffstat 3 files changed, 18 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/yaffs_fs.c
+++ b/yaffs_fs.c
@@ -32,7 +32,7 @@
  */
 
 const char *yaffs_fs_c_version =
-    "$Id: yaffs_fs.c,v 1.101 2010-03-15 22:27:15 charles Exp $";
+    "$Id: yaffs_fs.c,v 1.102 2010-03-15 23:10:33 charles Exp $";
 extern const char *yaffs_guts_c_version;
 
 #include <linux/version.h>
@@ -138,16 +138,19 @@ static uint32_t YCALCBLOCKS(uint64_t par
 unsigned int yaffs_traceMask = YAFFS_TRACE_BAD_BLOCKS | YAFFS_TRACE_ALWAYS;
 unsigned int yaffs_wr_attempts = YAFFS_WR_ATTEMPTS;
 unsigned int yaffs_auto_checkpoint = 1;
+unsigned int yaffs_gc_control = 1;
 
 /* Module Parameters */
 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
 module_param(yaffs_traceMask, uint, 0644);
 module_param(yaffs_wr_attempts, uint, 0644);
 module_param(yaffs_auto_checkpoint, uint, 0644);
+module_param(yaffs_gc_control, uint, 0644);
 #else
 MODULE_PARM(yaffs_traceMask, "i");
 MODULE_PARM(yaffs_wr_attempts, "i");
 MODULE_PARM(yaffs_auto_checkpoint, "i");
+MODULE_PARM(yaffs_gc_control, "i");
 #endif
 
 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 25))
@@ -392,6 +395,11 @@ static const struct super_operations yaf
 	.sync_fs = yaffs_sync_fs,
 	.write_super = yaffs_write_super,
 };
+
+static unsigned yaffs_gc_control_callback(yaffs_Device *dev)
+{
+	return yaffs_gc_control;
+}
                 	                                                                                          	
 static void yaffs_GrossLock(yaffs_Device *dev)
 {
@@ -2462,6 +2470,7 @@ static struct super_block *yaffs_interna
 	yaffs_DeviceToContext(dev)->putSuperFunc = yaffs_MTDPutSuper;
 
 	param->markSuperBlockDirty = yaffs_MarkSuperBlockDirty;
+	param->gcControl = yaffs_gc_control_callback;
 
 	yaffs_DeviceToContext(dev)->superBlock= sb;
 	
@@ -2749,7 +2758,6 @@ static int yaffs_debug_proc_read(char *p
 {
 	struct ylist_head *item;
 	char *buf = page;
-	int step = offset;
 	int n = 0;
 
 	down(&yaffs_context_lock);
--- a/yaffs_guts.c
+++ b/yaffs_guts.c
@@ -12,7 +12,7 @@
  */
 
 const char *yaffs_guts_c_version =
-    "$Id: yaffs_guts.c,v 1.119 2010-03-12 02:48:34 charles Exp $";
+    "$Id: yaffs_guts.c,v 1.120 2010-03-15 23:10:34 charles Exp $";
 
 #include "yportenv.h"
 #include "yaffs_trace.h"
@@ -3456,6 +3456,10 @@ static int yaffs_CheckGarbageCollection(
 
 	int checkpointBlockAdjust;
 
+	if(dev->param.gcControl &&
+		(dev->param.gcControl(dev) & 1) == 0)
+		return YAFFS_OK;
+
 	if (dev->isDoingGC) {
 		/* Bail out so we don't get recursive gc */
 		return YAFFS_OK;
--- a/yaffs_guts.h
+++ b/yaffs_guts.h
@@ -598,6 +598,9 @@ struct yaffs_DeviceParamStruct {
 
 	/* Callback to mark the superblock dirty */
 	void (*markSuperBlockDirty)(struct yaffs_DeviceStruct *dev);
+	
+	/*  Callback to control garbage collection. */
+	unsigned (*gcControl)(struct yaffs_DeviceStruct *dev);
 
         /* Debug control flags. Don't use unless you know what you're doing */
 	int useHeaderFileSize;	/* Flag to determine if we should use file sizes from the header */