X-Git-Url: http://git.archive.openwrt.org/?p=project%2Ffstools.git;a=blobdiff_plain;f=jffs2reset.c;h=041046656decf436b703cdb5523b2b5b58903a93;hp=6beb81e70e86ec050083bfa30507b9a3d464c444;hb=e6004000ff15d7bd32cf5663e8690fc94d7ec747;hpb=bd769895b59939c81bddcc0a689947876d9f6592 diff --git a/jffs2reset.c b/jffs2reset.c index 6beb81e..0410466 100644 --- a/jffs2reset.c +++ b/jffs2reset.c @@ -27,32 +27,7 @@ #include "libfstools/libfstools.h" #include "libfstools/volume.h" -static int -handle_rmdir(const char *dir) -{ - struct dirent *dt; - struct stat st; - DIR *d; - int fd; - - d = opendir(dir); - if (!d) - return -1; - - fd = dirfd(d); - - while ((dt = readdir(d)) != NULL) { - if (fstatat(fd, dt->d_name, &st, AT_SYMLINK_NOFOLLOW) || S_ISDIR(st.st_mode)) - continue; - - unlinkat(fd, dt->d_name, 0); - } - - closedir(d); - rmdir(dir); - - return 0; -} +static int jffs2_mark(struct volume *v); static int ask_user(int argc, char **argv) @@ -66,58 +41,32 @@ ask_user(int argc, char **argv) } -static int -jffs2_reset(int argc, char **argv) +static int jffs2_reset(struct volume *v) { - struct volume *v; char *mp; - if (ask_user(argc, argv)) - return -1; - - if (find_filesystem("overlay")) { - ULOG_ERR("overlayfs not supported by kernel\n"); - return -1; - } - - v = volume_find("rootfs_data"); - if (!v) { - ULOG_ERR("MTD partition 'rootfs_data' not found\n"); - return -1; - } - mp = find_mount_point(v->blk, 1); if (mp) { ULOG_INFO("%s is mounted as %s, only erasing files\n", v->blk, mp); - foreachdir(mp, handle_rmdir); + fs_state_set("/overlay", FS_STATE_PENDING); + overlay_delete(mp, false); mount(mp, "/", NULL, MS_REMOUNT, 0); } else { - ULOG_INFO("%s is not mounted, erasing it\n", v->blk); - volume_erase_all(v); + ULOG_INFO("%s is not mounted\n", v->blk); + return jffs2_mark(v); } return 0; } -static int -jffs2_mark(int argc, char **argv) +static int jffs2_mark(struct volume *v) { __u32 deadc0de = __cpu_to_be32(0xdeadc0de); - struct volume *v; size_t sz; int fd; - if (ask_user(argc, argv)) - return -1; - - v = volume_find("rootfs_data"); - if (!v) { - ULOG_ERR("MTD partition 'rootfs_data' not found\n"); - return -1; - } - fd = open(v->blk, O_WRONLY); - ULOG_INFO("%s - marking with deadc0de\n", v->blk); + ULOG_INFO("%s will be erased on next mount\n", v->blk); if (!fd) { ULOG_ERR("opening %s failed\n", v->blk); return -1; @@ -136,7 +85,28 @@ jffs2_mark(int argc, char **argv) int main(int argc, char **argv) { + struct volume *v; + + if (ask_user(argc, argv)) + return -1; + + /* + * TODO: Currently this only checks if kernel supports OverlayFS. We + * should check if there is a mount point using it with rootfs_data + * as upperdir. + */ + if (find_filesystem("overlay")) { + ULOG_ERR("overlayfs not supported by kernel\n"); + return -1; + } + + v = volume_find("rootfs_data"); + if (!v) { + ULOG_ERR("MTD partition 'rootfs_data' not found\n"); + return -1; + } + if (!strcmp(*argv, "jffs2mark")) - return jffs2_mark(argc, argv); - return jffs2_reset(argc, argv); + return jffs2_mark(v); + return jffs2_reset(v); }