On 2018/02/16 4:05, Omar Sandoval wrote:
> From: Omar Sandoval
>
> Signed-off-by: Omar Sandoval
> ---
> messages.h | 13
> props.c| 69
> +++---
> 2 files changed, 38 insertions(+), 44 deletions(-)
>
> diff --git a/messages.h b/messages.h
> index 4999c7b9..004d5167 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) \
"make D=trace" fails because ";" is missing here.
> + 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
> #include
>
> +#include
> +
> #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, );
> - 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, _only);
> + if (err) {
> + error_btrfs_util(err);
> + return -errno;
> + }
>
> - ret = ioctl(fd, BTRFS_IOC_SUBVOL_SETFLAGS, );
> - 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,
>
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html