From a001a0d710ec61d8bc11841f44ac0d1f296040ea Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Thu, 14 Jul 2011 11:38:25 +0100 Subject: [PATCH] New API: btrfs-filesystem-resize (RHBZ#721160). This resizes a btrfs filesystem. --- daemon/Makefile.am | 1 + daemon/btrfs.c | 84 ++++++++++++++++++++++++++++++++++++++++++ generator/generator_actions.ml | 23 ++++++++++++ po/POTFILES.in | 1 + src/MAX_PROC_NR | 2 +- 5 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 daemon/btrfs.c diff --git a/daemon/Makefile.am b/daemon/Makefile.am index 78049c9..67589b4 100644 --- a/daemon/Makefile.am +++ b/daemon/Makefile.am @@ -95,6 +95,7 @@ guestfsd_SOURCES = \ base64.c \ blkid.c \ blockdev.c \ + btrfs.c \ checksum.c \ cmp.c \ command.c \ diff --git a/daemon/btrfs.c b/daemon/btrfs.c new file mode 100644 index 0000000..619ab50 --- /dev/null +++ b/daemon/btrfs.c @@ -0,0 +1,84 @@ +/* libguestfs - the guestfsd daemon + * Copyright (C) 2011 Red Hat Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include + +#include +#include +#include +#include +#include + +#include "daemon.h" +#include "actions.h" +#include "optgroups.h" + +int +optgroup_btrfs_available (void) +{ + return prog_exists ("btrfs"); +} + +/* Takes optional arguments, consult optargs_bitmask. */ +int +do_btrfs_filesystem_resize (const char *filesystem, int64_t size) +{ + char *buf; + char *err; + int r; + const char *argv[16]; + size_t i = 0; + char size_str[32]; + + argv[i++] = "btrfs"; + argv[i++] = "filesystem"; + argv[i++] = "resize"; + + if (optargs_bitmask & GUESTFS_BTRFS_FILESYSTEM_RESIZE_SIZE_BITMASK) { + if (size <= 0) { + reply_with_error ("size is zero or negative"); + return -1; + } + + snprintf (size_str, sizeof size_str, "%" PRIi64, size); + argv[i++] = size_str; + } + else + argv[i++] = "max"; + + buf = sysroot_path (filesystem); + if (!buf) { + reply_with_error ("malloc"); + return -1; + } + + argv[i++] = buf; + argv[i++] = NULL; + + r = commandv (NULL, &err, argv); + free (buf); + + if (r == -1) { + reply_with_error ("%s: %s", filesystem, err); + free (err); + return -1; + } + + free (err); + return 0; +} diff --git a/generator/generator_actions.ml b/generator/generator_actions.ml index 8592a39..ebde9c9 100644 --- a/generator/generator_actions.ml +++ b/generator/generator_actions.ml @@ -6043,6 +6043,29 @@ single filesystem without booting into Windows between each resize. See also L."); + ("btrfs_filesystem_resize", (RErr, [Pathname "mountpoint"], [Int64 "size"]), 289, [Optional "btrfs"], + [], + "resize a btrfs filesystem", + "\ +This command resizes a btrfs filesystem. + +Note that unlike other resize calls, the filesystem has to be +mounted and the parameter is the mountpoint not the device +(this is a requirement of btrfs itself). + +The optional parameters are: + +=over 4 + +=item C + +The new size (in bytes) of the filesystem. If omitted, the filesystem +is resized to the maximum size. + +=back + +See also L."); + ] let all_functions = non_daemon_functions @ daemon_functions diff --git a/po/POTFILES.in b/po/POTFILES.in index 069ccb1..77dda98 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -7,6 +7,7 @@ daemon/available.c daemon/base64.c daemon/blkid.c daemon/blockdev.c +daemon/btrfs.c daemon/checksum.c daemon/cmp.c daemon/command.c diff --git a/src/MAX_PROC_NR b/src/MAX_PROC_NR index ea80947..336dd5e 100644 --- a/src/MAX_PROC_NR +++ b/src/MAX_PROC_NR @@ -1 +1 @@ -288 +289 -- 1.8.3.1