Btrfs: only log the inode item if we can get away with it
authorJosef Bacik <jbacik@fusionio.com>
Thu, 11 Oct 2012 19:53:56 +0000 (15:53 -0400)
committerChris Mason <chris.mason@fusionio.com>
Mon, 17 Dec 2012 01:46:21 +0000 (20:46 -0500)
Currently we copy all the file information into the log, inode item, the
refs, xattrs etc.  Except most of this doesn't change from fsync to fsync,
just the inode item changes.  So set a flag if an xattr changes or a link is
added, and otherwise only log the inode item.  Thanks,

Signed-off-by: Josef Bacik <jbacik@fusionio.com>
Signed-off-by: Chris Mason <chris.mason@fusionio.com>
fs/btrfs/btrfs_inode.h
fs/btrfs/inode.c
fs/btrfs/tree-log.c
fs/btrfs/xattr.c

index ed8ca7ca5eff2d2ce0529f42d32fb394b0331e89..2411baf35220fc0f438e822f11744d1bc603e9a1 100644 (file)
@@ -39,6 +39,7 @@
 #define BTRFS_INODE_HAS_ORPHAN_ITEM            5
 #define BTRFS_INODE_HAS_ASYNC_EXTENT           6
 #define BTRFS_INODE_NEEDS_FULL_SYNC            7
+#define BTRFS_INODE_COPY_EVERYTHING            8
 
 /* in memory btrfs inode */
 struct btrfs_inode {
index 0446cbe8bcaf6e7e17f93cdb5c0dd84e6e2634d7..123815f3b45428481fe85ed7b07b3322d20ff9e0 100644 (file)
@@ -5083,6 +5083,7 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir,
        inode_inc_iversion(inode);
        inode->i_ctime = CURRENT_TIME;
        ihold(inode);
+       set_bit(BTRFS_INODE_COPY_EVERYTHING, &BTRFS_I(inode)->runtime_flags);
 
        err = btrfs_add_nondir(trans, dir, dentry, inode, 1, index);
 
index 40b9efd20e4311b0f922b41f60035da488d59920..f05fca778cb4100e0bd2b8dc9f08b052fbf24112 100644 (file)
@@ -3429,14 +3429,20 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans,
        } else {
                if (test_and_clear_bit(BTRFS_INODE_NEEDS_FULL_SYNC,
                                       &BTRFS_I(inode)->runtime_flags)) {
+                       clear_bit(BTRFS_INODE_COPY_EVERYTHING,
+                                 &BTRFS_I(inode)->runtime_flags);
                        ret = btrfs_truncate_inode_items(trans, log,
                                                         inode, 0, 0);
                } else {
                        if (inode_only == LOG_INODE_ALL)
                                fast_search = true;
-                       max_key.type = BTRFS_XATTR_ITEM_KEY;
+                       if (test_and_clear_bit(BTRFS_INODE_COPY_EVERYTHING,
+                                              &BTRFS_I(inode)->runtime_flags))
+                               max_key.type = BTRFS_XATTR_ITEM_KEY;
+                       else
+                               max_key.type = BTRFS_INODE_ITEM_KEY;
                        ret = drop_objectid_items(trans, log, path, ino,
-                                                 BTRFS_XATTR_ITEM_KEY);
+                                                 max_key.type);
                }
        }
        if (ret) {
index aef6bb3c5f5c82a77a1d5eeaef0d65a6661d7367..446a6848c5548f2f8f03f2b532eac9a174bd56c7 100644 (file)
@@ -208,6 +208,7 @@ int __btrfs_setxattr(struct btrfs_trans_handle *trans,
 
        inode_inc_iversion(inode);
        inode->i_ctime = CURRENT_TIME;
+       set_bit(BTRFS_INODE_COPY_EVERYTHING, &BTRFS_I(inode)->runtime_flags);
        ret = btrfs_update_inode(trans, root, inode);
        BUG_ON(ret);
 out: