+
+ dev = yaffsfs_FindMountPoint(path);
+ if(dev){
+ if(!dev->is_mounted){
+ dev->read_only = read_only ? 1 : 0;
+ result = yaffs_guts_initialise(dev);
+ if(result == YAFFS_FAIL)
+ /* todo error - mount failed */
+ yaffsfs_SetError(-ENOMEM);
+ retVal = result ? 0 : -1;
+
+ }
+ else
+ /* todo error - already mounted. */
+ yaffsfs_SetError(-EBUSY);
+ } else
+ /* todo error - no device */
+ yaffsfs_SetError(-ENODEV);
+
+ yaffsfs_Unlock();
+ return retVal;
+
+}
+
+int yaffs_mount(const YCHAR *path)
+{
+ return yaffs_mount2(path,0);
+}
+
+int yaffs_sync(const YCHAR *path)
+{
+ int retVal=-1;
+ struct yaffs_dev *dev=NULL;
+ YCHAR *dummy;
+
+ yaffsfs_Lock();
+ dev = yaffsfs_FindDevice(path,&dummy);
+ if(dev){
+ if(dev->is_mounted){
+
+ yaffs_flush_whole_cache(dev);
+ yaffs_checkpoint_save(dev);
+ retVal = 0;
+
+ } else
+ /* todo error - not mounted. */
+ yaffsfs_SetError(-EINVAL);
+
+ }else
+ /* todo error - no device */
+ yaffsfs_SetError(-ENODEV);
+
+ yaffsfs_Unlock();
+ return retVal;
+}
+
+
+int yaffs_remount(const YCHAR *path, int force, int read_only)
+{
+ int retVal=-1;
+ struct yaffs_dev *dev=NULL;
+ yaffsfs_Handle *yh;
+
+ yaffsfs_Lock();
+ dev = yaffsfs_FindMountPoint(path);
+ if(dev){
+ if(dev->is_mounted){
+ int i;
+ int inUse;
+
+ yaffs_flush_whole_cache(dev);
+
+ for(i = inUse = 0; i < YAFFSFS_N_HANDLES && !inUse && !force; i++){
+ yh = & yaffsfs_handle[i];
+ if(yh->useCount>0 &&
+ yaffsfs_inode[yh->inodeId].iObj->my_dev == dev)
+ inUse = 1; /* the device is in use, can't unmount */
+ }
+
+ if(!inUse || force){
+ if(read_only)
+ yaffs_checkpoint_save(dev);
+ dev->read_only = read_only ? 1 : 0;
+ retVal = 0;
+ } else
+ yaffsfs_SetError(-EBUSY);
+
+ } else
+ yaffsfs_SetError(-EINVAL);
+
+ }
+ else
+ yaffsfs_SetError(-ENODEV);
+
+ yaffsfs_Unlock();
+ return retVal;
+
+}
+
+int yaffs_unmount2(const YCHAR *path, int force)
+{
+ int retVal=-1;
+ struct yaffs_dev *dev=NULL;
+
+ yaffsfs_Lock();
+ dev = yaffsfs_FindMountPoint(path);
+ if(dev){
+ if(dev->is_mounted){
+ int i;
+ int inUse;
+
+ yaffs_flush_whole_cache(dev);
+ yaffs_checkpoint_save(dev);
+
+ for(i = inUse = 0; i < YAFFSFS_N_HANDLES && !inUse; i++){
+ if(yaffsfs_handle[i].useCount > 0 &&
+ yaffsfs_inode[yaffsfs_handle[i].inodeId].iObj->my_dev == dev)
+ inUse = 1; /* the device is in use, can't unmount */
+ }
+
+ if(!inUse || force){
+ if(inUse)
+ yaffsfs_PutDeviceHandles(dev);
+ yaffs_deinitialise(dev);
+
+ retVal = 0;
+ } else
+ /* todo error can't unmount as files are open */
+ yaffsfs_SetError(-EBUSY);
+
+ } else
+ /* todo error - not mounted. */
+ yaffsfs_SetError(-EINVAL);
+
+ } else
+ /* todo error - no device */
+ yaffsfs_SetError(-ENODEV);
+
+ yaffsfs_Unlock();
+ return retVal;
+
+}
+
+int yaffs_unmount(const YCHAR *path)
+{
+ return yaffs_unmount2(path,0);
+}
+
+loff_t yaffs_freespace(const YCHAR *path)
+{
+ loff_t retVal=-1;
+ struct yaffs_dev *dev=NULL;
+ YCHAR *dummy;
+
+ yaffsfs_Lock();
+ dev = yaffsfs_FindDevice(path,&dummy);
+ if(dev && dev->is_mounted){
+ retVal = yaffs_get_n_free_chunks(dev);
+ retVal *= dev->data_bytes_per_chunk;
+
+ } else
+ yaffsfs_SetError(-EINVAL);
+
+ yaffsfs_Unlock();
+ return retVal;
+}
+
+loff_t yaffs_totalspace(const YCHAR *path)
+{
+ loff_t retVal=-1;
+ struct yaffs_dev *dev=NULL;
+ YCHAR *dummy;
+
+ yaffsfs_Lock();
+ dev = yaffsfs_FindDevice(path,&dummy);
+ if(dev && dev->is_mounted){
+ retVal = (dev->param.end_block - dev->param.start_block + 1) - dev->param.n_reserved_blocks;
+ retVal *= dev->param.chunks_per_block;
+ retVal *= dev->data_bytes_per_chunk;
+
+ } else
+ yaffsfs_SetError(-EINVAL);
+
+ yaffsfs_Unlock();
+ return retVal;
+}
+
+int yaffs_inodecount(const YCHAR *path)
+{
+ loff_t retVal= -1;
+ struct yaffs_dev *dev=NULL;
+ YCHAR *dummy;
+
+ yaffsfs_Lock();
+ dev = yaffsfs_FindDevice(path,&dummy);
+ if(dev && dev->is_mounted) {
+ int n_obj = dev->n_obj;
+ if(n_obj > dev->n_hardlinks)
+ retVal = n_obj - dev->n_hardlinks;