aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul B. Henson <henson@acm.org>2013-06-02 17:48:05 -0700
committerDenys Vlasenko <vda.linux@googlemail.com>2013-06-30 02:37:05 +0200
commitf86404f7737e548fd1e4d319701ed4529026df80 (patch)
tree4d58158bfc99b9f4ec4f596b71262d82eb412cd3
parent173aa78bcf68c2a036823bdee803b35820ddcd44 (diff)
downloadbusybox-w32-f86404f7737e548fd1e4d319701ed4529026df80.tar.gz
busybox-w32-f86404f7737e548fd1e4d319701ed4529026df80.tar.bz2
busybox-w32-f86404f7737e548fd1e4d319701ed4529026df80.zip
ubimkvol: add -m option to create volume of maximum size
Signed-off-by: Paul B. Henson <henson@acm.org> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--miscutils/ubi_tools.c51
1 files changed, 45 insertions, 6 deletions
diff --git a/miscutils/ubi_tools.c b/miscutils/ubi_tools.c
index dd99a44f4..6f20f300c 100644
--- a/miscutils/ubi_tools.c
+++ b/miscutils/ubi_tools.c
@@ -95,10 +95,11 @@
95//usage: "\n -d UBI_NUM UBI device number" 95//usage: "\n -d UBI_NUM UBI device number"
96//usage: 96//usage:
97//usage:#define ubimkvol_trivial_usage 97//usage:#define ubimkvol_trivial_usage
98//usage: "UBI_DEVICE -N NAME -s SIZE" 98//usage: "UBI_DEVICE -N NAME [-s SIZE | -m]"
99//usage:#define ubimkvol_full_usage "\n\n" 99//usage:#define ubimkvol_full_usage "\n\n"
100//usage: "Create UBI volume\n" 100//usage: "Create UBI volume\n"
101//usage: "\n -a ALIGNMENT Volume alignment (default 1)" 101//usage: "\n -a ALIGNMENT Volume alignment (default 1)"
102//usage: "\n -m Set volume size to maximum available"
102//usage: "\n -n VOLID Volume ID, if not specified, it" 103//usage: "\n -n VOLID Volume ID, if not specified, it"
103//usage: "\n will be assigned automatically" 104//usage: "\n will be assigned automatically"
104//usage: "\n -N NAME Volume name" 105//usage: "\n -N NAME Volume name"
@@ -141,11 +142,19 @@ int ubi_tools_main(int argc UNUSED_PARAM, char **argv)
141 int alignment = 1; 142 int alignment = 1;
142 char *type = NULL; 143 char *type = NULL;
143 144
144 opt_complementary = "-1:m+:d+:n+:s+:a+"; 145 if (do_mkvol) {
145 opts = getopt32(argv, "m:d:n:N:s:a:t::", 146 opt_complementary = "-1:d+:n+:s+:a+";
146 &mtd_num, &dev_num, &vol_id, 147 opts = getopt32(argv, "md:n:N:s:a:t::",
147 &vol_name, &size_bytes, &alignment, &type 148 &dev_num, &vol_id,
148 ); 149 &vol_name, &size_bytes, &alignment, &type
150 );
151 } else {
152 opt_complementary = "-1:m+:d+:n+:s+:a+";
153 opts = getopt32(argv, "m:d:n:N:s:a:t::",
154 &mtd_num, &dev_num, &vol_id,
155 &vol_name, &size_bytes, &alignment, &type
156 );
157 }
149 ubi_ctrl = argv[optind]; 158 ubi_ctrl = argv[optind];
150 159
151 fd = xopen(ubi_ctrl, O_RDWR); 160 fd = xopen(ubi_ctrl, O_RDWR);
@@ -173,6 +182,36 @@ int ubi_tools_main(int argc UNUSED_PARAM, char **argv)
173 if (do_mkvol) { 182 if (do_mkvol) {
174 struct ubi_mkvol_req req; 183 struct ubi_mkvol_req req;
175 int vol_name_len; 184 int vol_name_len;
185 if (opts & OPTION_M) {
186 unsigned leb_avail;
187 unsigned leb_size;
188 unsigned num;
189 char path[sizeof("/sys/class/ubi/ubi%d/avail_eraseblocks") + sizeof(int)*3];
190 char *p;
191 char buf[20];
192
193 if (strncmp(ubi_ctrl, "/dev/ubi", 8) != 0)
194 bb_error_msg_and_die("%s device node not in correct format", "UBI");
195 num = xstrtou(ubi_ctrl+8, 10);
196 p = path + sprintf(path, "/sys/class/ubi/ubi%d/", num);
197
198 strcpy(p, "avail_eraseblocks");
199 if ((num = open_read_close(path, buf, sizeof(buf))) <= 1)
200 bb_error_msg_and_die("%s could not get LEB available", "UBI");
201 buf[num-1] = '\0'; // trim trailing newline
202 leb_avail = xstrtou(buf, 10);
203
204 strcpy(p, "eraseblock_size");
205 if ((num = open_read_close(path, buf, sizeof(buf))) <= 0)
206 bb_error_msg_and_die("%s could not get LEB size", "UBI");
207 buf[num-1] = '\0'; // trim trailing newline
208 leb_size = xstrtou(buf, 10);
209
210 size_bytes = leb_avail * leb_size;
211
212 if (size_bytes <= 0)
213 bb_error_msg_and_die("%s invalid maximum size calculated", "UBI");
214 } else
176 if (!(opts & OPTION_s)) 215 if (!(opts & OPTION_s))
177 bb_error_msg_and_die("%s size not specified", "UBI"); 216 bb_error_msg_and_die("%s size not specified", "UBI");
178 if (!(opts & OPTION_N)) 217 if (!(opts & OPTION_N))