Commit 9c4bab2668e6b5a9b69f77e3533380b6fd79034e
Committed by
Anthony Liguori
1 parent
cf57298a
qemu-io: add flag to mark files growable
Add a -g flag to the open command and the main qemu-io command line to allow opening a file growable. This is only allowed for protocols, mirroring the limitation exposed through bdrv_file_open. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Showing
1 changed file
with
26 additions
and
5 deletions
qemu-io.c
... | ... | @@ -1172,7 +1172,7 @@ static const cmdinfo_t close_cmd = { |
1172 | 1172 | .oneline = "close the current open file", |
1173 | 1173 | }; |
1174 | 1174 | |
1175 | -static int openfile(char *name, int flags) | |
1175 | +static int openfile(char *name, int flags, int growable) | |
1176 | 1176 | { |
1177 | 1177 | if (bs) { |
1178 | 1178 | fprintf(stderr, "file open already, try 'help close'\n"); |
... | ... | @@ -1189,6 +1189,17 @@ static int openfile(char *name, int flags) |
1189 | 1189 | return 1; |
1190 | 1190 | } |
1191 | 1191 | |
1192 | + | |
1193 | + if (growable) { | |
1194 | + if (!bs->drv || !bs->drv->protocol_name) { | |
1195 | + fprintf(stderr, | |
1196 | + "%s: only protocols can be opened growable\n", | |
1197 | + progname); | |
1198 | + return 1; | |
1199 | + } | |
1200 | + bs->growable = 1; | |
1201 | + } | |
1202 | + | |
1192 | 1203 | return 0; |
1193 | 1204 | } |
1194 | 1205 | |
... | ... | @@ -1207,6 +1218,7 @@ open_help(void) |
1207 | 1218 | " -r, -- open file read-only\n" |
1208 | 1219 | " -s, -- use snapshot file\n" |
1209 | 1220 | " -n, -- disable host cache\n" |
1221 | +" -g, -- allow file to grow (only applies to protocols)" | |
1210 | 1222 | "\n"); |
1211 | 1223 | } |
1212 | 1224 | |
... | ... | @@ -1217,9 +1229,10 @@ open_f(int argc, char **argv) |
1217 | 1229 | { |
1218 | 1230 | int flags = 0; |
1219 | 1231 | int readonly = 0; |
1232 | + int growable = 0; | |
1220 | 1233 | int c; |
1221 | 1234 | |
1222 | - while ((c = getopt(argc, argv, "snCr")) != EOF) { | |
1235 | + while ((c = getopt(argc, argv, "snCrg")) != EOF) { | |
1223 | 1236 | switch (c) { |
1224 | 1237 | case 's': |
1225 | 1238 | flags |= BDRV_O_SNAPSHOT; |
... | ... | @@ -1233,6 +1246,9 @@ open_f(int argc, char **argv) |
1233 | 1246 | case 'r': |
1234 | 1247 | readonly = 1; |
1235 | 1248 | break; |
1249 | + case 'g': | |
1250 | + growable = 1; | |
1251 | + break; | |
1236 | 1252 | default: |
1237 | 1253 | return command_usage(&open_cmd); |
1238 | 1254 | } |
... | ... | @@ -1246,7 +1262,7 @@ open_f(int argc, char **argv) |
1246 | 1262 | if (optind != argc - 1) |
1247 | 1263 | return command_usage(&open_cmd); |
1248 | 1264 | |
1249 | - return openfile(argv[optind], flags); | |
1265 | + return openfile(argv[optind], flags, growable); | |
1250 | 1266 | } |
1251 | 1267 | |
1252 | 1268 | static const cmdinfo_t open_cmd = { |
... | ... | @@ -1306,7 +1322,8 @@ static void usage(const char *name) |
1306 | 1322 | int main(int argc, char **argv) |
1307 | 1323 | { |
1308 | 1324 | int readonly = 0; |
1309 | - const char *sopt = "hVc:Crsnm"; | |
1325 | + int growable = 0; | |
1326 | + const char *sopt = "hVc:Crsnmg"; | |
1310 | 1327 | struct option lopt[] = { |
1311 | 1328 | { "help", 0, 0, 'h' }, |
1312 | 1329 | { "version", 0, 0, 'V' }, |
... | ... | @@ -1317,6 +1334,7 @@ int main(int argc, char **argv) |
1317 | 1334 | { "snapshot", 0, 0, 's' }, |
1318 | 1335 | { "nocache", 0, 0, 'n' }, |
1319 | 1336 | { "misalign", 0, 0, 'm' }, |
1337 | + { "growable", 0, 0, 'g' }, | |
1320 | 1338 | { NULL, 0, 0, 0 } |
1321 | 1339 | }; |
1322 | 1340 | int c; |
... | ... | @@ -1345,6 +1363,9 @@ int main(int argc, char **argv) |
1345 | 1363 | case 'm': |
1346 | 1364 | misalign = 1; |
1347 | 1365 | break; |
1366 | + case 'g': | |
1367 | + growable = 1; | |
1368 | + break; | |
1348 | 1369 | case 'V': |
1349 | 1370 | printf("%s version %s\n", progname, VERSION); |
1350 | 1371 | exit(0); |
... | ... | @@ -1392,7 +1413,7 @@ int main(int argc, char **argv) |
1392 | 1413 | flags |= BDRV_O_RDWR; |
1393 | 1414 | |
1394 | 1415 | if ((argc - optind) == 1) |
1395 | - openfile(argv[optind], flags); | |
1416 | + openfile(argv[optind], flags, growable); | |
1396 | 1417 | command_loop(); |
1397 | 1418 | |
1398 | 1419 | /* | ... | ... |