mirror of https://gitee.com/openkylin/linux.git
for-5.8-rc6-tag
-----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEE8rQSAMVO+zA4DBdWxWXV+ddtWDsFAl8auzgACgkQxWXV+ddt WDv0CRAAooFO+hloV+br40eEfJwZJJk+iIvc3tyq3TRUrmt1D0G4F7nUtiHjb8JU ch2HK+GNZkIK4747OCgcFREpYZV2m0hrKybzf/j4mYb7OXzHmeHTMfGVut1g80e7 dlpvP7q4VZbBP8BTo/8wqdSAdCUiNhLFy5oYzyUwyflJ5S8FpjY+3dXIRHUnhxPU lxMANWhX9y/qQEceGvxqwqJBiYT6WI7dwONiULc1klWDIug/2BGZQR0WuC5PVr0G YNuxcEU6rluWzKWJ5k3104t+N1Nc5+xglIgBLeLKAyTVYq8zAMf+P8bBPnQ3QDkV zniNIH9ND8tYSjmGkmO0ltExFrE2o9NRnjapOFXfB0WGXee5LfzFfzd5Hk9YV+Ua bs98VNGR4B12Iw++DvrbhbFAMxBHiBfAX/O44xJ81uAYVUs21OfefxHWrLzTJK+1 xYfiyfCDxZDGpC/weg9GOPcIZAzzoSAvqDqWHyWY5cCZdB60RaelGJprdG5fP/gA Y+hDIdutVXMHfhaX0ktWsDvhPRXcC7MT0bjasljkN5WUJ/xZZQr6QmgngY+FA8G/ 0n/dv0pYdOTK/8YVZAMO+VklzrDhziqzc2sBrH1k3MA9asa/Ls5v+r2PU+qBKZJm cBJGtxxsx72CHbkIhtd5oGj5LNTXFdXeHph37ErzW3ajeamO4X0= =51h/ -----END PGP SIGNATURE----- Merge tag 'for-5.8-rc6-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux into master Pull btrfs fixes from David Sterba: "A few resouce leak fixes from recent patches, all are stable material. The problems have been observed during testing or have a reproducer" * tag 'for-5.8-rc6-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux: btrfs: fix mount failure caused by race with umount btrfs: fix page leaks after failure to lock page for delalloc btrfs: qgroup: fix data leak caused by race between writeback and truncate btrfs: fix double free on ulist after backref resolution failure
This commit is contained in:
commit
0669704270
|
@ -1461,6 +1461,7 @@ static int btrfs_find_all_roots_safe(struct btrfs_trans_handle *trans,
|
|||
if (ret < 0 && ret != -ENOENT) {
|
||||
ulist_free(tmp);
|
||||
ulist_free(*roots);
|
||||
*roots = NULL;
|
||||
return ret;
|
||||
}
|
||||
node = ulist_next(tmp, &uiter);
|
||||
|
|
|
@ -1999,7 +1999,8 @@ static int __process_pages_contig(struct address_space *mapping,
|
|||
if (!PageDirty(pages[i]) ||
|
||||
pages[i]->mapping != mapping) {
|
||||
unlock_page(pages[i]);
|
||||
put_page(pages[i]);
|
||||
for (; i < ret; i++)
|
||||
put_page(pages[i]);
|
||||
err = -EAGAIN;
|
||||
goto out;
|
||||
}
|
||||
|
|
|
@ -8123,20 +8123,17 @@ static void btrfs_invalidatepage(struct page *page, unsigned int offset,
|
|||
/*
|
||||
* Qgroup reserved space handler
|
||||
* Page here will be either
|
||||
* 1) Already written to disk
|
||||
* In this case, its reserved space is released from data rsv map
|
||||
* and will be freed by delayed_ref handler finally.
|
||||
* So even we call qgroup_free_data(), it won't decrease reserved
|
||||
* space.
|
||||
* 2) Not written to disk
|
||||
* This means the reserved space should be freed here. However,
|
||||
* if a truncate invalidates the page (by clearing PageDirty)
|
||||
* and the page is accounted for while allocating extent
|
||||
* in btrfs_check_data_free_space() we let delayed_ref to
|
||||
* free the entire extent.
|
||||
* 1) Already written to disk or ordered extent already submitted
|
||||
* Then its QGROUP_RESERVED bit in io_tree is already cleaned.
|
||||
* Qgroup will be handled by its qgroup_record then.
|
||||
* btrfs_qgroup_free_data() call will do nothing here.
|
||||
*
|
||||
* 2) Not written to disk yet
|
||||
* Then btrfs_qgroup_free_data() call will clear the QGROUP_RESERVED
|
||||
* bit of its io_tree, and free the qgroup reserved data space.
|
||||
* Since the IO will never happen for this page.
|
||||
*/
|
||||
if (PageDirty(page))
|
||||
btrfs_qgroup_free_data(inode, NULL, page_start, PAGE_SIZE);
|
||||
btrfs_qgroup_free_data(inode, NULL, page_start, PAGE_SIZE);
|
||||
if (!inode_evicting) {
|
||||
clear_extent_bit(tree, page_start, page_end, EXTENT_LOCKED |
|
||||
EXTENT_DELALLOC | EXTENT_DELALLOC_NEW |
|
||||
|
|
|
@ -7051,6 +7051,14 @@ int btrfs_read_chunk_tree(struct btrfs_fs_info *fs_info)
|
|||
mutex_lock(&uuid_mutex);
|
||||
mutex_lock(&fs_info->chunk_mutex);
|
||||
|
||||
/*
|
||||
* It is possible for mount and umount to race in such a way that
|
||||
* we execute this code path, but open_fs_devices failed to clear
|
||||
* total_rw_bytes. We certainly want it cleared before reading the
|
||||
* device items, so clear it here.
|
||||
*/
|
||||
fs_info->fs_devices->total_rw_bytes = 0;
|
||||
|
||||
/*
|
||||
* Read all device items, and then all the chunk items. All
|
||||
* device items are found before any chunk item (their object id
|
||||
|
|
Loading…
Reference in New Issue