* Alex Chiang <[EMAIL PROTECTED]>:
> * David Miller <[EMAIL PROTECTED]>:
> > From: Alex Chiang <[EMAIL PROTECTED]>
> > 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 <[EMAIL PROTECTED]>
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


_______________________________________________
Btrfs-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/btrfs-devel

Reply via email to