]> git.karo-electronics.de Git - mv-sheeva.git/commitdiff
Btrfs: mount -o max_inline=size to control the maximum inline extent size
authorChris Mason <chris.mason@oracle.com>
Tue, 29 Jan 2008 21:03:38 +0000 (16:03 -0500)
committerChris Mason <chris.mason@oracle.com>
Thu, 25 Sep 2008 15:04:00 +0000 (11:04 -0400)
Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/ctree.h
fs/btrfs/disk-io.c
fs/btrfs/extent_io.c
fs/btrfs/file.c
fs/btrfs/super.c

index 127c86f795d0423f52f621fade50f48c72546afd..8f93e066bf8b0422ae3eac557165550912d60ec5 100644 (file)
@@ -325,6 +325,7 @@ struct btrfs_fs_info {
        u64 last_trans_committed;
        unsigned long mount_opt;
        u64 max_extent;
+       u64 max_inline;
        u64 alloc_start;
        struct btrfs_transaction *running_transaction;
        struct btrfs_super_block super_copy;
index e29a0716f6a9e08e96994e8231552839f058ec3c..6647b90ef745f001427f186aad114db817cc8c68 100644 (file)
@@ -659,6 +659,7 @@ struct btrfs_root *open_ctree(struct super_block *sb)
        fs_info->throttles = 0;
        fs_info->mount_opt = 0;
        fs_info->max_extent = (u64)-1;
+       fs_info->max_inline = 8192 * 1024;
        fs_info->delalloc_bytes = 0;
        fs_info->btree_inode = new_inode(sb);
        fs_info->btree_inode->i_ino = 1;
index e81b35b06187021d274d064efcda2af0118fb0dd..6999b819db624151d869d507b7c75fe002698000 100644 (file)
@@ -2451,7 +2451,6 @@ sector_t extent_bmap(struct address_space *mapping, sector_t iblock,
                goto out;
 
        sector = (em->block_start + start - em->start) >> inode->i_blkbits;
-printk("bmap finds %Lu %Lu block %Lu\n", em->start, em->len, em->block_start);
 out:
        free_extent_map(em);
        return sector;
index 8e210616d7021d36c9e59f526a2b89b3e5b09e53..7c10a90362ffe0dc2d298035b6342feed50b35d9 100644 (file)
@@ -301,7 +301,8 @@ static int noinline dirty_and_release_pages(struct btrfs_trans_handle *trans,
         */
        inline_size = end_pos;
        if (isize >= BTRFS_MAX_INLINE_DATA_SIZE(root) ||
-           inline_size > 8192 ||
+           inline_size > root->fs_info->max_inline ||
+           (inline_size & (root->sectorsize -1)) == 0 ||
            inline_size >= BTRFS_MAX_INLINE_DATA_SIZE(root)) {
                u64 last_end;
                u64 existing_delalloc = 0;
index f8a1016600b182ae31814dba3852fb35885ab69c..a46300c4753a82ac1ad393b33bad1435381d86f1 100644 (file)
@@ -64,7 +64,7 @@ static void btrfs_put_super (struct super_block * sb)
 
 enum {
        Opt_subvol, Opt_nodatasum, Opt_nodatacow, Opt_max_extent,
-       Opt_alloc_start, Opt_nobarrier, Opt_ssd, Opt_err,
+       Opt_max_inline, Opt_alloc_start, Opt_nobarrier, Opt_ssd, Opt_err,
 };
 
 static match_table_t tokens = {
@@ -73,6 +73,7 @@ static match_table_t tokens = {
        {Opt_nodatacow, "nodatacow"},
        {Opt_nobarrier, "nobarrier"},
        {Opt_max_extent, "max_extent=%s"},
+       {Opt_max_inline, "max_inline=%s"},
        {Opt_alloc_start, "alloc_start=%s"},
        {Opt_ssd, "ssd"},
        {Opt_err, NULL}
@@ -178,6 +179,22 @@ static int parse_options (char * options,
                                }
                        }
                        break;
+               case Opt_max_inline:
+                       if (info) {
+                               char *num = match_strdup(&args[0]);
+                               if (num) {
+                                       info->max_inline =
+                                               btrfs_parse_size(num);
+                                       kfree(num);
+
+                                       info->max_inline = max_t(u64,
+                                                        info->max_inline,
+                                                        root->sectorsize);
+                                       printk("btrfs: max_inline at %Lu\n",
+                                              info->max_inline);
+                               }
+                       }
+                       break;
                case Opt_alloc_start:
                        if (info) {
                                char *num = match_strdup(&args[0]);