From: Tsutomu Itoh <t-itoh@jp.fujitsu.com>
To: linux-btrfs@vger.kernel.org
Subject: Re: [PATCH v2] Btrfs-progs: check out if the swap device
Date: Thu, 14 Feb 2013 13:07:30 +0900 [thread overview]
Message-ID: <511C6302.7060301@jp.fujitsu.com> (raw)
In-Reply-To: <201302140253.AA00020@FM-323941448.jp.fujitsu.com>
Sorry, please ignore this.
I will send again later.
-Tsutomu
On 2013/02/14 11:53, Tsutomu Itoh wrote:
> Currently, the following commands succeed.
>
> # cat /proc/swaps
> Filename Type Size Used Priority
> /dev/sda3 partition 8388604 0 -1
> /dev/sdc8 partition 9765884 0 -2
> # mkfs.btrfs /dev/sdc8
>
> WARNING! - Btrfs v0.20-rc1-165-g82ac345 IS EXPERIMENTAL
> WARNING! - see http://btrfs.wiki.kernel.org before using
>
> fs created label (null) on /dev/sdc8
> nodesize 4096 leafsize 4096 sectorsize 4096 size 9.31GB
> Btrfs v0.20-rc1-165-g82ac345
> # btrfs fi sh /dev/sdc8
> Label: none uuid: fc0bdbd0-7eed-460f-b4e9-131273b66df2
> Total devices 1 FS bytes used 28.00KB
> devid 1 size 9.31GB used 989.62MB path /dev/sdc8
>
> Btrfs v0.20-rc1-165-g82ac345
> #
>
> But we should check out the swap device. Fixed it.
>
> Signed-off-by: Tsutomu Itoh <t-itoh@jp.fujitsu.com>
> ---
> (this patch is based on Chris's raid56-experimental branch)
> v1 -> v2:
> - O_EXCL is specified at open(), as a last safety check
> - check when the swap device is a file is added
> - translate '\nnn'(octal) to character
> Thank you Eric, David, Zach and others.
> ---
> mkfs.c | 30 ++++++++++++++++++++++----
> utils.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> utils.h | 1 +
> 3 files changed, 102 insertions(+), 4 deletions(-)
>
> diff --git a/mkfs.c b/mkfs.c
> index 2d3c2af..e981517 100644
> --- a/mkfs.c
> +++ b/mkfs.c
> @@ -1366,6 +1366,16 @@ int main(int ac, char **av)
>
> if (source_dir == 0) {
> file = av[optind++];
> + ret = is_swap_device(file);
> + if (ret < 0) {
> + fprintf(stderr, "error checking %s status: %s\n", file,
> + strerror(-ret));
> + exit(1);
> + }
> + if (ret == 1) {
> + fprintf(stderr, "%s is a swap device\n", file);
> + exit(1);
> + }
> ret = check_mounted(file);
> if (ret < 0) {
> fprintf(stderr, "error checking %s mount status\n", file);
> @@ -1376,9 +1386,10 @@ int main(int ac, char **av)
> exit(1);
> }
> ac--;
> - fd = open(file, O_RDWR);
> + fd = open(file, O_RDWR|O_EXCL);
> if (fd < 0) {
> - fprintf(stderr, "unable to open %s\n", file);
> + fprintf(stderr, "unable to open %s: %s\n", file,
> + strerror(errno));
> exit(1);
> }
> first_file = file;
> @@ -1461,6 +1472,16 @@ int main(int ac, char **av)
> int old_mixed = mixed;
>
> file = av[optind++];
> + ret = is_swap_device(file);
> + if (ret < 0) {
> + fprintf(stderr, "error checking %s status: %s\n", file,
> + strerror(-ret));
> + exit(1);
> + }
> + if (ret == 1) {
> + fprintf(stderr, "%s is a swap device\n", file);
> + exit(1);
> + }
> ret = check_mounted(file);
> if (ret < 0) {
> fprintf(stderr, "error checking %s mount status\n",
> @@ -1471,9 +1492,10 @@ int main(int ac, char **av)
> fprintf(stderr, "%s is mounted\n", file);
> exit(1);
> }
> - fd = open(file, O_RDWR);
> + fd = open(file, O_RDWR|O_EXCL);
> if (fd < 0) {
> - fprintf(stderr, "unable to open %s\n", file);
> + fprintf(stderr, "unable to open %s: %s\n", file,
> + strerror(errno));
> exit(1);
> }
> ret = btrfs_device_already_in_root(root, fd,
> diff --git a/utils.c b/utils.c
> index f9ee812..891edcc 100644
> --- a/utils.c
> +++ b/utils.c
> @@ -1386,3 +1386,78 @@ int get_fs_info(int fd, char *path, struct btrfs_ioctl_fs_info_args *fi_args,
>
> return 0;
> }
> +
> +#define isoctal(c) (((c) & ~7) == '0')
> +
> +static inline void translate(char *f, char *t)
> +{
> + while (*f != '\0') {
> + if (*f == '\\' &&
> + isoctal(f[1]) && isoctal(f[2]) && isoctal(f[3])) {
> + *t++ = 64*(f[1] & 7) + 8*(f[2] & 7) + (f[3] & 7);
> + f += 4;
> + } else
> + *t++ = *f++;
> + }
> + *t = '\0';
> + return;
> +}
> +
> +/*
> + * Checks if the swap device.
> + * Returns 1 if swap device, < 0 on error or 0 if not swap device.
> + */
> +int is_swap_device(const char *file)
> +{
> + FILE *f;
> + struct stat st_buf;
> + dev_t dev;
> + ino_t ino = 0;
> + char tmp[PATH_MAX];
> + char buf[PATH_MAX];
> + char *cp;
> + int ret = 0;
> +
> + if (stat(file, &st_buf) < 0)
> + return -errno;
> + if (S_ISBLK(st_buf.st_mode))
> + dev = st_buf.st_rdev;
> + else if (S_ISREG(st_buf.st_mode)) {
> + dev = st_buf.st_dev;
> + ino = st_buf.st_ino;
> + } else
> + return 0;
> +
> + if ((f = fopen("/proc/swaps", "r")) == NULL)
> + return 0;
> +
> + /* skip the first line */
> + if (fgets(tmp, sizeof(tmp), f) == NULL)
> + goto out;
> +
> + while (fgets(tmp, sizeof(tmp), f) != NULL) {
> + if ((cp = strchr(tmp, ' ')) != NULL)
> + *cp = '\0';
> + if ((cp = strchr(tmp, '\t')) != NULL)
> + *cp = '\0';
> + translate(tmp, buf);
> + if (stat(buf, &st_buf) != 0)
> + continue;
> + if (S_ISBLK(st_buf.st_mode)) {
> + if (dev == st_buf.st_rdev) {
> + ret = 1;
> + break;
> + }
> + } else if (S_ISREG(st_buf.st_mode)) {
> + if (dev == st_buf.st_dev && ino == st_buf.st_ino) {
> + ret = 1;
> + break;
> + }
> + }
> + }
> +
> +out:
> + fclose(f);
> +
> + return ret;
> +}
> diff --git a/utils.h b/utils.h
> index bbcaf6a..60a0fea 100644
> --- a/utils.h
> +++ b/utils.h
> @@ -55,6 +55,7 @@ int get_fs_info(int fd, char *path, struct btrfs_ioctl_fs_info_args *fi_args,
> struct btrfs_ioctl_dev_info_args **di_ret);
>
> char *__strncpy__null(char *dest, const char *src, size_t n);
> +int is_swap_device(const char *file);
> /* Helper to always get proper size of the destination string */
> #define strncpy_null(dest, src) __strncpy__null(dest, src, sizeof(dest))
>
>
> --
> 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
>
>
prev parent reply other threads:[~2013-02-14 4:07 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-02-14 2:53 [PATCH v2] Btrfs-progs: check out if the swap device Tsutomu Itoh
2013-02-14 4:07 ` Tsutomu Itoh [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=511C6302.7060301@jp.fujitsu.com \
--to=t-itoh@jp.fujitsu.com \
--cc=linux-btrfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.