#define yaffs_SuperToDevice(sb) ((yaffs_Device *)sb->u.generic_sbp)
#endif
-
-#define update_dir_time(dir) do {\
- (dir)->i_ctime = (dir)->i_mtime = CURRENT_TIME; \
- } while(0)
-
static void yaffs_put_super(struct super_block *sb);
static ssize_t yaffs_file_write(struct file *f, const char *buf, size_t n,
}
yaffs_GrossUnlock(dev);
- return (nWritten == 0) && (n > 0) ? -ENOSPC : nWritten;
+ return (!nWritten && n) ? -ENOSPC : nWritten;
}
/* Space holding and freeing is done to ensure we have space available for write_begin/end */
if (obj) {
inode = yaffs_get_inode(dir->i_sb, mode, rdev, obj);
d_instantiate(dentry, inode);
- update_dir_time(dir);
T(YAFFS_TRACE_OS,
("yaffs_mknod created object %d count = %d\n",
obj->objectId, atomic_read(&inode->i_count)));
dir->i_version++;
yaffs_GrossUnlock(dev);
mark_inode_dirty(dentry->d_inode);
- update_dir_time(dir);
return 0;
}
yaffs_GrossUnlock(dev);
yaffs_GrossUnlock(dev);
- if (link){
- update_dir_time(dir);
+ if (link)
return 0;
- }
return -EPERM;
}
inode = yaffs_get_inode(dir->i_sb, obj->yst_mode, 0, obj);
d_instantiate(dentry, inode);
- update_dir_time(dir);
T(YAFFS_TRACE_OS, ("symlink created OK\n"));
return 0;
} else {
new_dentry->d_inode->i_nlink--;
mark_inode_dirty(new_dentry->d_inode);
}
-
- update_dir_time(old_dir);
- if(old_dir != new_dir)
- update_dir_time(new_dir);
+
return 0;
} else {
return -ENOTEMPTY;
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);
chunkMax = (dev->internalEndBlock+1) * dev->nChunksPerBlock - 1;
chunkInRange = (((unsigned)(obj->hdrChunk)) >= chunkMin && ((unsigned)(obj->hdrChunk)) <= chunkMax);
- chunkIdOk = chunkInRange || (obj->hdrChunk == 0);
+ chunkIdOk = chunkInRange || obj->hdrChunk == 0;
chunkValid = chunkInRange &&
yaffs_CheckChunkBit(dev,
obj->hdrChunk / dev->nChunksPerBlock,
for (j = 0; theChunk && j < dev->chunkGroupSize; j++) {
if (yaffs_CheckChunkBit(dev, theChunk / dev->nChunksPerBlock,
theChunk % dev->nChunksPerBlock)) {
-
- if(dev->chunkGroupSize == 1)
+ yaffs_ReadChunkWithTagsFromNAND(dev, theChunk, NULL,
+ tags);
+ if (yaffs_TagsMatch(tags, objectId, chunkInInode)) {
+ /* found it; */
return theChunk;
- else {
- yaffs_ReadChunkWithTagsFromNAND(dev, theChunk, NULL,
- tags);
- if (yaffs_TagsMatch(tags, objectId, chunkInInode)) {
- /* found it; */
- return theChunk;
- }
}
}
theChunk++;
in = NULL;
}
- yaffs_UpdateParent(parent);
}
return in;
existingTarget->objectId);
yaffs_UnlinkObject(existingTarget);
}
- yaffs_UpdateParent(oldDir);
- if(newDir != oldDir)
- yaffs_UpdateParent(newDir);
return yaffs_ChangeObjectName(obj, newDir, newName, 1, 0);
}
isCheckpointBlock = (bi->blockState == YAFFS_BLOCK_STATE_CHECKPOINT);
+ bi->blockState = YAFFS_BLOCK_STATE_COLLECTING;
T(YAFFS_TRACE_TRACING,
(TSTR("Collecting block %d, in use %d, shrink %d, wholeBlock %d" TENDSTR),
/*yaffs_VerifyFreeChunks(dev); */
- if(bi->blockState == YAFFS_BLOCK_STATE_FULL)
- bi->blockState = YAFFS_BLOCK_STATE_COLLECTING;
-
bi->hasShrinkHeader = 0; /* clear the flag so that the block can erase */
/* Take off the number of soft deleted entries because
* they're going to get really deleted during GC.
*/
- if(dev->gcChunk == 0) /* first time through for this block */
- dev->nFreeChunks -= bi->softDeletions;
+ dev->nFreeChunks -= bi->softDeletions;
dev->isDoingGC = 1;
newTags.chunkId = chunkInInode;
newTags.objectId = in->objectId;
newTags.serialNumber =
- (prevChunkId > 0) ? prevTags.serialNumber + 1 : 1;
+ (prevChunkId >= 0) ? prevTags.serialNumber + 1 : 1;
newTags.byteCount = nBytes;
if (nBytes < 1 || nBytes > dev->totalBytesPerChunk) {
if (newChunkId >= 0) {
yaffs_PutChunkIntoFile(in, chunkInInode, newChunkId, 0);
- if (prevChunkId > 0)
+ if (prevChunkId >= 0)
yaffs_DeleteChunk(dev, prevChunkId, 1, __LINE__);
yaffs_CheckFileSanity(in);
if (name && *name) {
memset(oh->name, 0, sizeof(oh->name));
yaffs_strncpy(oh->name, name, YAFFS_MAX_NAME_LENGTH);
- } else if (prevChunkId > 0)
+ } else if (prevChunkId >= 0)
memcpy(oh->name, oldName, sizeof(oh->name));
else
memset(oh->name, 0, sizeof(oh->name));
/* Create new chunk in NAND */
newChunkId =
yaffs_WriteNewChunkWithTagsToNAND(dev, buffer, &newTags,
- (prevChunkId > 0) ? 1 : 0);
+ (prevChunkId >= 0) ? 1 : 0);
if (newChunkId >= 0) {
in->hdrChunk = newChunkId;
- if (prevChunkId > 0) {
+ if (prevChunkId >= 0) {
yaffs_DeleteChunk(dev, prevChunkId, 1,
__LINE__);
}
}
}
-static int yaffs_IsNonEmptyDirectory(yaffs_Object *obj)
-{
- return (obj->variantType == YAFFS_OBJECT_TYPE_DIRECTORY) &&
- !(ylist_empty(&obj->variant.directoryVariant.children));
-}
-
-static int yaffs_DeleteDirectory(yaffs_Object *obj)
+static int yaffs_DeleteDirectory(yaffs_Object *in)
{
/* First check that the directory is empty. */
- if (yaffs_IsNonEmptyDirectory(obj))
- return YAFFS_FAIL;
+ if (ylist_empty(&in->variant.directoryVariant.children))
+ return yaffs_DoGenericObjectDeletion(in);
+
+ return YAFFS_FAIL;
- return yaffs_DoGenericObjectDeletion(obj);
}
static int yaffs_DeleteSymLink(yaffs_Object *in)
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)) {
default:
return YAFFS_FAIL;
}
- } else if(yaffs_IsNonEmptyDirectory(obj))
- return YAFFS_FAIL;
- else
+ } else
return yaffs_ChangeObjectName(obj, obj->myDev->unlinkedDir,
_Y("unlinked"), 0, 0);
}
}
}
-/*
- *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)
{
ylist_del_init(&obj->siblings);
obj->parent = NULL;
-
+
yaffs_VerifyDirectory(parent);
}
+
static void yaffs_AddObjectToDirectory(yaffs_Object *directory,
yaffs_Object *obj)
{
* Do a real check
*/
yaffs_GetObjectName(l, buffer,
- YAFFS_MAX_NAME_LENGTH + 1);
+ YAFFS_MAX_NAME_LENGTH);
if (yaffs_strncmp(name, buffer, YAFFS_MAX_NAME_LENGTH) == 0)
return l;
}
{
YCHAR name[257];
- yaffs_GetObjectName(obj, name, YAFFS_MAX_NAME_LENGTH + 1);
+ yaffs_GetObjectName(obj, name, 256);
T(YAFFS_TRACE_ALWAYS,
(TSTR