summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOmar Sandoval <osandov@fb.com>2018-01-19 16:49:29 -0800
committerDavid Sterba <dsterba@suse.com>2018-03-06 11:28:37 +0100
commit3e76e9b67610e179bac4688c76002ff1adb338d4 (patch)
tree76068d86d1e739276ba6b61f1ebef9e3b4ee0c3d
parentf23918016238a67b98740bdcb2509e290715977a (diff)
btrfs-progs: use libbtrfsutil for read-only property
Signed-off-by: Omar Sandoval <osandov@fb.com> Signed-off-by: David Sterba <dsterba@suse.com>
-rw-r--r--messages.h13
-rw-r--r--props.c69
2 files changed, 38 insertions, 44 deletions
diff --git a/messages.h b/messages.h
index 4999c7b9..2b97aa08 100644
--- a/messages.h
+++ b/messages.h
@@ -54,6 +54,19 @@
DO_ABORT_ON_ERROR; \
} while (0)
+#define error_btrfs_util(err) \
+ do { \
+ const char *errno_str = strerror(errno); \
+ const char *lib_str = btrfs_util_strerror(err); \
+ PRINT_TRACE_ON_ERROR; \
+ PRINT_VERBOSE_ERROR; \
+ if (lib_str && strcmp(errno_str, lib_str) != 0) \
+ __btrfs_error("%s: %s", lib_str, errno_str); \
+ else \
+ __btrfs_error("%s", errno_str); \
+ DO_ABORT_ON_ERROR; \
+ } while (0)
+
#define warning(fmt, ...) \
do { \
PRINT_TRACE_ON_ERROR; \
diff --git a/props.c b/props.c
index cddbd927..e4edba06 100644
--- a/props.c
+++ b/props.c
@@ -21,6 +21,8 @@
#include <fcntl.h>
#include <unistd.h>
+#include <btrfsutil.h>
+
#include "ctree.h"
#include "commands.h"
#include "utils.h"
@@ -41,56 +43,35 @@ static int prop_read_only(enum prop_object_type type,
const char *name,
const char *value)
{
- int ret = 0;
- int fd = -1;
- u64 flags = 0;
-
- fd = open(object, O_RDONLY);
- if (fd < 0) {
- ret = -errno;
- error("failed to open %s: %s", object, strerror(-ret));
- goto out;
- }
+ enum btrfs_util_error err;
+ bool read_only;
- ret = ioctl(fd, BTRFS_IOC_SUBVOL_GETFLAGS, &flags);
- if (ret < 0) {
- ret = -errno;
- error("failed to get flags for %s: %s", object,
- strerror(-ret));
- goto out;
- }
-
- if (!value) {
- if (flags & BTRFS_SUBVOL_RDONLY)
- fprintf(stdout, "ro=true\n");
- else
- fprintf(stdout, "ro=false\n");
- ret = 0;
- goto out;
- }
+ if (value) {
+ if (!strcmp(value, "true")) {
+ read_only = true;
+ } else if (!strcmp(value, "false")) {
+ read_only = false;
+ } else {
+ error("invalid value for property: %s", value);
+ return -EINVAL;
+ }
- if (!strcmp(value, "true")) {
- flags |= BTRFS_SUBVOL_RDONLY;
- } else if (!strcmp(value, "false")) {
- flags = flags & ~BTRFS_SUBVOL_RDONLY;
+ err = btrfs_util_set_subvolume_read_only(object, read_only);
+ if (err) {
+ error_btrfs_util(err);
+ return -errno;
+ }
} else {
- ret = -EINVAL;
- error("invalid value for property: %s", value);
- goto out;
- }
+ err = btrfs_util_get_subvolume_read_only(object, &read_only);
+ if (err) {
+ error_btrfs_util(err);
+ return -errno;
+ }
- ret = ioctl(fd, BTRFS_IOC_SUBVOL_SETFLAGS, &flags);
- if (ret < 0) {
- ret = -errno;
- error("failed to set flags for %s: %s", object,
- strerror(-ret));
- goto out;
+ printf("ro=%s\n", read_only ? "true" : "false");
}
-out:
- if (fd != -1)
- close(fd);
- return ret;
+ return 0;
}
static int prop_label(enum prop_object_type type,