libfstools: partname: raise priority to 25
[project/fstools.git] / jffs2reset.c
index dbe049881f5cbff97af411908406ffa0294a56b4..acff913409da7a7dd271cd16c6f76848905fdc53 100644 (file)
 
 #include <fcntl.h>
 #include <dirent.h>
+#include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
 #include <getopt.h>
 
+#include <mtd/ubi-user.h>
 
 #include "libfstools/libfstools.h"
 #include "libfstools/volume.h"
@@ -40,7 +42,7 @@ ask_user(void)
        return 0;
 }
 
-static int jffs2_reset(struct volume *v, int reset)
+static int jffs2_reset(struct volume *v, int reset, int keep)
 {
        char *mp;
 
@@ -48,7 +50,7 @@ static int jffs2_reset(struct volume *v, int reset)
        if (mp) {
                ULOG_INFO("%s is mounted as %s, only erasing files\n", v->blk, mp);
                fs_state_set("/overlay", FS_STATE_PENDING);
-               overlay_delete(mp, false);
+               overlay_delete(mp, keep);
                mount(mp, "/", NULL, MS_REMOUNT, 0);
        } else {
                ULOG_INFO("%s is not mounted\n", v->blk);
@@ -79,6 +81,13 @@ static int jffs2_mark(struct volume *v)
                return -1;
        }
 
+       if (volume_identify(v) == FS_UBIFS) {
+               uint64_t llz = 0;
+               int ret = ioctl(fd, UBI_IOCVOLUP, &llz);
+               close(fd);
+               return ret;
+       }
+
        sz = write(fd, &deadc0de, sizeof(deadc0de));
        close(fd);
 
@@ -93,8 +102,8 @@ static int jffs2_mark(struct volume *v)
 int main(int argc, char **argv)
 {
        struct volume *v;
-       int ch, yes = 0, reset = 0;
-       while ((ch = getopt(argc, argv, "yr")) != -1) {
+       int ch, yes = 0, reset = 0, keep = 0;
+       while ((ch = getopt(argc, argv, "yrk")) != -1) {
                switch(ch) {
                case 'y':
                        yes = 1;
@@ -102,6 +111,9 @@ int main(int argc, char **argv)
                case 'r':
                        reset = 1;
                        break;
+               case 'k':
+                       keep = 1;
+                       break;
                }
 
        }
@@ -128,5 +140,5 @@ int main(int argc, char **argv)
        volume_init(v);
        if (!strcmp(*argv, "jffs2mark"))
                return jffs2_mark(v);
-       return jffs2_reset(v, reset);
+       return jffs2_reset(v, reset, keep);
 }