aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs
diff options
context:
space:
mode:
authorMiao Xie <miaox@cn.fujitsu.com>2012-12-19 01:59:51 -0500
committerJosef Bacik <jbacik@fusionio.com>2013-02-20 09:36:39 -0500
commit0e8c36a9fd8169a8b96c2ddc8446894bcd07b6b1 (patch)
tree023c77f4f81ef42142f7cea56cbf9da9e6dd80fe /fs/btrfs
parent4ea41ce07d8aed9e64c546abf341aea44e782e64 (diff)
Btrfs: fix lots of orphan inodes when the space is not enough
We're running into having 50-100 orphans left over with xfstests 83 because of ENOSPC when trying to start the transaction for the inode update. But in fact, it makes no sense in updating the inode for the new size while we're deleting the stupid thing. This patch fixes this problem. Reported-by: Josef Bacik <jbacik@fusionio.com> Signed-off-by: Miao Xie <miaox@cn.fujitsu.com> Signed-off-by: Josef Bacik <jbacik@fusionio.com>
Diffstat (limited to 'fs/btrfs')
-rw-r--r--fs/btrfs/delayed-inode.c90
-rw-r--r--fs/btrfs/delayed-inode.h1
-rw-r--r--fs/btrfs/inode.c11
3 files changed, 85 insertions, 17 deletions
diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c
index 4e204bb8ba13..c7e75061b894 100644
--- a/fs/btrfs/delayed-inode.c
+++ b/fs/btrfs/delayed-inode.c
@@ -1065,32 +1065,25 @@ static void btrfs_release_delayed_inode(struct btrfs_delayed_node *delayed_node)
1065 } 1065 }
1066} 1066}
1067 1067
1068static int btrfs_update_delayed_inode(struct btrfs_trans_handle *trans, 1068static int __btrfs_update_delayed_inode(struct btrfs_trans_handle *trans,
1069 struct btrfs_root *root, 1069 struct btrfs_root *root,
1070 struct btrfs_path *path, 1070 struct btrfs_path *path,
1071 struct btrfs_delayed_node *node) 1071 struct btrfs_delayed_node *node)
1072{ 1072{
1073 struct btrfs_key key; 1073 struct btrfs_key key;
1074 struct btrfs_inode_item *inode_item; 1074 struct btrfs_inode_item *inode_item;
1075 struct extent_buffer *leaf; 1075 struct extent_buffer *leaf;
1076 int ret; 1076 int ret;
1077 1077
1078 mutex_lock(&node->mutex);
1079 if (!node->inode_dirty) {
1080 mutex_unlock(&node->mutex);
1081 return 0;
1082 }
1083
1084 key.objectid = node->inode_id; 1078 key.objectid = node->inode_id;
1085 btrfs_set_key_type(&key, BTRFS_INODE_ITEM_KEY); 1079 btrfs_set_key_type(&key, BTRFS_INODE_ITEM_KEY);
1086 key.offset = 0; 1080 key.offset = 0;
1081
1087 ret = btrfs_lookup_inode(trans, root, path, &key, 1); 1082 ret = btrfs_lookup_inode(trans, root, path, &key, 1);
1088 if (ret > 0) { 1083 if (ret > 0) {
1089 btrfs_release_path(path); 1084 btrfs_release_path(path);
1090 mutex_unlock(&node->mutex);
1091 return -ENOENT; 1085 return -ENOENT;
1092 } else if (ret < 0) { 1086 } else if (ret < 0) {
1093 mutex_unlock(&node->mutex);
1094 return ret; 1087 return ret;
1095 } 1088 }
1096 1089
@@ -1105,11 +1098,28 @@ static int btrfs_update_delayed_inode(struct btrfs_trans_handle *trans,
1105 1098
1106 btrfs_delayed_inode_release_metadata(root, node); 1099 btrfs_delayed_inode_release_metadata(root, node);
1107 btrfs_release_delayed_inode(node); 1100 btrfs_release_delayed_inode(node);
1108 mutex_unlock(&node->mutex);
1109 1101
1110 return 0; 1102 return 0;
1111} 1103}
1112 1104
1105static inline int btrfs_update_delayed_inode(struct btrfs_trans_handle *trans,
1106 struct btrfs_root *root,
1107 struct btrfs_path *path,
1108 struct btrfs_delayed_node *node)
1109{
1110 int ret;
1111
1112 mutex_lock(&node->mutex);
1113 if (!node->inode_dirty) {
1114 mutex_unlock(&node->mutex);
1115 return 0;
1116 }
1117
1118 ret = __btrfs_update_delayed_inode(trans, root, path, node);
1119 mutex_unlock(&node->mutex);
1120 return ret;
1121}
1122
1113static inline int 1123static inline int
1114__btrfs_commit_inode_delayed_items(struct btrfs_trans_handle *trans, 1124__btrfs_commit_inode_delayed_items(struct btrfs_trans_handle *trans,
1115 struct btrfs_path *path, 1125 struct btrfs_path *path,
@@ -1230,6 +1240,60 @@ int btrfs_commit_inode_delayed_items(struct btrfs_trans_handle *trans,
1230 return ret; 1240 return ret;
1231} 1241}
1232 1242
1243int btrfs_commit_inode_delayed_inode(struct inode *inode)
1244{
1245 struct btrfs_trans_handle *trans;
1246 struct btrfs_delayed_node *delayed_node = btrfs_get_delayed_node(inode);
1247 struct btrfs_path *path;
1248 struct btrfs_block_rsv *block_rsv;
1249 int ret;
1250
1251 if (!delayed_node)
1252 return 0;
1253
1254 mutex_lock(&delayed_node->mutex);
1255 if (!delayed_node->inode_dirty) {
1256 mutex_unlock(&delayed_node->mutex);
1257 btrfs_release_delayed_node(delayed_node);
1258 return 0;
1259 }
1260 mutex_unlock(&delayed_node->mutex);
1261
1262 trans = btrfs_join_transaction(delayed_node->root);
1263 if (IS_ERR(trans)) {
1264 ret = PTR_ERR(trans);
1265 goto out;
1266 }
1267
1268 path = btrfs_alloc_path();
1269 if (!path) {
1270 ret = -ENOMEM;
1271 goto trans_out;
1272 }
1273 path->leave_spinning = 1;
1274
1275 block_rsv = trans->block_rsv;
1276 trans->block_rsv = &delayed_node->root->fs_info->delayed_block_rsv;
1277
1278 mutex_lock(&delayed_node->mutex);
1279 if (delayed_node->inode_dirty)
1280 ret = __btrfs_update_delayed_inode(trans, delayed_node->root,
1281 path, delayed_node);
1282 else
1283 ret = 0;
1284 mutex_unlock(&delayed_node->mutex);
1285
1286 btrfs_free_path(path);
1287 trans->block_rsv = block_rsv;
1288trans_out:
1289 btrfs_end_transaction(trans, delayed_node->root);
1290 btrfs_btree_balance_dirty(delayed_node->root);
1291out:
1292 btrfs_release_delayed_node(delayed_node);
1293
1294 return ret;
1295}
1296
1233void btrfs_remove_delayed_node(struct inode *inode) 1297void btrfs_remove_delayed_node(struct inode *inode)
1234{ 1298{
1235 struct btrfs_delayed_node *delayed_node; 1299 struct btrfs_delayed_node *delayed_node;
diff --git a/fs/btrfs/delayed-inode.h b/fs/btrfs/delayed-inode.h
index 4f808e1baeed..78b6ad0fc669 100644
--- a/fs/btrfs/delayed-inode.h
+++ b/fs/btrfs/delayed-inode.h
@@ -117,6 +117,7 @@ int btrfs_commit_inode_delayed_items(struct btrfs_trans_handle *trans,
117/* Used for evicting the inode. */ 117/* Used for evicting the inode. */
118void btrfs_remove_delayed_node(struct inode *inode); 118void btrfs_remove_delayed_node(struct inode *inode);
119void btrfs_kill_delayed_inode_items(struct inode *inode); 119void btrfs_kill_delayed_inode_items(struct inode *inode);
120int btrfs_commit_inode_delayed_inode(struct inode *inode);
120 121
121 122
122int btrfs_delayed_update_inode(struct btrfs_trans_handle *trans, 123int btrfs_delayed_update_inode(struct btrfs_trans_handle *trans,
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index ca7ace7b7b52..1ea0988b82e1 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -3904,6 +3904,12 @@ void btrfs_evict_inode(struct inode *inode)
3904 goto no_delete; 3904 goto no_delete;
3905 } 3905 }
3906 3906
3907 ret = btrfs_commit_inode_delayed_inode(inode);
3908 if (ret) {
3909 btrfs_orphan_del(NULL, inode);
3910 goto no_delete;
3911 }
3912
3907 rsv = btrfs_alloc_block_rsv(root, BTRFS_BLOCK_RSV_TEMP); 3913 rsv = btrfs_alloc_block_rsv(root, BTRFS_BLOCK_RSV_TEMP);
3908 if (!rsv) { 3914 if (!rsv) {
3909 btrfs_orphan_del(NULL, inode); 3915 btrfs_orphan_del(NULL, inode);
@@ -3941,7 +3947,7 @@ void btrfs_evict_inode(struct inode *inode)
3941 goto no_delete; 3947 goto no_delete;
3942 } 3948 }
3943 3949
3944 trans = btrfs_start_transaction_lflush(root, 1); 3950 trans = btrfs_join_transaction(root);
3945 if (IS_ERR(trans)) { 3951 if (IS_ERR(trans)) {
3946 btrfs_orphan_del(NULL, inode); 3952 btrfs_orphan_del(NULL, inode);
3947 btrfs_free_block_rsv(root, rsv); 3953 btrfs_free_block_rsv(root, rsv);
@@ -3955,9 +3961,6 @@ void btrfs_evict_inode(struct inode *inode)
3955 break; 3961 break;
3956 3962
3957 trans->block_rsv = &root->fs_info->trans_block_rsv; 3963 trans->block_rsv = &root->fs_info->trans_block_rsv;
3958 ret = btrfs_update_inode(trans, root, inode);
3959 BUG_ON(ret);
3960
3961 btrfs_end_transaction(trans, root); 3964 btrfs_end_transaction(trans, root);
3962 trans = NULL; 3965 trans = NULL;
3963 btrfs_btree_balance_dirty(root); 3966 btrfs_btree_balance_dirty(root);