Change enums to u32 for stored fields
[yaffs2.git] / yaffs_vfs_single.c
index 232dc2625328a7173509456dcf227c7411d9da5b..d77c87dabfd85b3dafa9b9eb9fd9fc5975a5f344 100644 (file)
@@ -450,7 +450,7 @@ static int yaffs_sync_object(struct file *file,
 
        yaffs_trace(YAFFS_TRACE_OS | YAFFS_TRACE_SYNC, "yaffs_sync_object");
        yaffs_gross_lock(dev);
-       yaffs_flush_file(obj, 1, datasync);
+       yaffs_flush_file(obj, 1, datasync, 0);
        yaffs_gross_unlock(dev);
        return 0;
 }
@@ -890,7 +890,7 @@ static int yaffs_file_flush(struct file *file, fl_owner_t id)
 
        yaffs_gross_lock(dev);
 
-       yaffs_flush_file(obj, 1, 0);
+       yaffs_flush_file(obj, 1, 0, 0);
 
        yaffs_gross_unlock(dev);
 
@@ -1496,7 +1496,7 @@ static void yaffs_flush_inodes(struct super_block *sb)
                if (obj) {
                        yaffs_trace(YAFFS_TRACE_OS,
                                "flushing obj %d", obj->obj_id);
-                       yaffs_flush_file(obj, 1, 0);
+                       yaffs_flush_file(obj, 1, 0, 0);
                }
        }
 }
@@ -1510,7 +1510,7 @@ static void yaffs_flush_super(struct super_block *sb, int do_checkpoint)
 
        yaffs_flush_inodes(sb);
        yaffs_update_dirty_dirs(dev);
-       yaffs_flush_whole_cache(dev);
+       yaffs_flush_whole_cache(dev, 1);
        if (do_checkpoint)
                yaffs_checkpoint_save(dev);
 }
@@ -1943,8 +1943,6 @@ static void yaffs_put_super(struct super_block *sb)
 
        kfree(dev);
 
-
-
        if (mtd && mtd->sync)
                mtd->sync(mtd);
 
@@ -1952,12 +1950,54 @@ static void yaffs_put_super(struct super_block *sb)
                put_mtd_device(mtd);
 }
 
+/* the function only is used to change dev->read_only when this file system
+ * is remounted.
+ */
+static int yaffs_remount_fs(struct super_block *sb, int *flags, char *data)
+{
+       int read_only = 0;
+       struct mtd_info *mtd;
+       struct yaffs_dev *dev = 0;
+
+       /* Get the device */
+       mtd = get_mtd_device(NULL, MINOR(sb->s_dev));
+       if (!mtd) {
+               yaffs_trace(YAFFS_TRACE_ALWAYS,
+                       "MTD device #%u doesn't appear to exist",
+                       MINOR(sb->s_dev));
+               return 1;
+       }
+
+       /* Check it's NAND */
+       if (mtd->type != MTD_NANDFLASH) {
+               yaffs_trace(YAFFS_TRACE_ALWAYS,
+                       "MTD device is not NAND it's type %d",
+                       mtd->type);
+               return 1;
+       }
+
+       read_only = ((*flags & MS_RDONLY) != 0);
+       if (!read_only && !(mtd->flags & MTD_WRITEABLE)) {
+               read_only = 1;
+               printk(KERN_INFO
+                       "yaffs: mtd is read only, setting superblock read only");
+               *flags |= MS_RDONLY;
+       }
+
+       dev = sb->s_fs_info;
+       dev->read_only = read_only;
+
+       return 0;
+}
+
+
 static const struct super_operations yaffs_super_ops = {
        .statfs = yaffs_statfs,
        .put_super = yaffs_put_super,
        .evict_inode = yaffs_evict_inode,
        .sync_fs = yaffs_sync_fs,
        .write_super = yaffs_write_super,
+       .remount_fs = yaffs_remount_fs,
 };
 
 static struct super_block *yaffs_internal_read_super(int yaffs_version,