diff options
Diffstat (limited to 'fs/btrfs')
-rw-r--r-- | fs/btrfs/delayed-inode.c | 27 |
1 files changed, 0 insertions, 27 deletions
diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c index 584194938612..608efeb24aea 100644 --- a/fs/btrfs/delayed-inode.c +++ b/fs/btrfs/delayed-inode.c | |||
@@ -1300,33 +1300,6 @@ again: | |||
1300 | trans->block_rsv = &root->fs_info->delayed_block_rsv; | 1300 | trans->block_rsv = &root->fs_info->delayed_block_rsv; |
1301 | 1301 | ||
1302 | __btrfs_commit_inode_delayed_items(trans, path, delayed_node); | 1302 | __btrfs_commit_inode_delayed_items(trans, path, delayed_node); |
1303 | /* | ||
1304 | * Maybe new delayed items have been inserted, so we need requeue | ||
1305 | * the work. Besides that, we must dequeue the empty delayed nodes | ||
1306 | * to avoid the race between delayed items balance and the worker. | ||
1307 | * The race like this: | ||
1308 | * Task1 Worker thread | ||
1309 | * count == 0, needn't requeue | ||
1310 | * also needn't insert the | ||
1311 | * delayed node into prepare | ||
1312 | * list again. | ||
1313 | * add lots of delayed items | ||
1314 | * queue the delayed node | ||
1315 | * already in the list, | ||
1316 | * and not in the prepare | ||
1317 | * list, it means the delayed | ||
1318 | * node is being dealt with | ||
1319 | * by the worker. | ||
1320 | * do delayed items balance | ||
1321 | * the delayed node is being | ||
1322 | * dealt with by the worker | ||
1323 | * now, just wait. | ||
1324 | * the worker goto idle. | ||
1325 | * Task1 will sleep until the transaction is commited. | ||
1326 | */ | ||
1327 | mutex_lock(&delayed_node->mutex); | ||
1328 | btrfs_dequeue_delayed_node(root->fs_info->delayed_root, delayed_node); | ||
1329 | mutex_unlock(&delayed_node->mutex); | ||
1330 | 1303 | ||
1331 | trans->block_rsv = block_rsv; | 1304 | trans->block_rsv = block_rsv; |
1332 | btrfs_end_transaction_dmeta(trans, root); | 1305 | btrfs_end_transaction_dmeta(trans, root); |