aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorJosef Bacik <jbacik@fusionio.com>2012-10-11 15:53:56 -0400
committerChris Mason <chris.mason@fusionio.com>2012-12-16 20:46:21 -0500
commite99761514999f64aff1985460967f93d9e8417f4 (patch)
tree67bd13d96325679bde7244d69cce501840b63796 /fs
parent5f3ab90a72f98adbf00c50ac2d4d2b47cf4a9685 (diff)
Btrfs: only log the inode item if we can get away with it
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>
Diffstat (limited to 'fs')
-rw-r--r--fs/btrfs/btrfs_inode.h1
-rw-r--r--fs/btrfs/inode.c1
-rw-r--r--fs/btrfs/tree-log.c10
-rw-r--r--fs/btrfs/xattr.c1
4 files changed, 11 insertions, 2 deletions
diff --git a/fs/btrfs/btrfs_inode.h b/fs/btrfs/btrfs_inode.h
index ed8ca7ca5eff..2411baf35220 100644
--- a/fs/btrfs/btrfs_inode.h
+++ b/fs/btrfs/btrfs_inode.h
@@ -39,6 +39,7 @@
39#define BTRFS_INODE_HAS_ORPHAN_ITEM 5 39#define BTRFS_INODE_HAS_ORPHAN_ITEM 5
40#define BTRFS_INODE_HAS_ASYNC_EXTENT 6 40#define BTRFS_INODE_HAS_ASYNC_EXTENT 6
41#define BTRFS_INODE_NEEDS_FULL_SYNC 7 41#define BTRFS_INODE_NEEDS_FULL_SYNC 7
42#define BTRFS_INODE_COPY_EVERYTHING 8
42 43
43/* in memory btrfs inode */ 44/* in memory btrfs inode */
44struct btrfs_inode { 45struct btrfs_inode {
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 0446cbe8bcaf..123815f3b454 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -5083,6 +5083,7 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir,
5083 inode_inc_iversion(inode); 5083 inode_inc_iversion(inode);
5084 inode->i_ctime = CURRENT_TIME; 5084 inode->i_ctime = CURRENT_TIME;
5085 ihold(inode); 5085 ihold(inode);
5086 set_bit(BTRFS_INODE_COPY_EVERYTHING, &BTRFS_I(inode)->runtime_flags);
5086 5087
5087 err = btrfs_add_nondir(trans, dir, dentry, inode, 1, index); 5088 err = btrfs_add_nondir(trans, dir, dentry, inode, 1, index);
5088 5089
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
index 40b9efd20e43..f05fca778cb4 100644
--- a/fs/btrfs/tree-log.c
+++ b/fs/btrfs/tree-log.c
@@ -3429,14 +3429,20 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans,
3429 } else { 3429 } else {
3430 if (test_and_clear_bit(BTRFS_INODE_NEEDS_FULL_SYNC, 3430 if (test_and_clear_bit(BTRFS_INODE_NEEDS_FULL_SYNC,
3431 &BTRFS_I(inode)->runtime_flags)) { 3431 &BTRFS_I(inode)->runtime_flags)) {
3432 clear_bit(BTRFS_INODE_COPY_EVERYTHING,
3433 &BTRFS_I(inode)->runtime_flags);
3432 ret = btrfs_truncate_inode_items(trans, log, 3434 ret = btrfs_truncate_inode_items(trans, log,
3433 inode, 0, 0); 3435 inode, 0, 0);
3434 } else { 3436 } else {
3435 if (inode_only == LOG_INODE_ALL) 3437 if (inode_only == LOG_INODE_ALL)
3436 fast_search = true; 3438 fast_search = true;
3437 max_key.type = BTRFS_XATTR_ITEM_KEY; 3439 if (test_and_clear_bit(BTRFS_INODE_COPY_EVERYTHING,
3440 &BTRFS_I(inode)->runtime_flags))
3441 max_key.type = BTRFS_XATTR_ITEM_KEY;
3442 else
3443 max_key.type = BTRFS_INODE_ITEM_KEY;
3438 ret = drop_objectid_items(trans, log, path, ino, 3444 ret = drop_objectid_items(trans, log, path, ino,
3439 BTRFS_XATTR_ITEM_KEY); 3445 max_key.type);
3440 } 3446 }
3441 } 3447 }
3442 if (ret) { 3448 if (ret) {
diff --git a/fs/btrfs/xattr.c b/fs/btrfs/xattr.c
index aef6bb3c5f5c..446a6848c554 100644
--- a/fs/btrfs/xattr.c
+++ b/fs/btrfs/xattr.c
@@ -208,6 +208,7 @@ int __btrfs_setxattr(struct btrfs_trans_handle *trans,
208 208
209 inode_inc_iversion(inode); 209 inode_inc_iversion(inode);
210 inode->i_ctime = CURRENT_TIME; 210 inode->i_ctime = CURRENT_TIME;
211 set_bit(BTRFS_INODE_COPY_EVERYTHING, &BTRFS_I(inode)->runtime_flags);
211 ret = btrfs_update_inode(trans, root, inode); 212 ret = btrfs_update_inode(trans, root, inode);
212 BUG_ON(ret); 213 BUG_ON(ret);
213out: 214out: