Re: [ANNOUNCE] Btrfs v0.13

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



* Alex Chiang <achiang@xxxxxx>:
> * David Miller <davem@xxxxxxxxxxxxx>:
> > From: Alex Chiang <achiang@xxxxxx>
> > Date: Mon, 31 Mar 2008 14:26:33 -0600
> > 
> > > I've gotten as far as successfully creating a btrfs filesystem
> > > (at least that's what btrfsck tells me), but haven't been able to
> > > mount it yet, probably because of the sector size issue.
> > 
> > You should be able to make a filesystem with a sector
> > size >= PAGE_SIZE and it should work just fine.  Please
> > give it a try.
> 
> Hrm, I'm having issues still. First, here's a patch for
> mkfs.btrfs to allow the user to pass in a different sector size.

Whoops, whitespace was screwed up on that patch. Here's try #2.

/ac

From: Alex Chiang <achiang@xxxxxx>
Subject: [PATCH] Teach mkfs.btrfs about configurable sectorsizes

Currently, btrfs assumes PAGE_SIZE <= sectorsize, and sectorsize
is hardcoded to 4K in mkfs.btrfs.

Give mkfs.btrfs a new command line option to specify a different
sector size. The syntax follows mke2fs's -E extended-options syntax,
and the code is taken from mke2fs.
---
 mkfs.c |   76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 74 insertions(+), 2 deletions(-)

diff --git a/mkfs.c b/mkfs.c
index 49f7308..874a41e 100644
--- a/mkfs.c
+++ b/mkfs.c
@@ -137,15 +137,76 @@ err:
 	return ret;
 }
 
+struct btrfs_params {
+	u32 sectorsize;
+};
+
+/*
+ * Shameless ripped from mke2fs
+ */
+static void parse_extended_opts(struct btrfs_params *param, const char *opts)
+{
+	char    *buf, *token, *next, *p, *arg;
+	int     len;
+	int     r_usage = 0;
+
+	len = strlen(opts);
+	buf = malloc(len+1);
+	if (!buf) {
+		fprintf(stderr, "Couldn't allocate memory to parse options!\n");
+		exit(1);
+	}
+	strcpy(buf, opts);
+	for (token = buf; token && *token; token = next) {
+		p = strchr(token, ',');
+		next = 0;
+		if (p) {
+			*p = 0;
+			next = p+1;
+		}
+		arg = strchr(token, '=');
+		if (arg) {
+			*arg = 0;
+			arg++;
+		}
+		if (strcmp(token, "sectorsize") == 0) {
+			if (!arg) {
+				r_usage++;
+				continue;
+			}
+			param->sectorsize = strtoul(arg, &p, 0);
+			if (*p || (param->sectorsize == 0)) {
+				fprintf(stderr,
+					"Invalid sectorsize parameter: %s\n",
+					arg);
+				r_usage++;
+				continue;
+			}
+		} else {
+			r_usage++;
+		}
+	}
+	if (r_usage) {
+		fprintf(stderr, "\nBad options specified.\n\n"
+			"Extended options are separated by commas, "
+			"and may take an argument which\n"
+			"\tis set off by an equals ('=') sign.\n\n"
+			"Valid extended options are:\n"
+			"\tsectorsize=<sector size in bytes>\n\n");
+		exit(1);
+	}
+}
+
 static void print_usage(void)
 {
-	fprintf(stderr, "usage: mkfs.btrfs [ -l leafsize ] [ -n nodesize] dev [ blocks ]\n");
+	fprintf(stderr, "usage: mkfs.btrfs [ -l leafsize ] [ -n nodesize] [ -E sectorsize=<sectorsize> ] dev [ blocks ]\n");
 	exit(1);
 }
 
 int main(int ac, char **av)
 {
 	char *file;
+	char *extended_opts = 0;
 	u64 block_count = 0;
 	u64 dev_block_count = 0;
 	int fd;
@@ -160,10 +221,11 @@ int main(int ac, char **av)
 	int zero_end = 1;
 	struct btrfs_root *root;
 	struct btrfs_trans_handle *trans;
+	struct btrfs_params fs_params;
 
 	while(1) {
 		int c;
-		c = getopt(ac, av, "b:l:n:s:");
+		c = getopt(ac, av, "b:l:n:s:E:");
 		if (c < 0)
 			break;
 		switch(c) {
@@ -180,10 +242,19 @@ int main(int ac, char **av)
 				block_count = parse_size(optarg);
 				zero_end = 0;
 				break;
+			case 'E':
+				memset(&fs_params, 0,
+					sizeof(struct btrfs_params));
+				extended_opts = optarg;
+				break;
 			default:
 				print_usage();
 		}
 	}
+	if (extended_opts) {
+		parse_extended_opts(&fs_params, extended_opts);
+		sectorsize = fs_params.sectorsize;
+	}
 	if (leafsize < sectorsize || (leafsize & (sectorsize - 1))) {
 		fprintf(stderr, "Illegal leafsize %u\n", leafsize);
 		exit(1);
@@ -192,6 +263,7 @@ int main(int ac, char **av)
 		fprintf(stderr, "Illegal nodesize %u\n", nodesize);
 		exit(1);
 	}
+
 	ac = ac - optind;
 	if (ac == 0)
 		print_usage();
-- 
1.5.3.1.g1e61

--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [Samba]     [Device Mapper]     [CEPH Development]
  Powered by Linux