diff options
Diffstat (limited to 'fs/btrfs/transaction.c')
-rw-r--r-- | fs/btrfs/transaction.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 49c4f5b40ed6..61a377bcb2fb 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c | |||
@@ -161,7 +161,8 @@ static struct btrfs_trans_handle *start_transaction(struct btrfs_root *root, | |||
161 | int ret; | 161 | int ret; |
162 | 162 | ||
163 | mutex_lock(&root->fs_info->trans_mutex); | 163 | mutex_lock(&root->fs_info->trans_mutex); |
164 | if ((wait == 1 && !root->fs_info->open_ioctl_trans) || wait == 2) | 164 | if (!root->fs_info->log_root_recovering && |
165 | ((wait == 1 && !root->fs_info->open_ioctl_trans) || wait == 2)) | ||
165 | wait_current_trans(root); | 166 | wait_current_trans(root); |
166 | ret = join_transaction(root); | 167 | ret = join_transaction(root); |
167 | BUG_ON(ret); | 168 | BUG_ON(ret); |
@@ -328,9 +329,17 @@ int btrfs_write_and_wait_transaction(struct btrfs_trans_handle *trans, | |||
328 | 329 | ||
329 | index = start >> PAGE_CACHE_SHIFT; | 330 | index = start >> PAGE_CACHE_SHIFT; |
330 | start = (u64)(index + 1) << PAGE_CACHE_SHIFT; | 331 | start = (u64)(index + 1) << PAGE_CACHE_SHIFT; |
331 | page = find_lock_page(btree_inode->i_mapping, index); | 332 | page = find_get_page(btree_inode->i_mapping, index); |
332 | if (!page) | 333 | if (!page) |
333 | continue; | 334 | continue; |
335 | |||
336 | btree_lock_page_hook(page); | ||
337 | if (!page->mapping) { | ||
338 | unlock_page(page); | ||
339 | page_cache_release(page); | ||
340 | continue; | ||
341 | } | ||
342 | |||
334 | if (PageWriteback(page)) { | 343 | if (PageWriteback(page)) { |
335 | if (PageDirty(page)) | 344 | if (PageDirty(page)) |
336 | wait_on_page_writeback(page); | 345 | wait_on_page_writeback(page); |
@@ -360,7 +369,8 @@ int btrfs_write_and_wait_transaction(struct btrfs_trans_handle *trans, | |||
360 | if (!page) | 369 | if (!page) |
361 | continue; | 370 | continue; |
362 | if (PageDirty(page)) { | 371 | if (PageDirty(page)) { |
363 | lock_page(page); | 372 | btree_lock_page_hook(page); |
373 | wait_on_page_writeback(page); | ||
364 | err = write_one_page(page, 0); | 374 | err = write_one_page(page, 0); |
365 | if (err) | 375 | if (err) |
366 | werr = err; | 376 | werr = err; |