projects
/
yaffs2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
yaffs: Cache object xattrib state.
[yaffs2.git]
/
yaffs_guts.c
diff --git
a/yaffs_guts.c
b/yaffs_guts.c
index c01f00c8b6b37239d9562a6bbf8461d486ce8308..6ea5698b5052dd375e15bceba736a183209587cc 100644
(file)
--- a/
yaffs_guts.c
+++ b/
yaffs_guts.c
@@
-66,7
+66,7
@@
static yaffs_Object *yaffs_CreateNewObject(yaffs_Device *dev, int number,
yaffs_ObjectType type);
yaffs_ObjectType type);
-static int yaffs_ApplyXMod(yaffs_
Device *dev
, char *buffer, yaffs_XAttrMod *xmod);
+static int yaffs_ApplyXMod(yaffs_
Object *obj
, char *buffer, yaffs_XAttrMod *xmod);
static void yaffs_RemoveObjectFromDirectory(yaffs_Object *obj);
static int yaffs_CheckStructures(void);
static void yaffs_RemoveObjectFromDirectory(yaffs_Object *obj);
static int yaffs_CheckStructures(void);
@@
-2223,6
+2223,7
@@
static int yaffs_GarbageCollectBlock(yaffs_Device *dev, int block,
* We have to decrement free chunks so this works out properly.
*/
dev->nFreeChunks--;
* We have to decrement free chunks so this works out properly.
*/
dev->nFreeChunks--;
+ bi->softDeletions--;
object->nDataChunks--;
object->nDataChunks--;
@@
-2434,7
+2435,16
@@
static unsigned yaffs_FindBlockForGarbageCollection(yaffs_Device *dev,
threshold = dev->param.nChunksPerBlock;
iterations = nBlocks;
} else {
threshold = dev->param.nChunksPerBlock;
iterations = nBlocks;
} else {
- int maxThreshold = dev->param.nChunksPerBlock/2;
+ int maxThreshold;
+
+ if(background)
+ maxThreshold = dev->param.nChunksPerBlock/2;
+ else
+ maxThreshold = dev->param.nChunksPerBlock/8;
+
+ if(maxThreshold < YAFFS_GC_PASSIVE_THRESHOLD)
+ maxThreshold = YAFFS_GC_PASSIVE_THRESHOLD;
+
threshold = background ?
(dev->gcNotDone + 2) * 2 : 0;
if(threshold <YAFFS_GC_PASSIVE_THRESHOLD)
threshold = background ?
(dev->gcNotDone + 2) * 2 : 0;
if(threshold <YAFFS_GC_PASSIVE_THRESHOLD)
@@
-2499,8
+2509,10
@@
static unsigned yaffs_FindBlockForGarbageCollection(yaffs_Device *dev,
dev->param.nChunksPerBlock - dev->gcPagesInUse,
prioritised));
dev->param.nChunksPerBlock - dev->gcPagesInUse,
prioritised));
+ dev->nGCBlocks++;
if(background)
dev->backgroundGCs++;
if(background)
dev->backgroundGCs++;
+
dev->gcDirtiest = 0;
dev->gcPagesInUse = 0;
dev->gcNotDone = 0;
dev->gcDirtiest = 0;
dev->gcPagesInUse = 0;
dev->gcNotDone = 0;
@@
-2534,10
+2546,8
@@
static int yaffs_CheckGarbageCollection(yaffs_Device *dev, int background)
int aggressive = 0;
int gcOk = YAFFS_OK;
int maxTries = 0;
int aggressive = 0;
int gcOk = YAFFS_OK;
int maxTries = 0;
-
int minErased;
int erasedChunks;
int minErased;
int erasedChunks;
-
int checkpointBlockAdjust;
if(dev->param.gcControl &&
int checkpointBlockAdjust;
if(dev->param.gcControl &&
@@
-2565,6
+2575,9
@@
static int yaffs_CheckGarbageCollection(yaffs_Device *dev, int background)
if (dev->nErasedBlocks < minErased)
aggressive = 1;
else {
if (dev->nErasedBlocks < minErased)
aggressive = 1;
else {
+ if(!background && erasedChunks > (dev->nFreeChunks / 4))
+ break;
+
if(dev->gcSkip > 20)
dev->gcSkip = 20;
if(erasedChunks < dev->nFreeChunks/2 ||
if(dev->gcSkip > 20)
dev->gcSkip = 20;
if(erasedChunks < dev->nFreeChunks/2 ||
@@
-3099,7
+3112,7
@@
int yaffs_UpdateObjectHeader(yaffs_Object *in, const YCHAR *name, int force,
/* process any xattrib modifications */
if(xmod)
/* process any xattrib modifications */
if(xmod)
- yaffs_ApplyXMod(
dev
, (char *)buffer, xmod);
+ yaffs_ApplyXMod(
in
, (char *)buffer, xmod);
/* Tags */
/* Tags */
@@
-4189,6
+4202,9
@@
static void yaffs_StripDeletedObjects(yaffs_Device *dev)
struct ylist_head *n;
yaffs_Object *l;
struct ylist_head *n;
yaffs_Object *l;
+ if (dev->readOnly)
+ return;
+
/* Soft delete all the unlinked files */
ylist_for_each_safe(i, n,
&dev->unlinkedDir->variant.directoryVariant.children) {
/* Soft delete all the unlinked files */
ylist_for_each_safe(i, n,
&dev->unlinkedDir->variant.directoryVariant.children) {
@@
-4242,6
+4258,8
@@
static void yaffs_FixHangingObjects(yaffs_Device *dev)
int depthLimit;
int hanging;
int depthLimit;
int hanging;
+ if (dev->readOnly)
+ return;
/* Iterate through the objects in each hash entry,
* looking at each object.
/* Iterate through the objects in each hash entry,
* looking at each object.
@@
-4921,10
+4939,11
@@
static int yaffs_DoXMod(yaffs_Object *obj, int set, const YCHAR *name, const voi
return -ENOSPC;
}
return -ENOSPC;
}
-static int yaffs_ApplyXMod(yaffs_
Device *dev
, char *buffer, yaffs_XAttrMod *xmod)
+static int yaffs_ApplyXMod(yaffs_
Object *obj
, char *buffer, yaffs_XAttrMod *xmod)
{
int retval = 0;
int x_offs = sizeof(yaffs_ObjectHeader);
{
int retval = 0;
int x_offs = sizeof(yaffs_ObjectHeader);
+ yaffs_Device *dev = obj->myDev;
int x_size = dev->nDataBytesPerChunk - sizeof(yaffs_ObjectHeader);
char * x_buffer = buffer + x_offs;
int x_size = dev->nDataBytesPerChunk - sizeof(yaffs_ObjectHeader);
char * x_buffer = buffer + x_offs;
@@
-4934,6
+4953,9
@@
static int yaffs_ApplyXMod(yaffs_Device *dev, char *buffer, yaffs_XAttrMod *xmod
else
retval = nval_del(x_buffer, x_size, xmod->name);
else
retval = nval_del(x_buffer, x_size, xmod->name);
+ obj->hasXattr = nval_hasvalues(x_buffer, x_size);
+ obj->xattrKnown = 1;
+
xmod->result = retval;
return retval;
xmod->result = retval;
return retval;
@@
-4955,6
+4977,16
@@
static int yaffs_DoXFetch(yaffs_Object *obj, const YCHAR *name, void *value, int
if(obj->hdrChunk < 1)
return -ENODATA;
if(obj->hdrChunk < 1)
return -ENODATA;
+ /* If we know that the object has no xattribs then don't do all the
+ * reading and parsing.
+ */
+ if(obj->xattrKnown && !obj->hasXattr){
+ if(name)
+ return -ENODATA;
+ else
+ return 0;
+ }
+
buffer = yaffs_GetTempBuffer(dev, __LINE__);
if(!buffer)
return -ENOMEM;
buffer = yaffs_GetTempBuffer(dev, __LINE__);
if(!buffer)
return -ENOMEM;
@@
-4966,6
+4998,11
@@
static int yaffs_DoXFetch(yaffs_Object *obj, const YCHAR *name, void *value, int
else{
x_buffer = buffer + x_offs;
else{
x_buffer = buffer + x_offs;
+ if (!obj->xattrKnown){
+ obj->hasXattr = nval_hasvalues(x_buffer, x_size);
+ obj->xattrKnown = 1;
+ }
+
if(name)
retval = nval_get(x_buffer, x_size, name, value, size);
else
if(name)
retval = nval_get(x_buffer, x_size, name, value, size);
else