X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=direct%2Fyaffsfs.c;h=823f7edcfc21c9dd7e2247e1da8781e8a74eb7e1;hp=7647444699f56d7e8cdf88cac1f01b05df511b98;hb=refs%2Fheads%2Fmaster;hpb=b4d5215f18486403d16f2e776000e43eba052f40 diff --git a/direct/yaffsfs.c b/direct/yaffsfs.c index 7647444..823f7ed 100644 --- a/direct/yaffsfs.c +++ b/direct/yaffsfs.c @@ -1,8 +1,7 @@ /* * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. * - * Copyright (C) 2002-2011 Aleph One Ltd. - * for Toby Churchill Ltd and Brightstar Engineering + * Copyright (C) 2002-2018 Aleph One Ltd. * * Created by Charles Manning * @@ -893,12 +892,14 @@ int yaffs_open_sharing_reldir(struct yaffs_obj *reldir, const YCHAR *path, is_dir = (obj->variant_type == YAFFS_OBJECT_TYPE_DIRECTORY); - /* A directory can't be opened except for read */ - if ( is_dir && - (writeRequested || !readRequested || rwflags != O_RDONLY)) { - openDenied = __LINE__; - yaffsfs_SetError(-EISDIR); - errorReported = __LINE__; + /* + * A directory can't be opened except for read, so we + * ignore other flags + */ + if (is_dir) { + writeRequested = 0; + readRequested = 1; + rwflags = O_RDONLY; } if(is_dir) { @@ -1942,17 +1943,21 @@ static int yaffsfs_DoUtime(struct yaffs_obj *obj, } #if !CONFIG_YAFFS_WINCE + // if the the buffer is null then create one with the fields set to the current time. if (!buf) { local.actime = Y_CURRENT_TIME; local.modtime = local.actime; buf = &local; } + // copy the buffer's time into the obj. if (obj) { int result; obj->yst_atime = buf->actime; obj->yst_mtime = buf->modtime; + + // set the obj to dirty to cause it to be written to flash during the next flush operation. obj->dirty = 1; result = yaffs_flush_file(obj, 0, 0, 0); retVal = result == YAFFS_OK ? 0 : -1; @@ -3049,6 +3054,7 @@ int yaffs_remount_common(struct yaffs_dev *dev, const YCHAR *path, int force, int read_only) { int retVal = -1; + int was_read_only; if (yaffsfs_CheckMemRegion(path, 0, 0) < 0) { yaffsfs_SetError(-EFAULT); @@ -3071,7 +3077,11 @@ int yaffs_remount_common(struct yaffs_dev *dev, const YCHAR *path, if (force || !yaffsfs_IsDevBusy(dev)) { if (read_only) yaffs_checkpoint_save(dev); + was_read_only = dev->read_only; dev->read_only = read_only ? 1 : 0; + if (was_read_only && !read_only) { + yaffs_guts_cleanup(dev); + } retVal = 0; } else yaffsfs_SetError(-EBUSY); @@ -3100,14 +3110,17 @@ int yaffs_unmount2_common(struct yaffs_dev *dev, const YCHAR *path, int force) { int retVal = -1; - if (yaffsfs_CheckMemRegion(path, 0, 0) < 0) { - yaffsfs_SetError(-EFAULT); - return -1; - } - if (yaffsfs_CheckPath(path) < 0) { - yaffsfs_SetError(-ENAMETOOLONG); - return -1; + if (!dev) { + if (yaffsfs_CheckMemRegion(path, 0, 0) < 0) { + yaffsfs_SetError(-EFAULT); + return -1; + } + + if (yaffsfs_CheckPath(path) < 0) { + yaffsfs_SetError(-ENAMETOOLONG); + return -1; + } } yaffsfs_Lock(); @@ -3635,7 +3648,7 @@ struct yaffs_dirent *yaffs_readdir_fd(int fd) yaffsfs_Lock(); f = yaffsfs_HandleToFileDes(fd); - if(f && f->isDir) + if(f && f->isDir && f->v.dir) ret = yaffsfs_readdir_no_lock(f->v.dir); yaffsfs_Unlock(); return ret;