Message ID | f906d40f5464b26fc9707a145254a48efac2ff50.1518720598.git.osandov@fb.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 2018/02/16 4:05, Omar Sandoval wrote: > From: Omar Sandoval <osandov@fb.com> > > Signed-off-by: Omar Sandoval <osandov@fb.com> > --- > 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 <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, > -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Thu, Feb 22, 2018 at 01:23:45PM +0900, Misono, Tomohiro wrote: > > > On 2018/02/16 4:05, Omar Sandoval wrote: > > From: Omar Sandoval <osandov@fb.com> > > > > Signed-off-by: Omar Sandoval <osandov@fb.com> > > --- > > 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. That's embarrassing, thanks! -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
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) \ + 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,