diff options
author | Miao Xie <miaox@cn.fujitsu.com> | 2012-12-19 01:59:03 -0500 |
---|---|---|
committer | Josef Bacik <jbacik@fusionio.com> | 2013-02-20 09:36:38 -0500 |
commit | 4ea41ce07d8aed9e64c546abf341aea44e782e64 (patch) | |
tree | 1bc7d0df65b004a2800da7256a46903cb70c7593 /fs/btrfs/delayed-inode.c | |
parent | 7892b5afe4a1a00af25107e27357db30434ab876 (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.c | 83 |
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 | ||
1113 | static 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, | |||
1119 | static int __btrfs_run_delayed_items(struct btrfs_trans_handle *trans, | 1138 | static 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 | ||
1186 | static 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 | |||
1212 | int btrfs_commit_inode_delayed_items(struct btrfs_trans_handle *trans, | 1197 | int 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 |