X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=direct%2Fyaffsfs.c;h=dc6dab9640858117c6d139337c0405a2830a3010;hp=b39524719491d87469cdb198a0c6f0e40896690a;hb=ea4200a7a79a0b43509f9267292aadbf16fba2a9;hpb=751cba724040d777d1768dd5d4997039962d2608 diff --git a/direct/yaffsfs.c b/direct/yaffsfs.c index b395247..dc6dab9 100644 --- a/direct/yaffsfs.c +++ b/direct/yaffsfs.c @@ -1,15 +1,14 @@ /* - * YAFFS: Yet another FFS. A NAND-flash specific file system. - * yaffsfs.c The interface functions for using YAFFS via a "direct" interface. + * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. * - * Copyright (C) 2002 Aleph One Ltd. + * Copyright (C) 2002-2007 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering * * Created by Charles Manning * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. - * */ #include "yaffsfs.h" @@ -25,7 +24,7 @@ #endif -const char *yaffsfs_c_version="$Id: yaffsfs.c,v 1.10 2006-03-08 07:59:20 charles Exp $"; +const char *yaffsfs_c_version="$Id: yaffsfs.c,v 1.18 2007-07-18 19:40:38 charles Exp $"; // configurationList is the list of devices that are supported static yaffsfs_DeviceConfiguration *yaffsfs_configurationList; @@ -39,6 +38,9 @@ static void yaffsfs_RemoveObjectCallback(yaffs_Object *obj); // Handle management. // + +unsigned int yaffs_wr_attempts; + typedef struct { __u8 inUse:1; // this handle is in use @@ -620,7 +622,7 @@ int yaffs_write(int fd, const void *buf, unsigned int nbyte) } -int yaffs_truncate(int fd, unsigned int newSize) +int yaffs_truncate(int fd, off_t newSize) { yaffsfs_Handle *h = NULL; yaffs_Object *obj = NULL; @@ -729,10 +731,6 @@ int yaffsfs_DoUnlink(const char *path,int isDirectory) { yaffsfs_SetError(-ENOTDIR); } - else if(isDirectory && obj->variantType != YAFFS_OBJECT_TYPE_DIRECTORY) - { - yaffsfs_SetError(-ENOTDIR); - } else { result = yaffs_Unlink(dir,name); @@ -851,7 +849,7 @@ static int yaffsfs_DoStat(yaffs_Object *obj,struct yaffs_stat *buf) buf->st_gid = 0;; buf->st_rdev = obj->yst_rdev; buf->st_size = yaffs_GetObjectFileLength(obj); - buf->st_blksize = obj->myDev->nBytesPerChunk; + buf->st_blksize = obj->myDev->nDataBytesPerChunk; buf->st_blocks = (buf->st_size + buf->st_blksize -1)/buf->st_blksize; buf->yst_atime = obj->yst_atime; buf->yst_ctime = obj->yst_ctime; @@ -1078,6 +1076,7 @@ int yaffs_unmount(const char *path) int inUse; yaffs_FlushEntireDeviceCache(dev); + yaffs_CheckpointSave(dev); for(i = inUse = 0; i < YAFFSFS_N_HANDLES && !inUse; i++) { @@ -1117,9 +1116,9 @@ int yaffs_unmount(const char *path) } -off_t yaffs_freespace(const char *path) +loff_t yaffs_freespace(const char *path) { - off_t retVal=-1; + loff_t retVal=-1; yaffs_Device *dev=NULL; char *dummy; @@ -1128,7 +1127,7 @@ off_t yaffs_freespace(const char *path) if(dev && dev->isMounted) { retVal = yaffs_GetNumberOfFreeChunks(dev); - retVal *= dev->nBytesPerChunk; + retVal *= dev->nDataBytesPerChunk; } else @@ -1301,8 +1300,14 @@ struct yaffs_dirent *yaffs_readdir(yaffs_DIR *dirp) yaffsfs_SetError(0); if(dsc->nextReturn){ dsc->de.d_ino = yaffs_GetEquivalentObject(dsc->nextReturn)->objectId; + dsc->de.d_dont_use = (unsigned)dsc->nextReturn; dsc->de.d_off = dsc->offset++; - yaffs_GetObjectName(dsc->nextReturn,dsc->de.d_name,NAME_MAX+1); + yaffs_GetObjectName(dsc->nextReturn,dsc->de.d_name,NAME_MAX); + if(strlen(dsc->de.d_name) == 0) + { + // this should not happen! + strcpy(dsc->de.d_name,"zz"); + } dsc->de.d_reclen = sizeof(struct yaffs_dirent); retVal = &dsc->de; yaffsfs_DirAdvance(dsc); @@ -1411,7 +1416,7 @@ int yaffs_link(const char *oldpath, const char *newpath) // Creates a link called newpath to existing oldpath yaffs_Object *obj = NULL; yaffs_Object *target = NULL; - int retVal; + int retVal = 0; yaffsfs_Lock();