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 */
455456guint64 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}
0 commit comments