+ } 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;
+
+ if(yaffsfs_CheckPath(path) < 0){
+ yaffsfs_SetError(-ENAMETOOLONG);
+ return -1;
+ }
+
+ 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;
+
+ if(yaffsfs_CheckPath(path) < 0){
+ yaffsfs_SetError(-ENAMETOOLONG);
+ return -1;
+ }
+
+ 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);
+