On 2015年01月22日 17:10, Wenlin Kang wrote:
> For yaffs file system, the mode of reading or writing is restricted at
> four pointer where are mnt->mnt_flags,mnt->mnt_sb->s_flags,mtd->flags
> and dev->read_only,the first three is used handle file and file
> system(eg,remount) operation, and last one(dev->read_only) almost is used
> handle checkpoint of yaffs2. However, in current code, the dev->read_only
> only can be changed at first time when the yaffs2 file system is mounted,
> later it can't be changed again(eg,mount -o remount), the result is that
> the checkpoint's saving operation always can't succeed if you set readonly
> mode for yaffs2 file system when it is mounted at the first time.
>
> To fix this issue, we implement yaffs_remount_fs() which allows the
> rootfs to be remounted as r/w.
>
> Signed-off-by: Wenlin Kang <wenlin.kang@windriver.com>
> ---
> yaffs_vfs_multi.c | 40 ++++++++++++++++++++++++++++++++++++++++
> yaffs_vfs_single.c | 41 +++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 81 insertions(+)
>
> diff --git a/yaffs_vfs_multi.c b/yaffs_vfs_multi.c
> index 76bc1db..605438a 100644
> --- a/yaffs_vfs_multi.c
> +++ b/yaffs_vfs_multi.c
> @@ -2580,6 +2580,45 @@ static int yaffs_sync_fs(struct super_block *sb)
> }
>
>
> +/* 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,
> @@ -2601,6 +2640,7 @@ static const struct super_operations yaffs_super_ops = {
> #ifdef YAFFS_HAS_WRITE_SUPER
> .write_super = yaffs_write_super,
> #endif
> + .remount_fs = yaffs_remount_fs,
> };
>
> struct yaffs_options {
> diff --git a/yaffs_vfs_single.c b/yaffs_vfs_single.c
> index 232dc26..a510f22 100644
> --- a/yaffs_vfs_single.c
> +++ b/yaffs_vfs_single.c
> @@ -1952,12 +1952,53 @@ 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,
ping ......
--
Thanks,
Wenlin Kang