Skip to content

Commit b7587d9

Browse files
committed
btrfs: port create/delete subvolume to libbtrfsutil
Avoids having to exec btrfs-progs and allows us to implement recursive subvolume deletion in the future.
1 parent 3857501 commit b7587d9

File tree

1 file changed

+20
-16
lines changed

1 file changed

+20
-16
lines changed

src/plugins/btrfs.c

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -374,22 +374,24 @@ gboolean bd_btrfs_remove_device (const gchar *mountpoint, const gchar *device, c
374374
*
375375
* Tech category: %BD_BTRFS_TECH_SUBVOL-%BD_BTRFS_TECH_MODE_CREATE
376376
*/
377-
gboolean bd_btrfs_create_subvolume (const gchar *mountpoint, const gchar *name, const BDExtraArg **extra, GError **error) {
377+
gboolean bd_btrfs_create_subvolume (const gchar *mountpoint, const gchar *name, G_GNUC_UNUSED const BDExtraArg **extra, GError **error) {
378378
gchar *path = NULL;
379379
gboolean success = FALSE;
380-
const gchar *argv[5] = {"btrfs", "subvol", "create", NULL, NULL};
381-
382-
if (!check_deps (&avail_deps, DEPS_BTRFS_MASK, deps, DEPS_LAST, &deps_check_lock, error) ||
383-
!check_module_deps (&avail_module_deps, MODULE_DEPS_BTRFS_MASK, module_deps, MODULE_DEPS_LAST, &deps_check_lock, error))
384-
return FALSE;
380+
enum btrfs_util_error err;
385381

386382
if (g_str_has_suffix (mountpoint, "/"))
387383
path = g_strdup_printf ("%s%s", mountpoint, name);
388384
else
389385
path = g_strdup_printf ("%s/%s", mountpoint, name);
390-
argv[3] = path;
391386

392-
success = bd_utils_exec_and_report_error (argv, extra, error);
387+
388+
err = btrfs_util_create_subvolume (path, 0 ,NULL ,NULL);
389+
if (err) {
390+
g_set_error (error, BD_BTRFS_ERROR, BD_BTRFS_ERROR_DEVICE, "%s: %m", btrfs_util_strerror (err));
391+
} else {
392+
success = TRUE;
393+
}
394+
393395
g_free (path);
394396

395397
return success;
@@ -407,22 +409,24 @@ gboolean bd_btrfs_create_subvolume (const gchar *mountpoint, const gchar *name,
407409
*
408410
* Tech category: %BD_BTRFS_TECH_SUBVOL-%BD_BTRFS_TECH_MODE_DELETE
409411
*/
410-
gboolean bd_btrfs_delete_subvolume (const gchar *mountpoint, const gchar *name, const BDExtraArg **extra, GError **error) {
412+
gboolean bd_btrfs_delete_subvolume (const gchar *mountpoint, const gchar *name, G_GNUC_UNUSED const BDExtraArg **extra, GError **error) {
411413
gchar *path = NULL;
412414
gboolean success = FALSE;
413-
const gchar *argv[5] = {"btrfs", "subvol", "delete", NULL, NULL};
414-
415-
if (!check_deps (&avail_deps, DEPS_BTRFS_MASK, deps, DEPS_LAST, &deps_check_lock, error) ||
416-
!check_module_deps (&avail_module_deps, MODULE_DEPS_BTRFS_MASK, module_deps, MODULE_DEPS_LAST, &deps_check_lock, error))
417-
return FALSE;
415+
enum btrfs_util_error err;
418416

419417
if (g_str_has_suffix (mountpoint, "/"))
420418
path = g_strdup_printf ("%s%s", mountpoint, name);
421419
else
422420
path = g_strdup_printf ("%s/%s", mountpoint, name);
423-
argv[3] = path;
424421

425-
success = bd_utils_exec_and_report_error (argv, extra, error);
422+
// TODO: support BTRFS_UTIL_DELETE_SUBVOLUME_RECURSIVE
423+
err = btrfs_util_delete_subvolume (path, 0);
424+
if (err) {
425+
g_set_error (error, BD_BTRFS_ERROR, BD_BTRFS_ERROR_DEVICE, "%s: %m", btrfs_util_strerror (err));
426+
} else {
427+
success = TRUE;
428+
}
429+
426430
g_free (path);
427431

428432
return success;

0 commit comments

Comments
 (0)