struct yaffs_obj *dirObj; /* ptr to directory being searched */
struct yaffs_obj *nextReturn; /* obj returned by next readddir */
struct list_head others;
- int offset:20;
- unsigned inUse:1;
+ s32 offset:20;
+ u8 inUse:1;
};
struct yaffsfs_FileDes {
u8 append:1;
u8 shareRead:1;
u8 shareWrite:1;
- int inodeId:12; /* Index to corresponding yaffsfs_Inode */
- int handleCount:10; /* Number of handles for this fd */
+ s32 inodeId:12; /* Index to corresponding yaffsfs_Inode */
+ s32 handleCount:10; /* Number of handles for this fd */
union {
Y_LOFF_T position; /* current position in file */
yaffs_DIR *dir;
* Stuff to handle names.
*/
#ifdef CONFIG_YAFFS_CASE_INSENSITIVE
-
+#ifndef CONFIG_YAFFS_WINCE
static int yaffs_toupper(YCHAR a)
{
if (a >= 'a' && a <= 'z')
else
return a;
}
+#endif
static int yaffsfs_Match(YCHAR a, YCHAR b)
{
return 0;
}
-static int yaffsfs_CheckNameLength(const char *name)
+static int yaffsfs_CheckNameLength(const YCHAR *name)
{
int retVal = 0;
else if (obj->my_dev->read_only)
yaffsfs_SetError(-EROFS);
else {
- yaffs_flush_file(obj, 1, datasync);
+ yaffs_flush_file(obj, 1, datasync, 0);
retVal = 0;
}
else {
/* clean up */
if(!f->isDir)
- yaffs_flush_file(obj, 1, 0);
+ yaffs_flush_file(obj, 1, 0, 1);
yaffsfs_PutHandle(handle);
retVal = 0;
}
const struct yaffs_utimbuf *buf)
{
int retVal = -1;
- int result;
-
struct yaffs_utimbuf local;
obj = yaffs_get_equivalent_obj(obj);
return -1;
}
+#if !CONFIG_YAFFS_WINCE
if (!buf) {
local.actime = Y_CURRENT_TIME;
local.modtime = local.actime;
}
if (obj) {
+ int result;
+
obj->yst_atime = buf->actime;
obj->yst_mtime = buf->modtime;
obj->dirty = 1;
- result = yaffs_flush_file(obj, 0, 0);
+ result = yaffs_flush_file(obj, 0, 0, 0);
retVal = result == YAFFS_OK ? 0 : -1;
}
+#endif
return retVal;
}
}
obj->dirty = 1;
- result = yaffs_flush_file(obj, 0, 0);
+ result = yaffs_flush_file(obj, 0, 0, 0);
retVal = 0;
} else
/* bad handle */
if (obj) {
obj->yst_mode = mode;
obj->dirty = 1;
- result = yaffs_flush_file(obj, 0, 0);
+ result = yaffs_flush_file(obj, 0, 0, 0);
}
return result == YAFFS_OK ? 0 : -1;
yaffsfs_SetError(-EROFS);
else {
- yaffs_flush_whole_cache(dev);
+ yaffs_flush_whole_cache(dev, 0);
yaffs_checkpoint_save(dev);
retVal = 0;
return yaffs_sync_common(NULL, path);
}
+
+static int yaffsfs_bg_gc_common(struct yaffs_dev *dev,
+ const YCHAR *path,
+ int urgency)
+{
+ int retVal = -1;
+ YCHAR *dummy;
+
+ 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();
+ if (!dev)
+ dev = yaffsfs_FindDevice(path, &dummy);
+
+ if (dev) {
+ if (!dev->is_mounted)
+ yaffsfs_SetError(-EINVAL);
+ else
+ retVal = yaffs_bg_gc(dev, urgency);
+ } else
+ yaffsfs_SetError(-ENODEV);
+
+ yaffsfs_Unlock();
+ return retVal;
+}
+
+/* Background gc functions.
+ * These return 0 when bg done or greater than 0 when gc has been
+ * done and there is still a lot of garbage to be cleaned up.
+ */
+
+int yaffs_do_background_gc(const YCHAR *path, int urgency)
+{
+ return yaffsfs_bg_gc_common(NULL, path, urgency);
+}
+
+int yaffs_do_background_gc_reldev(struct yaffs_dev *dev, int urgency)
+{
+ return yaffsfs_bg_gc_common(dev, NULL, urgency);
+}
+
static int yaffsfs_IsDevBusy(struct yaffs_dev *dev)
{
int i;
if (dev) {
if (dev->is_mounted) {
- yaffs_flush_whole_cache(dev);
+ yaffs_flush_whole_cache(dev, 0);
if (force || !yaffsfs_IsDevBusy(dev)) {
if (read_only)
if (dev) {
if (dev->is_mounted) {
int inUse;
- yaffs_flush_whole_cache(dev);
+ yaffs_flush_whole_cache(dev, 0);
yaffs_checkpoint_save(dev);
inUse = yaffsfs_IsDevBusy(dev);
if (!inUse || force) {
if (dev->is_mounted && unmount_flag) {
int inUse;
- yaffs_flush_whole_cache(dev);
+ yaffs_flush_whole_cache(dev, 0);
yaffs_checkpoint_save(dev);
inUse = yaffsfs_IsDevBusy(dev);
if (!inUse || force_unmount_flag) {
yaffsfs_Unlock();
return ret;
}
+
+yaffs_DIR *yaffs_opendir_reldev(struct yaffs_dev *dev, const YCHAR *dirname)
+{
+ return yaffs_opendir_reldir(ROOT_DIR(dev), dirname);
+}
+
yaffs_DIR *yaffs_opendir(const YCHAR *dirname)
{
return yaffs_opendir_reldir(NULL, dirname);