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);
/* process any xattrib modifications */
if(xmod)
- yaffs_ApplyXMod(dev, (char *)buffer, xmod);
+ yaffs_ApplyXMod(in, (char *)buffer, xmod);
/* Tags */
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);
+ yaffs_Device *dev = obj->myDev;
int x_size = dev->nDataBytesPerChunk - sizeof(yaffs_ObjectHeader);
char * x_buffer = buffer + x_offs;
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;
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;
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