Busybox: Upgrade to 1.21.1 (stable). lsof active.
[tomato.git] / release / src / router / rc / jffs2.c
blob2bef2f5b0d51b044bb7b5359991b67204ee15568
1 /*
3 Tomato Firmware
4 Copyright (C) 2006-2009 Jonathan Zarate
6 */
8 #include "rc.h"
10 #include <sys/mount.h>
11 #include <sys/stat.h>
12 #include <sys/statfs.h>
13 #include <errno.h>
14 #ifndef MNT_DETACH
15 #define MNT_DETACH 0x00000002
16 #endif
18 // #define TEST_INTEGRITY
20 #ifdef TCONFIG_JFFSV1
21 #define JFFS_NAME "jffs"
22 #else
23 #define JFFS_NAME "jffs2"
24 #endif
26 static void error(const char *message)
28 char s[512];
30 snprintf(s, sizeof(s), "Error %s JFFS. Check the logs to see if they contain more details about this error.", message);
31 notice_set("jffs", s);
34 void start_jffs2(void)
36 if (!nvram_match("jffs2_on", "1")) {
37 notice_set("jffs", "");
38 return;
41 int format = 0;
42 char s[256];
43 int size;
44 int part;
45 const char *p;
46 struct statfs sf;
48 if (!wait_action_idle(10)) return;
50 if (!mtd_getinfo("jffs2", &part, &size)) return;
52 if (nvram_match("jffs2_format", "1")) {
53 nvram_set("jffs2_format", "0");
54 nvram_commit_x();
56 if (!mtd_erase("jffs2")) {
57 error("formatting");
58 return;
61 format = 1;
64 sprintf(s, "%d", size);
65 p = nvram_get("jffs2_size");
66 if ((p == NULL) || (strcmp(p, s) != 0)) {
67 if (format) {
68 nvram_set("jffs2_size", s);
69 nvram_commit_x();
71 else if ((p != NULL) && (*p != 0)) {
72 error("verifying known size of");
73 return;
77 if ((statfs("/jffs", &sf) == 0) && (sf.f_type != 0x73717368 /* squashfs */)) {
78 // already mounted
79 notice_set("jffs", format ? "Formatted" : "Loaded");
80 return;
83 if (!mtd_unlock("jffs2")) {
84 error("unlocking");
85 return;
88 modprobe(JFFS_NAME);
90 sprintf(s, MTD_BLKDEV(%d), part);
91 if (mount(s, "/jffs", JFFS_NAME, MS_NOATIME, "") != 0) {
92 modprobe_r(JFFS_NAME);
93 error("mounting");
94 return;
97 #ifdef TEST_INTEGRITY
98 int test;
100 if (format) {
101 if (f_write("/jffs/.tomato_do_not_erase", &size, sizeof(size), 0, 0) != sizeof(size)) {
102 stop_jffs2();
103 error("setting integrity test for");
104 return;
108 if ((f_read("/jffs/.tomato_do_not_erase", &test, sizeof(test)) != sizeof(test)) || (test != size)) {
109 stop_jffs2();
110 error("testing integrity of");
111 return;
113 #endif
115 notice_set("jffs", format ? "Formatted" : "Loaded");
117 if (((p = nvram_get("jffs2_exec")) != NULL) && (*p != 0)) {
118 chdir("/jffs");
119 system(p);
120 chdir("/");
122 run_userfile("/jffs", ".autorun", "/jffs", 3);
125 void stop_jffs2(void)
127 struct statfs sf;
129 if (!wait_action_idle(10)) return;
131 if ((statfs("/jffs", &sf) == 0) && (sf.f_type != 0x73717368)) {
132 // is mounted
133 run_userfile("/jffs", ".autostop", "/jffs", 5);
134 run_nvscript("script_autostop", "/jffs", 5);
137 notice_set("jffs", "Stopped");
138 umount2("/jffs", MNT_DETACH);
139 modprobe_r(JFFS_NAME);