diff options
Diffstat (limited to 'fs/btrfs/delayed-inode.c')
| -rw-r--r-- | fs/btrfs/delayed-inode.c | 23 | 
1 files changed, 20 insertions, 3 deletions
| diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c index 2399f4086915..335605c8ceab 100644 --- a/fs/btrfs/delayed-inode.c +++ b/fs/btrfs/delayed-inode.c | |||
| @@ -62,6 +62,7 @@ static inline void btrfs_init_delayed_node( | |||
| 62 | INIT_LIST_HEAD(&delayed_node->n_list); | 62 | INIT_LIST_HEAD(&delayed_node->n_list); | 
| 63 | INIT_LIST_HEAD(&delayed_node->p_list); | 63 | INIT_LIST_HEAD(&delayed_node->p_list); | 
| 64 | delayed_node->bytes_reserved = 0; | 64 | delayed_node->bytes_reserved = 0; | 
| 65 | memset(&delayed_node->inode_item, 0, sizeof(delayed_node->inode_item)); | ||
| 65 | } | 66 | } | 
| 66 | 67 | ||
| 67 | static inline int btrfs_is_continuous_delayed_item( | 68 | static inline int btrfs_is_continuous_delayed_item( | 
| @@ -1113,8 +1114,8 @@ static int btrfs_update_delayed_inode(struct btrfs_trans_handle *trans, | |||
| 1113 | * Returns < 0 on error and returns with an aborted transaction with any | 1114 | * Returns < 0 on error and returns with an aborted transaction with any | 
| 1114 | * outstanding delayed items cleaned up. | 1115 | * outstanding delayed items cleaned up. | 
| 1115 | */ | 1116 | */ | 
| 1116 | int btrfs_run_delayed_items(struct btrfs_trans_handle *trans, | 1117 | static int __btrfs_run_delayed_items(struct btrfs_trans_handle *trans, | 
| 1117 | struct btrfs_root *root) | 1118 | struct btrfs_root *root, int nr) | 
| 1118 | { | 1119 | { | 
| 1119 | struct btrfs_root *curr_root = root; | 1120 | struct btrfs_root *curr_root = root; | 
| 1120 | struct btrfs_delayed_root *delayed_root; | 1121 | struct btrfs_delayed_root *delayed_root; | 
| @@ -1122,6 +1123,7 @@ int btrfs_run_delayed_items(struct btrfs_trans_handle *trans, | |||
| 1122 | struct btrfs_path *path; | 1123 | struct btrfs_path *path; | 
| 1123 | struct btrfs_block_rsv *block_rsv; | 1124 | struct btrfs_block_rsv *block_rsv; | 
| 1124 | int ret = 0; | 1125 | int ret = 0; | 
| 1126 | bool count = (nr > 0); | ||
| 1125 | 1127 | ||
| 1126 | if (trans->aborted) | 1128 | if (trans->aborted) | 
| 1127 | return -EIO; | 1129 | return -EIO; | 
| @@ -1137,7 +1139,7 @@ int btrfs_run_delayed_items(struct btrfs_trans_handle *trans, | |||
| 1137 | delayed_root = btrfs_get_delayed_root(root); | 1139 | delayed_root = btrfs_get_delayed_root(root); | 
| 1138 | 1140 | ||
| 1139 | curr_node = btrfs_first_delayed_node(delayed_root); | 1141 | curr_node = btrfs_first_delayed_node(delayed_root); | 
| 1140 | while (curr_node) { | 1142 | while (curr_node && (!count || (count && nr--))) { | 
| 1141 | curr_root = curr_node->root; | 1143 | curr_root = curr_node->root; | 
| 1142 | ret = btrfs_insert_delayed_items(trans, path, curr_root, | 1144 | ret = btrfs_insert_delayed_items(trans, path, curr_root, | 
| 1143 | curr_node); | 1145 | curr_node); | 
| @@ -1149,6 +1151,7 @@ int btrfs_run_delayed_items(struct btrfs_trans_handle *trans, | |||
| 1149 | path, curr_node); | 1151 | path, curr_node); | 
| 1150 | if (ret) { | 1152 | if (ret) { | 
| 1151 | btrfs_release_delayed_node(curr_node); | 1153 | btrfs_release_delayed_node(curr_node); | 
| 1154 | curr_node = NULL; | ||
| 1152 | btrfs_abort_transaction(trans, root, ret); | 1155 | btrfs_abort_transaction(trans, root, ret); | 
| 1153 | break; | 1156 | break; | 
| 1154 | } | 1157 | } | 
| @@ -1158,12 +1161,26 @@ int btrfs_run_delayed_items(struct btrfs_trans_handle *trans, | |||
| 1158 | btrfs_release_delayed_node(prev_node); | 1161 | btrfs_release_delayed_node(prev_node); | 
| 1159 | } | 1162 | } | 
| 1160 | 1163 | ||
| 1164 | if (curr_node) | ||
| 1165 | btrfs_release_delayed_node(curr_node); | ||
| 1161 | btrfs_free_path(path); | 1166 | btrfs_free_path(path); | 
| 1162 | trans->block_rsv = block_rsv; | 1167 | trans->block_rsv = block_rsv; | 
| 1163 | 1168 | ||
| 1164 | return ret; | 1169 | return ret; | 
| 1165 | } | 1170 | } | 
| 1166 | 1171 | ||
| 1172 | int btrfs_run_delayed_items(struct btrfs_trans_handle *trans, | ||
| 1173 | struct btrfs_root *root) | ||
| 1174 | { | ||
| 1175 | return __btrfs_run_delayed_items(trans, root, -1); | ||
| 1176 | } | ||
| 1177 | |||
| 1178 | int btrfs_run_delayed_items_nr(struct btrfs_trans_handle *trans, | ||
| 1179 | struct btrfs_root *root, int nr) | ||
| 1180 | { | ||
| 1181 | return __btrfs_run_delayed_items(trans, root, nr); | ||
| 1182 | } | ||
| 1183 | |||
| 1167 | static int __btrfs_commit_inode_delayed_items(struct btrfs_trans_handle *trans, | 1184 | static int __btrfs_commit_inode_delayed_items(struct btrfs_trans_handle *trans, | 
| 1168 | struct btrfs_delayed_node *node) | 1185 | struct btrfs_delayed_node *node) | 
| 1169 | { | 1186 | { | 
