Btrfs: i386 fixes from axboe
authorChris Mason <chris.mason@oracle.com>
Tue, 12 Jun 2007 15:36:58 +0000 (11:36 -0400)
committerDavid Woodhouse <dwmw2@hera.kernel.org>
Tue, 12 Jun 2007 15:36:58 +0000 (11:36 -0400)
Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/INSTALL [new file with mode: 0644]
fs/btrfs/disk-io.c
fs/btrfs/file.c
fs/btrfs/inode.c
fs/btrfs/transaction.c

diff --git a/fs/btrfs/INSTALL b/fs/btrfs/INSTALL
new file mode 100644 (file)
index 0000000..e83ff6e
--- /dev/null
@@ -0,0 +1,51 @@
+Install Instructions
+
+Btrfs puts snapshots and subvolumes into the root directory of the FS.  This
+directory can only be changed by btrfsctl right now, and normal filesystem
+operations do not work on it.  The default subvolume is called 'default',
+and you can create files and directories in mount_point/default
+
+Btrfs uses the crypto manager interface in the kernel for file and
+metadata checksums.  You need to compile the kernel with:
+
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_MANAGER=m
+CONFIG_CRYPTO_CRC32C=m
+
+cryptomanager and crc32c can be static as well.  Once your kernel is
+setup, typing make in the btrfs module sources will build against the
+running kernel.  When the build is complete:
+
+modprobe crc32c
+modprobe cryptomgr
+insmod btrfs.ko
+
+The Btrfs utility programs require libuuid to build.  This can be found
+in the e2fsprogs sources, and is usually available as libuuid or
+e2fsprogs-devel from various distros.
+
+Building the utilities is just make ; make install.  The programs go
+into /usr/local/bin.  The commands available are:
+
+mkfs.btrfs: create a filesystem
+
+btrfsctl: control program to create snapshots and subvolumes:
+
+       mount /dev/sda2 /mnt
+       btrfsctl -s new_subvol_name /mnt
+       btrfsctl -s snapshot_of_default /mnt/default
+       btrfsctl -s snapshot_of_new_subvol /mnt/new_subvol_name
+       btrfsctl -s snapshot_of_a_snapshot /mnt/snapshot_of_new_subvol
+       ls /mnt
+       default snapshot_of_a_snapshot snapshot_of_new_subvol
+       new_subvol_name snapshot_of_default
+
+       Snapshots and subvolumes cannot be deleted right now, but you can
+       rm -rf all the files and directories inside them.
+
+btrfsck: do a limited check of the FS extent trees.</li>
+
+debug-tree: print all of the FS metadata in text form.  Example:
+
+       debug-tree /dev/sda2 >& big_output_file
+
index 8c68a64c0ceb97091c1afea76e322f2f48d65fc2..b0ebba6f2e467b119d3cdaa4d662f12b56928d4a 100644 (file)
@@ -106,7 +106,7 @@ struct buffer_head *btrfs_find_create_tree_block(struct btrfs_root *root,
        int err;
        u64 first_block = index << (PAGE_CACHE_SHIFT - blockbits);
 
-       page = grab_cache_page(mapping, index);
+       page = find_or_create_page(mapping, index, GFP_NOFS);
        if (!page)
                return NULL;
 
index 566e526b60ffdccaa7d1034d58ab34d4e37de171..83836fb3d4e9ae70bfd7a0b5364edaec3b200697 100644 (file)
@@ -112,7 +112,7 @@ static int dirty_and_release_pages(struct btrfs_trans_handle *trans,
                if (buffer_mapped(bh) && bh->b_blocknr == 0) {
                        struct btrfs_key key;
                        struct btrfs_path *path;
-                       char *ptr;
+                       char *ptr, *kaddr;
                        u32 datasize;
 
                        /* create an inline extent, and copy the data in */
@@ -135,8 +135,11 @@ static int dirty_and_release_pages(struct btrfs_trans_handle *trans,
                        btrfs_set_file_extent_type(ei,
                                                   BTRFS_FILE_EXTENT_INLINE);
                        ptr = btrfs_file_extent_inline_start(ei);
+                       kaddr = kmap_atomic(bh->b_page, KM_USER0);
                        btrfs_memcpy(root, path->nodes[0]->b_data,
-                                    ptr, bh->b_data, offset + write_bytes);
+                                    ptr, kaddr + bh_offset(bh),
+                                    offset + write_bytes);
+                       kunmap_atomic(kaddr, KM_USER0);
                        mark_buffer_dirty(path->nodes[0]);
                        btrfs_free_path(path);
                } else if (buffer_mapped(bh)) {
index 46f869d6d0fb9d4a5312ddd6d1d88569c0493286..d3d5a4cdb6af4898634bb72b8285c701f0db2864 100644 (file)
@@ -1754,6 +1754,7 @@ static int create_subvol(struct btrfs_root *root, char *name, int namelen)
                                BTRFS_I(dir)->block_group, S_IFDIR | 0700);
        inode->i_op = &btrfs_dir_inode_operations;
        inode->i_fop = &btrfs_dir_file_operations;
+       new_root->inode = inode;
 
        ret = btrfs_make_empty_dir(trans, new_root, new_dirid, new_dirid);
        BUG_ON(ret);
@@ -1766,8 +1767,6 @@ static int create_subvol(struct btrfs_root *root, char *name, int namelen)
        ret = btrfs_commit_transaction(trans, new_root);
        BUG_ON(ret);
 
-       iput(inode);
-
        mutex_unlock(&root->fs_info->fs_mutex);
        btrfs_btree_balance_dirty(root);
        return 0;
index 30914521cf0189b5e72a6b819e1d042d6a7969af..cd4f1d1403855e2fc7185605fec137cded32098c 100644 (file)
@@ -18,6 +18,7 @@
 
 #include <linux/module.h>
 #include <linux/fs.h>
+#include <linux/sched.h>
 #include "ctree.h"
 #include "disk-io.h"
 #include "transaction.h"