From bfde38bff96a421dcb73ffbb8b9b69f3f6500677 Mon Sep 17 00:00:00 2001 From: Charles Manning Date: Fri, 23 Oct 2015 09:05:56 +1300 Subject: [PATCH] Some changes to get VxWorks wrapper working Signed-off-by: Charles Manning --- direct/test-framework/yramsim.c | 72 ++++++++++++++++++--------------- direct/yaffsfs.c | 66 +++++++++++++++++++++++++----- direct/yaffsfs.h | 24 +++++++++-- direct/yportenv.h | 25 +++++++----- 4 files changed, 132 insertions(+), 55 deletions(-) diff --git a/direct/test-framework/yramsim.c b/direct/test-framework/yramsim.c index 10c9c07..881c6e3 100644 --- a/direct/test-framework/yramsim.c +++ b/direct/test-framework/yramsim.c @@ -19,7 +19,7 @@ #include "yramsim.h" -#include "yaffs_nandif.h" +#include "yaffs_guts.h" #define DATA_SIZE 2048 @@ -43,10 +43,7 @@ SimData *simDevs[N_RAM_SIM_DEVS]; static SimData *DevToSim(struct yaffs_dev *dev) { - struct ynandif_Geometry *geom = - (struct ynandif_Geometry *)(dev->driver_context); - SimData * sim = (SimData*)(geom->privateData); - return sim; + return (SimData*)(dev->driver_context); } @@ -121,7 +118,7 @@ static int yramsim_rd_chunk (struct yaffs_dev *dev, unsigned pageId, if(spare) memcpy(spare,s,spareLength); - *eccStatus = 0; // 0 = no error, -1 = unfixable error, 1 = fixable + *eccStatus = 0; /* 0 = no error, -1 = unfixable error, 1 = fixable */ return 1; } @@ -166,15 +163,15 @@ static int yramsim_erase(struct yaffs_dev *dev,unsigned blockId) return yramsim_erase_internal(sim,blockId,0); } -static int yramsim_check_block_ok(struct yaffs_dev *dev,unsigned blockId) +static int yramsim_check_block_bad(struct yaffs_dev *dev,unsigned blockId) { SimData *sim = DevToSim(dev); Block **blockList = sim->blockList; if(blockId >= sim->nBlocks){ - return 0; + return YAFFS_FAIL; } - return blockList[blockId]->blockOk ? 1 : 0; + return blockList[blockId]->blockOk ? YAFFS_OK : YAFFS_FAIL; } static int yramsim_mark_block_bad(struct yaffs_dev *dev,unsigned blockId) @@ -257,40 +254,49 @@ struct yaffs_dev *yramsim_CreateRamSim(const YCHAR *name, u32 start_block, u32 end_block) { SimData *sim; - struct ynandif_Geometry *g; + struct yaffs_dev *dev; + struct yaffs_param *p; + struct yaffs_driver *d; sim = yramsim_alloc_sim_data(devId, nBlocks); - g = malloc(sizeof(*g)); + dev = malloc(sizeof(*dev)); - if(!sim || !g){ - if(g) - free(g); + if(!sim || !dev){ + free(sim); + free(dev); return NULL; } + + memset(dev, 0, sizeof(*dev)); if(start_block >= sim->nBlocks) start_block = 0; if(end_block == 0 || end_block >= sim->nBlocks) end_block = sim->nBlocks - 1; - memset(g,0,sizeof(*g)); - g->start_block = start_block; - g->end_block = end_block; - g->dataSize = DATA_SIZE; - g->spareSize= SPARE_SIZE; - g->pagesPerBlock = PAGES_PER_BLOCK; - g->hasECC = 1; - g->inband_tags = 0; - g->useYaffs2 = 1; - g->initialise = yramsim_initialise; - g->deinitialise = yramsim_deinitialise; - g->readChunk = yramsim_rd_chunk, - g->writeChunk = yramsim_wr_chunk, - g->eraseBlock = yramsim_erase, - g->checkBlockOk = yramsim_check_block_ok, - g->markBlockBad = yramsim_mark_block_bad, - g->privateData = (void *)sim; - - return yaffs_add_dev_from_geometry(name,g); + p = &dev->param; + p->name = strdup(name); + p->start_block = start_block; + p->end_block = end_block; + p->total_bytes_per_chunk = DATA_SIZE; + p->spare_bytes_per_chunk= SPARE_SIZE; + p->chunks_per_block = PAGES_PER_BLOCK; + p->n_reserved_blocks = 2; + p->use_nand_ecc = 1; + p->inband_tags = 0; + p->is_yaffs2 = 1; + + d= &dev->drv; + d->drv_initialise_fn = yramsim_initialise; + d->drv_deinitialise_fn = yramsim_deinitialise; + d->drv_read_chunk_fn = yramsim_rd_chunk; + d->drv_write_chunk_fn = yramsim_wr_chunk; + d->drv_erase_fn = yramsim_erase; + d->drv_check_bad_fn = yramsim_check_block_bad; + d->drv_mark_bad_fn = yramsim_mark_block_bad; + + dev->driver_context= (void *)sim; + + return dev; } diff --git a/direct/yaffsfs.c b/direct/yaffsfs.c index 952ffac..05cd229 100644 --- a/direct/yaffsfs.c +++ b/direct/yaffsfs.c @@ -919,10 +919,10 @@ int yaffs_open_sharing_reldir(struct yaffs_obj *reldir, const YCHAR *path, } /* Check file permissions */ - if (readRequested && !(obj->yst_mode & S_IREAD)) + if (readRequested && !(obj->yst_mode & S_IRUSR)) openDenied = 1; - if (writeRequested && !(obj->yst_mode & S_IWRITE)) + if (writeRequested && !(obj->yst_mode & S_IWUSR)) openDenied = 1; if (!errorReported && writeRequested && @@ -1589,6 +1589,35 @@ int yaffs_unlink(const YCHAR *path) return yaffs_unlink_reldir(NULL, path); } +int yaffs_funlink(int fd) +{ + struct yaffs_obj *obj; + int retVal = -1; + + yaffsfs_Lock(); + obj = yaffsfs_HandleToObject(fd); + + if (!obj) + yaffsfs_SetError(-EBADF); + else if (obj->my_dev->read_only) + yaffsfs_SetError(-EROFS); + else if (!isDirectory && + obj->variant_type == YAFFS_OBJECT_TYPE_DIRECTORY) + yaffsfs_SetError(-EISDIR); + else if (isDirectory && + obj->variant_type != YAFFS_OBJECT_TYPE_DIRECTORY) + yaffsfs_SetError(-ENOTDIR); + else if (isDirectory && obj == obj->my_dev->root_dir) + yaffsfs_SetError(-EBUSY); /* Can't rmdir a root */ + else if (yaffs_unlink_obj(oobj) == YAFFS_OK) + retVal = 0; + + yaffsfs_Unlock(); + + return retVal; +} + + static int rename_file_over_dir(struct yaffs_obj *obj, struct yaffs_obj *newobj) { if (obj && obj->variant_type != YAFFS_OBJECT_TYPE_DIRECTORY && @@ -2553,11 +2582,11 @@ int yaffs_access_reldir(struct yaffs_obj *reldir, const YCHAR *path, int amode) else { int access_ok = 1; - if ((amode & R_OK) && !(obj->yst_mode & S_IREAD)) + if ((amode & R_OK) && !(obj->yst_mode & S_IRUSR)) access_ok = 0; - if ((amode & W_OK) && !(obj->yst_mode & S_IWRITE)) + if ((amode & W_OK) && !(obj->yst_mode & S_IWUSR)) access_ok = 0; - if ((amode & X_OK) && !(obj->yst_mode & S_IEXEC)) + if ((amode & X_OK) && !(obj->yst_mode & S_IXUSR)) access_ok = 0; if (!access_ok) @@ -2863,7 +2892,9 @@ int yaffs_mount(const YCHAR *path) return yaffs_mount_common(NULL, path, 0, 0); } -int yaffs_sync_common(struct yaffs_dev *dev, const YCHAR *path) +static int yaffs_sync_common(struct yaffs_dev *dev, + const YCHAR *path, + int do_checkpt) { int retVal = -1; YCHAR *dummy; @@ -2892,7 +2923,8 @@ int yaffs_sync_common(struct yaffs_dev *dev, const YCHAR *path) else { yaffs_flush_whole_cache(dev, 0); - yaffs_checkpoint_save(dev); + if (do_checkpt) + yaffs_checkpoint_save(dev); retVal = 0; } @@ -2903,14 +2935,24 @@ int yaffs_sync_common(struct yaffs_dev *dev, const YCHAR *path) return retVal; } +int yaffs_sync_files_reldev(struct yaffs_dev *dev) +{ + return yaffs_sync_common(dev, NULL, 0); +} + +int yaffs_sync_files(const YCHAR *path) +{ + return yaffs_sync_common(NULL, path, 0); +} + int yaffs_sync_reldev(struct yaffs_dev *dev) { - return yaffs_sync_common(dev, NULL); + return yaffs_sync_common(dev, NULL, 1); } int yaffs_sync(const YCHAR *path) { - return yaffs_sync_common(NULL, path); + return yaffs_sync_common(NULL, path, 1); } @@ -3601,6 +3643,7 @@ static int yaffsfs_closedir_no_lock(yaffs_DIR *dirp) return 0; } + int yaffs_closedir(yaffs_DIR *dirp) { int ret; @@ -3847,6 +3890,11 @@ int yaffs_set_error(int error) return 0; } +struct yaffs_obj * yaffs_get_obj_from_fd(int handle) +{ + return yaffsfs_HandleToObject(handle); +} + int yaffs_dump_dev_reldir(struct yaffs_obj *reldir, const YCHAR *path) { #if 1 diff --git a/direct/yaffsfs.h b/direct/yaffsfs.h index 8daf9d6..8a6a8b8 100644 --- a/direct/yaffsfs.h +++ b/direct/yaffsfs.h @@ -101,12 +101,14 @@ int yaffs_write(int fd, const void *buf, unsigned int nbyte) ; int yaffs_pread(int fd, void *buf, unsigned int nbyte, Y_LOFF_T offset); int yaffs_pwrite(int fd, const void *buf, unsigned int nbyte, Y_LOFF_T offset); -Y_LOFF_T yaffs_lseek(int fd, Y_LOFF_T offset, int whence) ; +Y_LOFF_T yaffs_lseek(int fd, Y_LOFF_T offset, int whence); int yaffs_truncate(const YCHAR *path, Y_LOFF_T new_size); int yaffs_ftruncate(int fd, Y_LOFF_T new_size); -int yaffs_unlink(const YCHAR *path) ; +int yaffs_unlink(const YCHAR *path); +int yaffs_funlink(int fd); + int yaffs_rename(const YCHAR *oldPath, const YCHAR *newPath) ; int yaffs_stat(const YCHAR *path, struct yaffs_stat *buf) ; @@ -163,7 +165,12 @@ int yaffs_format(const YCHAR *path, int force_unmount_flag, int remount_flag); -int yaffs_sync(const YCHAR *path) ; +/* + * yaffs_sync() does a full sync, including checkpoint. + * yaffs_sync_files() just flushes the cache and does not write a checkpoint. + */ +int yaffs_sync(const YCHAR *path); +int yaffs_sync_files(const YCHAR *path) ; int yaffs_symlink(const YCHAR *oldpath, const YCHAR *newpath); int yaffs_readlink(const YCHAR *path, YCHAR *buf, int bufsiz); @@ -217,6 +224,7 @@ int yaffs_mknod_reldir(struct yaffs_obj *reldir, const YCHAR *pathname, /* Function variants that use a relative device */ struct yaffs_dev; +int yaffs_mount_reldev(struct yaffs_dev *dev); int yaffs_open_sharing_reldev(struct yaffs_dev *dev, const YCHAR *path, int oflag, int mode, int sharing); int yaffs_open_reldev(struct yaffs_dev *dev,const YCHAR *path, int oflag, int mode); int yaffs_truncate_reldev(struct yaffs_dev *dev, const YCHAR *path, Y_LOFF_T new_size); @@ -258,11 +266,21 @@ int yaffs_mknod_reldev(struct yaffs_dev *dev, const YCHAR *pathname, Y_LOFF_T yaffs_freespace_reldev(struct yaffs_dev *dev); Y_LOFF_T yaffs_totalspace_reldev(struct yaffs_dev *dev); +/* + * yaffs_sync_reldev() does a full sync, including checkpoint. + * yaffs_sync_files_reldev() just flushes the cache and does not write a checkpoint. + */ int yaffs_sync_reldev(struct yaffs_dev *dev); +int yaffs_sync_files_reldev(struct yaffs_dev *dev); + int yaffs_unmount_reldev(struct yaffs_dev *dev); int yaffs_unmount2_reldev(struct yaffs_dev *dev, int force); int yaffs_remount_reldev(struct yaffs_dev *dev, int force, int read_only); +/* + * Non standard function to get at objects. + */ +struct yaffs_obj * yaffs_get_obj_from_fd(int handle); /* Some non-standard functions to use fds to access directories */ struct yaffs_dirent *yaffs_readdir_fd(int fd); diff --git a/direct/yportenv.h b/direct/yportenv.h index 526b38d..8a5cb4e 100644 --- a/direct/yportenv.h +++ b/direct/yportenv.h @@ -273,18 +273,27 @@ struct iattr { -#ifndef S_IREAD -#define S_IREAD 0000400 +#ifndef S_IRUSR +#define S_IRUSR 0000400 #endif -#ifndef S_IWRITE -#define S_IWRITE 0000200 +#ifndef S_IWUSR +#define S_IWUSR 0000200 #endif #ifndef S_IEXEC #define S_IEXEC 0000100 #endif +#else +#include +#include +#include +#endif + +#endif + +/* Create some less common define values if they don't exist */ #ifndef XATTR_CREATE #define XATTR_CREATE 1 #endif @@ -300,12 +309,8 @@ struct iattr { #define F_OK 0 #endif -#else -#include -#include -#include -#endif - +#ifndef S_ISSOCK +#define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) #endif #ifndef Y_DUMP_STACK -- 2.30.2