Skip to content

Commit 2b47e34

Browse files
committed
btrfs: use libbtrfsutil for get/set default subvolume
libbtrfsutil provides it's own error enum for libbtrfsutil functions and as we no longer parse output this introduces a BD_BTRFS_ERROR_NOT_FOUND error type. As the mount point not being found is the most likely failure scenario.
1 parent 40f1df9 commit 2b47e34

File tree

3 files changed

+19
-49
lines changed

3 files changed

+19
-49
lines changed

src/plugins/btrfs.c

Lines changed: 12 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include <unistd.h>
2323
#include <blockdev/utils.h>
2424
#include <bs_size.h>
25+
#include <btrfsutil.h>
2526

2627
#include "btrfs.h"
2728
#include "check_deps.h"
@@ -453,48 +454,14 @@ gboolean bd_btrfs_delete_subvolume (const gchar *mountpoint, const gchar *name,
453454
* Tech category: %BD_BTRFS_TECH_SUBVOL-%BD_BTRFS_TECH_MODE_QUERY
454455
*/
455456
guint64 bd_btrfs_get_default_subvolume_id (const gchar *mountpoint, GError **error) {
456-
GRegex *regex = NULL;
457-
GMatchInfo *match_info = NULL;
458-
gboolean success = FALSE;
459-
gchar *output = NULL;
460-
gchar *match = NULL;
457+
enum btrfs_util_error err;
461458
guint64 ret = 0;
462-
const gchar *argv[5] = {"btrfs", "subvol", "get-default", mountpoint, NULL};
463-
464-
if (!check_deps (&avail_deps, DEPS_BTRFS_MASK, deps, DEPS_LAST, &deps_check_lock, error) ||
465-
!check_module_deps (&avail_module_deps, MODULE_DEPS_BTRFS_MASK, module_deps, MODULE_DEPS_LAST, &deps_check_lock, error))
466-
return 0;
467-
468-
regex = g_regex_new ("ID (\\d+) .*", 0, 0, error);
469-
if (!regex) {
470-
bd_utils_log_format (BD_UTILS_LOG_WARNING, "Failed to create new GRegex");
471-
/* error is already populated */
472-
return 0;
473-
}
474-
475-
success = bd_utils_exec_and_capture_output (argv, NULL, &output, error);
476-
if (!success) {
477-
g_regex_unref (regex);
478-
return 0;
479-
}
480459

481-
success = g_regex_match (regex, output, 0, &match_info);
482-
if (!success) {
483-
g_set_error (error, BD_BTRFS_ERROR, BD_BTRFS_ERROR_PARSE, "Failed to parse subvolume's ID");
484-
g_regex_unref (regex);
485-
g_match_info_free (match_info);
486-
g_free (output);
487-
return 0;
460+
err = btrfs_util_get_default_subvolume (mountpoint, &ret);
461+
if (err) {
462+
g_set_error (error, BD_BTRFS_ERROR, BD_BTRFS_ERROR_NOT_FOUND, "%s: %m", btrfs_util_strerror (err));
488463
}
489464

490-
match = g_match_info_fetch (match_info, 1);
491-
ret = g_ascii_strtoull (match, NULL, 0);
492-
493-
g_free (match);
494-
g_match_info_free (match_info);
495-
g_regex_unref (regex);
496-
g_free (output);
497-
498465
return ret;
499466
}
500467

@@ -511,17 +478,15 @@ guint64 bd_btrfs_get_default_subvolume_id (const gchar *mountpoint, GError **err
511478
*
512479
* Tech category: %BD_BTRFS_TECH_SUBVOL-%BD_BTRFS_TECH_MODE_MODIFY
513480
*/
514-
gboolean bd_btrfs_set_default_subvolume (const gchar *mountpoint, guint64 subvol_id, const BDExtraArg **extra, GError **error) {
515-
const gchar *argv[6] = {"btrfs", "subvol", "set-default", NULL, mountpoint, NULL};
481+
gboolean bd_btrfs_set_default_subvolume (const gchar *mountpoint, guint64 subvol_id, G_GNUC_UNUSED const BDExtraArg **extra, GError **error) {
482+
enum btrfs_util_error err;
516483
gboolean ret = FALSE;
517484

518-
if (!check_deps (&avail_deps, DEPS_BTRFS_MASK, deps, DEPS_LAST, &deps_check_lock, error) ||
519-
!check_module_deps (&avail_module_deps, MODULE_DEPS_BTRFS_MASK, module_deps, MODULE_DEPS_LAST, &deps_check_lock, error))
520-
return FALSE;
521-
522-
argv[3] = g_strdup_printf ("%"G_GUINT64_FORMAT, subvol_id);
523-
ret = bd_utils_exec_and_report_error (argv, extra, error);
524-
g_free ((gchar *) argv[3]);
485+
err = btrfs_util_set_default_subvolume (mountpoint, subvol_id);
486+
if (err)
487+
g_set_error (error, BD_BTRFS_ERROR, BD_BTRFS_ERROR_NOT_FOUND, "%s: %m", btrfs_util_strerror (err));
488+
else
489+
ret = TRUE;
525490

526491
return ret;
527492
}

src/plugins/btrfs.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ typedef enum {
1414
BD_BTRFS_ERROR_TECH_UNAVAIL,
1515
BD_BTRFS_ERROR_DEVICE,
1616
BD_BTRFS_ERROR_PARSE,
17+
BD_BTRFS_ERROR_NOT_FOUND,
1718
} BDBtrfsError;
1819

1920
typedef struct BDBtrfsDeviceInfo {
@@ -79,7 +80,7 @@ gboolean bd_btrfs_remove_device (const gchar *mountpoint, const gchar *device, c
7980
gboolean bd_btrfs_create_subvolume (const gchar *mountpoint, const gchar *name, const BDExtraArg **extra, GError **error);
8081
gboolean bd_btrfs_delete_subvolume (const gchar *mountpoint, const gchar *name, const BDExtraArg **extra, GError **error);
8182
guint64 bd_btrfs_get_default_subvolume_id (const gchar *mountpoint, GError **error);
82-
gboolean bd_btrfs_set_default_subvolume (const gchar *mountpoint, guint64 subvol_id, const BDExtraArg **extra, GError **error);
83+
gboolean bd_btrfs_set_default_subvolume (const gchar *mountpoint, guint64 subvol_id, G_GNUC_UNUSED const BDExtraArg **extra, GError **error);
8384
gboolean bd_btrfs_create_snapshot (const gchar *source, const gchar *dest, gboolean ro, const BDExtraArg **extra, GError **error);
8485
BDBtrfsDeviceInfo** bd_btrfs_list_devices (const gchar *device, GError **error);
8586
BDBtrfsSubvolumeInfo** bd_btrfs_list_subvolumes (const gchar *mountpoint, gboolean snapshots_only, GError **error);

tests/btrfs_test.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ def test_get_default_subvolume_id(self):
274274
self.assertTrue(succ)
275275

276276
# not mounted yet, should fail
277-
with self.assertRaisesRegex(GLib.GError, r".*(can't|cannot) access.*"):
277+
with self.assertRaisesRegex(GLib.GError, r".*Could not open: No such file or directory.*"):
278278
ret = BlockDev.btrfs_get_default_subvolume_id(TEST_MNT)
279279

280280
mount(self.loop_dev, TEST_MNT)
@@ -289,6 +289,10 @@ def test_set_default_subvolume(self):
289289
succ = BlockDev.btrfs_create_volume([self.loop_dev], "myShinyBtrfs", None, None, None)
290290
self.assertTrue(succ)
291291

292+
# not mounted yet, should fail
293+
with self.assertRaisesRegex(GLib.GError, r".*Could not open: No such file or directory.*"):
294+
ret = BlockDev.btrfs_get_default_subvolume_id(TEST_MNT)
295+
292296
mount(self.loop_dev, TEST_MNT)
293297

294298
ret = BlockDev.btrfs_get_default_subvolume_id(TEST_MNT)

0 commit comments

Comments
 (0)