All of lore.kernel.org
 help / color / mirror / Atom feed
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
>
>



      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.