diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2008-02-26 14:38:57 +0000 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2008-02-26 14:38:57 +0000 |
commit | f23dac59ed7075e6a34892ac9a24d888079b09f8 (patch) | |
tree | 4db4035a20f0e4989b4336c35db2d5d821b8bd93 /tools/xentrace/xentrace.c | |
parent | 7cbda436d9de118d878bdedfcbe579b1b5cec186 (diff) | |
download | xen-f23dac59ed7075e6a34892ac9a24d888079b09f8.tar.gz xen-f23dac59ed7075e6a34892ac9a24d888079b09f8.tar.bz2 xen-f23dac59ed7075e6a34892ac9a24d888079b09f8.zip |
xentrace: Add option to reserve disk space
Before writing records, xentrace will check to make sure that there is
a minimum amount of space left on the output filesystem.
Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>
Diffstat (limited to 'tools/xentrace/xentrace.c')
-rw-r--r-- | tools/xentrace/xentrace.c | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/tools/xentrace/xentrace.c b/tools/xentrace/xentrace.c index 8fff991ab9..a47215e1a5 100644 --- a/tools/xentrace/xentrace.c +++ b/tools/xentrace/xentrace.c @@ -15,6 +15,7 @@ #include <sys/mman.h> #include <sys/stat.h> #include <sys/types.h> +#include <sys/vfs.h> #include <fcntl.h> #include <unistd.h> #include <errno.h> @@ -53,6 +54,7 @@ typedef struct settings_st { uint32_t evt_mask; uint32_t cpu_mask; unsigned long tbuf_size; + unsigned long disk_rsvd; uint8_t discard:1; } settings_t; @@ -83,8 +85,36 @@ void close_handler(int signal) void write_buffer(unsigned int cpu, unsigned char *start, int size, int total_size, int outfd) { + struct statfs stat; size_t written = 0; + if ( opts.disk_rsvd != 0 ) + { + unsigned long long freespace; + + /* Check that filesystem has enough space. */ + if ( fstatfs (outfd, &stat) ) + { + fprintf(stderr, "Statfs failed!\n"); + goto fail; + } + + freespace = stat.f_bsize * (unsigned long long)stat.f_bfree; + + if ( total_size ) + freespace -= total_size; + else + freespace -= size; + + freespace >>= 20; /* Convert to MB */ + + if ( freespace <= opts.disk_rsvd ) + { + fprintf(stderr, "Disk space limit reached (free space: %lluMB, limit: %luMB).\n", freespace, opts.disk_rsvd); + exit (EXIT_FAILURE); + } + } + /* Write a CPU_BUF record on each buffer "window" written. Wrapped * windows may involve two writes, so only write the record on the * first write. */ @@ -541,6 +571,7 @@ void parse_args(int argc, char **argv) { "cpu-mask", required_argument, 0, 'c' }, { "evt-mask", required_argument, 0, 'e' }, { "trace-buf-size", required_argument, 0, 'S' }, + { "reserve-disk-space", required_argument, 0, 'r' }, { "discard-buffers", no_argument, 0, 'D' }, { "help", no_argument, 0, '?' }, { "version", no_argument, 0, 'V' }, @@ -572,11 +603,15 @@ void parse_args(int argc, char **argv) printf("%s\n", program_version); exit(EXIT_SUCCESS); break; - + case 'D': /* Discard traces currently in buffer */ opts.discard = 1; break; - + + case 'r': /* Disk-space reservation */ + opts.disk_rsvd = argtol(optarg, 0); + break; + default: usage(); } @@ -604,6 +639,7 @@ int main(int argc, char **argv) opts.poll_sleep = POLL_SLEEP_MILLIS; opts.evt_mask = 0; opts.cpu_mask = 0; + opts.disk_rsvd = 0; parse_args(argc, argv); |