summaryrefslogtreecommitdiffstats
path: root/fs/btrfs/delayed-inode.c
diff options
context:
space:
mode:
authorMiao Xie <miaox@cn.fujitsu.com>2012-12-19 01:59:03 -0500
committerJosef Bacik <jbacik@fusionio.com>2013-02-20 09:36:38 -0500
commit4ea41ce07d8aed9e64c546abf341aea44e782e64 (patch)
tree1bc7d0df65b004a2800da7256a46903cb70c7593 /fs/btrfs/delayed-inode.c
parent7892b5afe4a1a00af25107e27357db30434ab876 (diff)
Btrfs: cleanup similar code in delayed inode
The delayed item commit code in several functions is similar, so cleanup it. Signed-off-by: Miao Xie <miaox@cn.fujitsu.com> Signed-off-by: Josef Bacik <jbacik@fusionio.com>
Diffstat (limited to 'fs/btrfs/delayed-inode.c')
-rw-r--r--fs/btrfs/delayed-inode.c83
1 files changed, 37 insertions, 46 deletions
diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c
index 34836036f01b..4e204bb8ba13 100644
--- a/fs/btrfs/delayed-inode.c
+++ b/fs/btrfs/delayed-inode.c
@@ -1110,6 +1110,25 @@ static int btrfs_update_delayed_inode(struct btrfs_trans_handle *trans,
1110 return 0; 1110 return 0;
1111} 1111}
1112 1112
1113static inline int
1114__btrfs_commit_inode_delayed_items(struct btrfs_trans_handle *trans,
1115 struct btrfs_path *path,
1116 struct btrfs_delayed_node *node)
1117{
1118 int ret;
1119
1120 ret = btrfs_insert_delayed_items(trans, path, node->root, node);
1121 if (ret)
1122 return ret;
1123
1124 ret = btrfs_delete_delayed_items(trans, path, node->root, node);
1125 if (ret)
1126 return ret;
1127
1128 ret = btrfs_update_delayed_inode(trans, node->root, path, node);
1129 return ret;
1130}
1131
1113/* 1132/*
1114 * Called when committing the transaction. 1133 * Called when committing the transaction.
1115 * Returns 0 on success. 1134 * Returns 0 on success.
@@ -1119,7 +1138,6 @@ static int btrfs_update_delayed_inode(struct btrfs_trans_handle *trans,
1119static int __btrfs_run_delayed_items(struct btrfs_trans_handle *trans, 1138static int __btrfs_run_delayed_items(struct btrfs_trans_handle *trans,
1120 struct btrfs_root *root, int nr) 1139 struct btrfs_root *root, int nr)
1121{ 1140{
1122 struct btrfs_root *curr_root = root;
1123 struct btrfs_delayed_root *delayed_root; 1141 struct btrfs_delayed_root *delayed_root;
1124 struct btrfs_delayed_node *curr_node, *prev_node; 1142 struct btrfs_delayed_node *curr_node, *prev_node;
1125 struct btrfs_path *path; 1143 struct btrfs_path *path;
@@ -1142,15 +1160,8 @@ static int __btrfs_run_delayed_items(struct btrfs_trans_handle *trans,
1142 1160
1143 curr_node = btrfs_first_delayed_node(delayed_root); 1161 curr_node = btrfs_first_delayed_node(delayed_root);
1144 while (curr_node && (!count || (count && nr--))) { 1162 while (curr_node && (!count || (count && nr--))) {
1145 curr_root = curr_node->root; 1163 ret = __btrfs_commit_inode_delayed_items(trans, path,
1146 ret = btrfs_insert_delayed_items(trans, path, curr_root, 1164 curr_node);
1147 curr_node);
1148 if (!ret)
1149 ret = btrfs_delete_delayed_items(trans, path,
1150 curr_root, curr_node);
1151 if (!ret)
1152 ret = btrfs_update_delayed_inode(trans, curr_root,
1153 path, curr_node);
1154 if (ret) { 1165 if (ret) {
1155 btrfs_release_delayed_node(curr_node); 1166 btrfs_release_delayed_node(curr_node);
1156 curr_node = NULL; 1167 curr_node = NULL;
@@ -1183,36 +1194,12 @@ int btrfs_run_delayed_items_nr(struct btrfs_trans_handle *trans,
1183 return __btrfs_run_delayed_items(trans, root, nr); 1194 return __btrfs_run_delayed_items(trans, root, nr);
1184} 1195}
1185 1196
1186static int __btrfs_commit_inode_delayed_items(struct btrfs_trans_handle *trans,
1187 struct btrfs_delayed_node *node)
1188{
1189 struct btrfs_path *path;
1190 struct btrfs_block_rsv *block_rsv;
1191 int ret;
1192
1193 path = btrfs_alloc_path();
1194 if (!path)
1195 return -ENOMEM;
1196 path->leave_spinning = 1;
1197
1198 block_rsv = trans->block_rsv;
1199 trans->block_rsv = &node->root->fs_info->delayed_block_rsv;
1200
1201 ret = btrfs_insert_delayed_items(trans, path, node->root, node);
1202 if (!ret)
1203 ret = btrfs_delete_delayed_items(trans, path, node->root, node);
1204 if (!ret)
1205 ret = btrfs_update_delayed_inode(trans, node->root, path, node);
1206 btrfs_free_path(path);
1207
1208 trans->block_rsv = block_rsv;
1209 return ret;
1210}
1211
1212int btrfs_commit_inode_delayed_items(struct btrfs_trans_handle *trans, 1197int btrfs_commit_inode_delayed_items(struct btrfs_trans_handle *trans,
1213 struct inode *inode) 1198 struct inode *inode)
1214{ 1199{
1215 struct btrfs_delayed_node *delayed_node = btrfs_get_delayed_node(inode); 1200 struct btrfs_delayed_node *delayed_node = btrfs_get_delayed_node(inode);
1201 struct btrfs_path *path;
1202 struct btrfs_block_rsv *block_rsv;
1216 int ret; 1203 int ret;
1217 1204
1218 if (!delayed_node) 1205 if (!delayed_node)
@@ -1226,8 +1213,20 @@ int btrfs_commit_inode_delayed_items(struct btrfs_trans_handle *trans,
1226 } 1213 }
1227 mutex_unlock(&delayed_node->mutex); 1214 mutex_unlock(&delayed_node->mutex);
1228 1215
1229 ret = __btrfs_commit_inode_delayed_items(trans, delayed_node); 1216 path = btrfs_alloc_path();
1217 if (!path)
1218 return -ENOMEM;
1219 path->leave_spinning = 1;
1220
1221 block_rsv = trans->block_rsv;
1222 trans->block_rsv = &delayed_node->root->fs_info->delayed_block_rsv;
1223
1224 ret = __btrfs_commit_inode_delayed_items(trans, path, delayed_node);
1225
1230 btrfs_release_delayed_node(delayed_node); 1226 btrfs_release_delayed_node(delayed_node);
1227 btrfs_free_path(path);
1228 trans->block_rsv = block_rsv;
1229
1231 return ret; 1230 return ret;
1232} 1231}
1233 1232
@@ -1258,7 +1257,6 @@ static void btrfs_async_run_delayed_node_done(struct btrfs_work *work)
1258 struct btrfs_root *root; 1257 struct btrfs_root *root;
1259 struct btrfs_block_rsv *block_rsv; 1258 struct btrfs_block_rsv *block_rsv;
1260 int need_requeue = 0; 1259 int need_requeue = 0;
1261 int ret;
1262 1260
1263 async_node = container_of(work, struct btrfs_async_delayed_node, work); 1261 async_node = container_of(work, struct btrfs_async_delayed_node, work);
1264 1262
@@ -1277,14 +1275,7 @@ static void btrfs_async_run_delayed_node_done(struct btrfs_work *work)
1277 block_rsv = trans->block_rsv; 1275 block_rsv = trans->block_rsv;
1278 trans->block_rsv = &root->fs_info->delayed_block_rsv; 1276 trans->block_rsv = &root->fs_info->delayed_block_rsv;
1279 1277
1280 ret = btrfs_insert_delayed_items(trans, path, root, delayed_node); 1278 __btrfs_commit_inode_delayed_items(trans, path, delayed_node);
1281 if (!ret)
1282 ret = btrfs_delete_delayed_items(trans, path, root,
1283 delayed_node);
1284
1285 if (!ret)
1286 btrfs_update_delayed_inode(trans, root, path, delayed_node);
1287
1288 /* 1279 /*
1289 * Maybe new delayed items have been inserted, so we need requeue 1280 * Maybe new delayed items have been inserted, so we need requeue
1290 * the work. Besides that, we must dequeue the empty delayed nodes 1281 * the work. Besides that, we must dequeue the empty delayed nodes