summaryrefslogtreecommitdiff
path: root/src/ext4_fs.c
diff options
context:
space:
mode:
authorngkaho1234 <ngkaho1234@gmail.com>2016-01-30 23:26:22 +0800
committerngkaho1234 <ngkaho1234@gmail.com>2016-01-30 23:26:22 +0800
commit8929c98e42e81dce0b00d03a1c7b2f45ee85fe87 (patch)
tree4105a1ca03e0c61983402e087d600e973e43faa9 /src/ext4_fs.c
parent9b40d089d6cf5912b558dd3e0ca1a246baa6750a (diff)
ext4: add read_only parameter to ext4_mount routine.
Now users can mount a filesystem as read-only mode explicitly.
Diffstat (limited to 'src/ext4_fs.c')
-rw-r--r--src/ext4_fs.c27
1 files changed, 16 insertions, 11 deletions
diff --git a/src/ext4_fs.c b/src/ext4_fs.c
index 392728d..7a97bc6 100644
--- a/src/ext4_fs.c
+++ b/src/ext4_fs.c
@@ -55,12 +55,12 @@
#include <string.h>
-int ext4_fs_init(struct ext4_fs *fs, struct ext4_blockdev *bdev)
+int ext4_fs_init(struct ext4_fs *fs, struct ext4_blockdev *bdev,
+ bool read_only)
{
int r, i;
uint16_t tmp;
uint32_t bsize;
- bool read_only = false;
ext4_assert(fs && bdev);
@@ -82,7 +82,7 @@ int ext4_fs_init(struct ext4_fs *fs, struct ext4_blockdev *bdev)
return r;
if (read_only)
- return ENOTSUP;
+ fs->read_only = true;
/* Compute limits for indirect block levels */
uint32_t blocks_id = bsize / sizeof(uint32_t);
@@ -104,14 +104,16 @@ int ext4_fs_init(struct ext4_fs *fs, struct ext4_blockdev *bdev)
"last umount error: superblock fs_error flag\n");
- /* Mark system as mounted */
- ext4_set16(&fs->sb, state, EXT4_SUPERBLOCK_STATE_ERROR_FS);
- r = ext4_sb_write(fs->bdev, &fs->sb);
- if (r != EOK)
- return r;
+ if (!fs->read_only) {
+ /* Mark system as mounted */
+ ext4_set16(&fs->sb, state, EXT4_SUPERBLOCK_STATE_ERROR_FS);
+ r = ext4_sb_write(fs->bdev, &fs->sb);
+ if (r != EOK)
+ return r;
- /*Update mount count*/
- ext4_set16(&fs->sb, mount_count, ext4_get16(&fs->sb, mount_count) + 1);
+ /*Update mount count*/
+ ext4_set16(&fs->sb, mount_count, ext4_get16(&fs->sb, mount_count) + 1);
+ }
return r;
}
@@ -123,7 +125,10 @@ int ext4_fs_fini(struct ext4_fs *fs)
/*Set superblock state*/
ext4_set16(&fs->sb, state, EXT4_SUPERBLOCK_STATE_VALID_FS);
- return ext4_sb_write(fs->bdev, &fs->sb);
+ if (!fs->read_only)
+ return ext4_sb_write(fs->bdev, &fs->sb);
+
+ return EOK;
}
static void ext4_fs_debug_features_inc(uint32_t features_incompatible)