summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgkostka <kostka.grzegorz@gmail.com>2015-11-30 09:38:20 +0100
committergkostka <kostka.grzegorz@gmail.com>2015-11-30 09:38:20 +0100
commit03375d29a9383d054febf5bca6ed6f50827de35f (patch)
tree21cf5db4a8ffed5bd1c810fce0c8ca6d63c1c2e6
parent915c70b309ba95c4a798f9fc7234a8b843e6c90f (diff)
ext4: introduce ext4_recover function
-rw-r--r--lwext4/ext4.c40
-rw-r--r--lwext4/ext4.h7
2 files changed, 36 insertions, 11 deletions
diff --git a/lwext4/ext4.c b/lwext4/ext4.c
index 7e1e9f3..7bb723e 100644
--- a/lwext4/ext4.c
+++ b/lwext4/ext4.c
@@ -411,20 +411,10 @@ int ext4_mount(const char *dev_name, const char *mount_point)
return r;
}
- /* TODO: journal mount checking. */
- if (ext4_sb_feature_com(&mp->fs.sb, EXT4_FCOM_HAS_JOURNAL)) {
- struct jbd_fs jbd_fs = {0};
- r = jbd_get_fs(&mp->fs, &jbd_fs);
- if (r != EOK)
- return r;
-
- r = jbd_recover(&jbd_fs);
- jbd_put_fs(&jbd_fs);
- }
-
return r;
}
+
int ext4_umount(const char *mount_point)
{
int i;
@@ -469,6 +459,34 @@ static struct ext4_mountpoint *ext4_get_mount(const char *path)
return 0;
}
+int ext4_recover(const char *mount_point)
+{
+ struct ext4_mountpoint *mp = ext4_get_mount(mount_point);
+ if (!mp)
+ return ENOENT;
+
+ int r = ENOTSUP;
+ if (ext4_sb_feature_com(&mp->fs.sb, EXT4_FCOM_HAS_JOURNAL)) {
+ struct jbd_fs *jbd_fs = calloc(1, sizeof(struct jbd_fs));
+ if (!jbd_fs)
+ return ENOMEM;
+
+
+ r = jbd_get_fs(&mp->fs, jbd_fs);
+ if (r != EOK) {
+ free(jbd_fs);
+ return r;
+ }
+
+ r = jbd_recover(jbd_fs);
+ jbd_put_fs(jbd_fs);
+ free(jbd_fs);
+ }
+
+ return r;
+}
+
+
int ext4_mount_point_stats(const char *mount_point,
struct ext4_mount_stats *stats)
{
diff --git a/lwext4/ext4.h b/lwext4/ext4.h
index 943fc9e..208ddb9 100644
--- a/lwext4/ext4.h
+++ b/lwext4/ext4.h
@@ -182,6 +182,13 @@ int ext4_mount(const char *dev_name, const char *mount_point);
* @return standard error code */
int ext4_umount(const char *mount_point);
+
+/**@brief Journal recovery.
+ * @param mount_point mount point
+ * @warning Must be called after @ref ext4_mount
+ * @return standard error code */
+int ext4_recover(const char *mount_point);
+
/**@brief Some of the filesystem stats.*/
struct ext4_mount_stats {
uint32_t inodes_count;