X-Git-Url: http://www.aleph1.co.uk/gitweb/?a=blobdiff_plain;ds=sidebyside;f=yaffs_guts.c;h=33ba5e652745d0dae67c2d4bc4de30ee1fdaeb86;hb=51bd6245e2a5ffab0befa6aace5510b6e45ffa27;hp=d89b87af44eced13f0f7bd0a584581cc579f2914;hpb=c8b56f564ace4a2052d1e74e2b96c6532dd4ef44;p=yaffs2.git diff --git a/yaffs_guts.c b/yaffs_guts.c index d89b87a..33ba5e6 100644 --- a/yaffs_guts.c +++ b/yaffs_guts.c @@ -12,7 +12,7 @@ */ const char *yaffs_guts_c_version = - "$Id: yaffs_guts.c,v 1.82 2009-03-09 04:24:17 charles Exp $"; + "$Id: yaffs_guts.c,v 1.85 2009-06-08 23:50:44 charles Exp $"; #include "yportenv.h" @@ -49,6 +49,7 @@ static void yaffs_HandleUpdateChunk(yaffs_Device *dev, int chunkInNAND, const yaffs_ExtendedTags *tags); /* Other local prototypes */ +static void yaffs_UpdateParent(yaffs_Object *obj); static int yaffs_UnlinkObject(yaffs_Object *obj); static int yaffs_ObjectHasCachedWriteData(yaffs_Object *obj); @@ -2345,6 +2346,7 @@ static yaffs_Object *yaffs_MknodObject(yaffs_ObjectType type, in = NULL; } + yaffs_UpdateParent(parent); } return in; @@ -2499,6 +2501,9 @@ int yaffs_RenameObject(yaffs_Object *oldDir, const YCHAR *oldName, existingTarget->objectId); yaffs_UnlinkObject(existingTarget); } + yaffs_UpdateParent(oldDir); + if(newDir != oldDir) + yaffs_UpdateParent(newDir); return yaffs_ChangeObjectName(obj, newDir, newName, 1, 0); } @@ -2980,7 +2985,8 @@ static int yaffs_GarbageCollectBlock(yaffs_Device *dev, int block, /* Take off the number of soft deleted entries because * they're going to get really deleted during GC. */ - dev->nFreeChunks -= bi->softDeletions; + if(dev->gcChunk == 0) /* first time through for this block */ + dev->nFreeChunks -= bi->softDeletions; dev->isDoingGC = 1; @@ -5230,6 +5236,9 @@ static int yaffs_UnlinkWorker(yaffs_Object *obj) immediateDeletion = 1; #endif + if(obj) + yaffs_UpdateParent(obj->parent); + if (obj->variantType == YAFFS_OBJECT_TYPE_HARDLINK) { return yaffs_DeleteHardLink(obj); } else if (!ylist_empty(&obj->hardLinks)) { @@ -6666,6 +6675,26 @@ static void yaffs_VerifyDirectory(yaffs_Object *directory) } } +/* + *yaffs_UpdateParent() handles fixing a directories mtime and ctime when a new + * link (ie. name) is created or deleted in the directory. + * + * ie. + * create dir/a : update dir's mtime/ctime + * rm dir/a: update dir's mtime/ctime + * modify dir/a: don't update dir's mtimme/ctime + */ + +static void yaffs_UpdateParent(yaffs_Object *obj) +{ + if(!obj) + return; + + obj->dirty = 1; + obj->yst_mtime = obj->yst_ctime = Y_CURRENT_TIME; + + yaffs_UpdateObjectHeader(obj,NULL,0,0,0); +} static void yaffs_RemoveObjectFromDirectory(yaffs_Object *obj) { @@ -6683,11 +6712,10 @@ static void yaffs_RemoveObjectFromDirectory(yaffs_Object *obj) ylist_del_init(&obj->siblings); obj->parent = NULL; - + yaffs_VerifyDirectory(parent); } - static void yaffs_AddObjectToDirectory(yaffs_Object *directory, yaffs_Object *obj) {