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"
@@ -454,48 +455,14 @@ gboolean bd_btrfs_delete_subvolume (const gchar *mountpoint, const gchar *name,
454455 * Tech category: %BD_BTRFS_TECH_SUBVOL-%BD_BTRFS_TECH_MODE_QUERY
455456 */
456457guint64 bd_btrfs_get_default_subvolume_id (const gchar * mountpoint , GError * * error ) {
457- GRegex * regex = NULL ;
458- GMatchInfo * match_info = NULL ;
459- gboolean success = FALSE;
460- gchar * output = NULL ;
461- gchar * match = NULL ;
458+ enum btrfs_util_error err ;
462459 guint64 ret = 0 ;
463- const gchar * argv [5 ] = {"btrfs" , "subvol" , "get-default" , mountpoint , NULL };
464-
465- if (!check_deps (& avail_deps , DEPS_BTRFS_MASK , deps , DEPS_LAST , & deps_check_lock , error ) ||
466- !check_module_deps (& avail_module_deps , MODULE_DEPS_BTRFS_MASK , module_deps , MODULE_DEPS_LAST , & deps_check_lock , error ))
467- return 0 ;
468-
469- regex = g_regex_new ("ID (\\d+) .*" , 0 , 0 , error );
470- if (!regex ) {
471- bd_utils_log_format (BD_UTILS_LOG_WARNING , "Failed to create new GRegex" );
472- /* error is already populated */
473- return 0 ;
474- }
475-
476- success = bd_utils_exec_and_capture_output (argv , NULL , & output , error );
477- if (!success ) {
478- g_regex_unref (regex );
479- return 0 ;
480- }
481460
482- success = g_regex_match (regex , output , 0 , & match_info );
483- if (!success ) {
484- g_set_error (error , BD_BTRFS_ERROR , BD_BTRFS_ERROR_PARSE , "Failed to parse subvolume's ID" );
485- g_regex_unref (regex );
486- g_match_info_free (match_info );
487- g_free (output );
488- return 0 ;
461+ err = btrfs_util_get_default_subvolume (mountpoint , & ret );
462+ if (err ) {
463+ g_set_error (error , BD_BTRFS_ERROR , BD_BTRFS_ERROR_NOT_FOUND , "%s: %m" , btrfs_util_strerror (err ));
489464 }
490465
491- match = g_match_info_fetch (match_info , 1 );
492- ret = g_ascii_strtoull (match , NULL , 0 );
493-
494- g_free (match );
495- g_match_info_free (match_info );
496- g_regex_unref (regex );
497- g_free (output );
498-
499466 return ret ;
500467}
501468
@@ -512,17 +479,15 @@ guint64 bd_btrfs_get_default_subvolume_id (const gchar *mountpoint, GError **err
512479 *
513480 * Tech category: %BD_BTRFS_TECH_SUBVOL-%BD_BTRFS_TECH_MODE_MODIFY
514481 */
515- gboolean bd_btrfs_set_default_subvolume (const gchar * mountpoint , guint64 subvol_id , const BDExtraArg * * extra , GError * * error ) {
516- const gchar * argv [ 6 ] = { "btrfs" , "subvol" , "set-default" , NULL , mountpoint , NULL } ;
482+ gboolean bd_btrfs_set_default_subvolume (const gchar * mountpoint , guint64 subvol_id , G_GNUC_UNUSED const BDExtraArg * * extra , GError * * error ) {
483+ enum btrfs_util_error err ;
517484 gboolean ret = FALSE;
518485
519- if (!check_deps (& avail_deps , DEPS_BTRFS_MASK , deps , DEPS_LAST , & deps_check_lock , error ) ||
520- !check_module_deps (& avail_module_deps , MODULE_DEPS_BTRFS_MASK , module_deps , MODULE_DEPS_LAST , & deps_check_lock , error ))
521- return FALSE;
522-
523- argv [3 ] = g_strdup_printf ("%" G_GUINT64_FORMAT , subvol_id );
524- ret = bd_utils_exec_and_report_error (argv , extra , error );
525- g_free ((gchar * ) argv [3 ]);
486+ err = btrfs_util_set_default_subvolume (mountpoint , subvol_id );
487+ if (err )
488+ g_set_error (error , BD_BTRFS_ERROR , BD_BTRFS_ERROR_NOT_FOUND , "%s: %m" , btrfs_util_strerror (err ));
489+ else
490+ ret = TRUE;
526491
527492 return ret ;
528493}
0 commit comments