]> git.proxmox.com Git - qemu.git/blobdiff - qemu-io.c
USB: add usb network redirection support
[qemu.git] / qemu-io.c
index ff353ebba358885764db7d77dfa7fc43fbf223a2..dd4ebf537a0196c9567ada074e7140b2e005fb17 100644 (file)
--- a/qemu-io.c
+++ b/qemu-io.c
@@ -326,7 +326,7 @@ read_help(void)
 " -l, -- length for pattern verification (only with -P)\n"
 " -p, -- use bdrv_pread to read the file\n"
 " -P, -- use a pattern to verify read data\n"
-" -q, -- quite mode, do not show I/O statistics\n"
+" -q, -- quiet mode, do not show I/O statistics\n"
 " -s, -- start offset for pattern verification (only with -P)\n"
 " -v, -- dump buffer to standard output\n"
 "\n");
@@ -509,7 +509,7 @@ readv_help(void)
 " -C, -- report statistics in a machine parsable format\n"
 " -P, -- use a pattern to verify read data\n"
 " -v, -- dump buffer to standard output\n"
-" -q, -- quite mode, do not show I/O statistics\n"
+" -q, -- quiet mode, do not show I/O statistics\n"
 "\n");
 }
 
@@ -633,7 +633,7 @@ write_help(void)
 " -p, -- use bdrv_pwrite to write the file\n"
 " -P, -- use different pattern to fill file\n"
 " -C, -- report statistics in a machine parsable format\n"
-" -q, -- quite mode, do not show I/O statistics\n"
+" -q, -- quiet mode, do not show I/O statistics\n"
 "\n");
 }
 
@@ -765,7 +765,7 @@ writev_help(void)
 " filled with a set pattern (0xcdcdcdcd).\n"
 " -P, -- use different pattern to fill file\n"
 " -C, -- report statistics in a machine parsable format\n"
-" -q, -- quite mode, do not show I/O statistics\n"
+" -q, -- quiet mode, do not show I/O statistics\n"
 "\n");
 }
 
@@ -1100,7 +1100,7 @@ aio_read_help(void)
 " -C, -- report statistics in a machine parsable format\n"
 " -P, -- use a pattern to verify read data\n"
 " -v, -- dump buffer to standard output\n"
-" -q, -- quite mode, do not show I/O statistics\n"
+" -q, -- quiet mode, do not show I/O statistics\n"
 "\n");
 }
 
@@ -1131,8 +1131,10 @@ aio_read_f(int argc, char **argv)
                case 'P':
                        ctx->Pflag = 1;
                        ctx->pattern = parse_pattern(optarg);
-                       if (ctx->pattern < 0)
+                       if (ctx->pattern < 0) {
+                                free(ctx);
                                return 0;
+                        }
                        break;
                case 'q':
                        ctx->qflag = 1;
@@ -1198,7 +1200,7 @@ aio_write_help(void)
 " used to ensure all outstanding aio requests have been completed\n"
 " -P, -- use different pattern to fill file\n"
 " -C, -- report statistics in a machine parsable format\n"
-" -q, -- quite mode, do not show I/O statistics\n"
+" -q, -- quiet mode, do not show I/O statistics\n"
 "\n");
 }
 
@@ -1394,6 +1396,93 @@ static const cmdinfo_t info_cmd = {
        .oneline        = "prints information about the current file",
 };
 
+static void
+discard_help(void)
+{
+       printf(
+"\n"
+" discards a range of bytes from the given offset\n"
+"\n"
+" Example:\n"
+" 'discard 512 1k' - discards 1 kilobyte from 512 bytes into the file\n"
+"\n"
+" Discards a segment of the currently open file.\n"
+" -C, -- report statistics in a machine parsable format\n"
+" -q, -- quiet mode, do not show I/O statistics\n"
+"\n");
+}
+
+static int discard_f(int argc, char **argv);
+
+static const cmdinfo_t discard_cmd = {
+       .name           = "discard",
+       .altname        = "d",
+       .cfunc          = discard_f,
+       .argmin         = 2,
+       .argmax         = -1,
+       .args           = "[-Cq] off len",
+       .oneline        = "discards a number of bytes at a specified offset",
+       .help           = discard_help,
+};
+
+static int
+discard_f(int argc, char **argv)
+{
+       struct timeval t1, t2;
+       int Cflag = 0, qflag = 0;
+       int c, ret;
+       int64_t offset;
+       int count;
+
+       while ((c = getopt(argc, argv, "Cq")) != EOF) {
+               switch (c) {
+               case 'C':
+                       Cflag = 1;
+                       break;
+               case 'q':
+                       qflag = 1;
+                       break;
+               default:
+                       return command_usage(&discard_cmd);
+               }
+       }
+
+       if (optind != argc - 2) {
+               return command_usage(&discard_cmd);
+       }
+
+       offset = cvtnum(argv[optind]);
+       if (offset < 0) {
+               printf("non-numeric length argument -- %s\n", argv[optind]);
+               return 0;
+       }
+
+       optind++;
+       count = cvtnum(argv[optind]);
+       if (count < 0) {
+               printf("non-numeric length argument -- %s\n", argv[optind]);
+               return 0;
+       }
+
+       gettimeofday(&t1, NULL);
+       ret = bdrv_discard(bs, offset >> BDRV_SECTOR_BITS, count >> BDRV_SECTOR_BITS);
+       gettimeofday(&t2, NULL);
+
+       if (ret < 0) {
+               printf("discard failed: %s\n", strerror(-ret));
+               goto out;
+       }
+
+       /* Finally, report back -- -C gives a parsable format */
+       if (!qflag) {
+               t2 = tsub(t2, t1);
+               print_report("discard", &t2, offset, count, count, 1, Cflag);
+       }
+
+out:
+       return 0;
+}
+
 static int
 alloc_f(int argc, char **argv)
 {
@@ -1509,8 +1598,6 @@ static int openfile(char *name, int flags, int growable)
                }
        } else {
                bs = bdrv_new("hda");
-               if (!bs)
-                       return 1;
 
                if (bdrv_open(bs, name, flags, NULL) < 0) {
                        fprintf(stderr, "%s: can't open device %s\n", progname, name);
@@ -1568,7 +1655,7 @@ open_f(int argc, char **argv)
                        flags |= BDRV_O_SNAPSHOT;
                        break;
                case 'n':
-                       flags |= BDRV_O_NOCACHE;
+                       flags |= BDRV_O_NOCACHE | BDRV_O_CACHE_WB;
                        break;
                case 'r':
                        readonly = 1;
@@ -1664,7 +1751,7 @@ int main(int argc, char **argv)
                        flags |= BDRV_O_SNAPSHOT;
                        break;
                case 'n':
-                       flags |= BDRV_O_NOCACHE;
+                       flags |= BDRV_O_NOCACHE | BDRV_O_CACHE_WB;
                        break;
                case 'c':
                        add_user_command(optarg);
@@ -1717,6 +1804,7 @@ int main(int argc, char **argv)
        add_command(&truncate_cmd);
        add_command(&length_cmd);
        add_command(&info_cmd);
+       add_command(&discard_cmd);
        add_command(&alloc_cmd);
        add_command(&map_cmd);