| From e89166990f11c3f21e1649d760dd35f9e410321c Mon Sep 17 00:00:00 2001 |
| From: Liu Bo <bo.li.liu@oracle.com> |
| Date: Thu, 25 Jan 2018 11:02:50 -0700 |
| Subject: Btrfs: fix deadlock in run_delalloc_nocow |
| |
| From: Liu Bo <bo.li.liu@oracle.com> |
| |
| commit e89166990f11c3f21e1649d760dd35f9e410321c upstream. |
| |
| @cur_offset is not set back to what it should be (@cow_start) if |
| btrfs_next_leaf() returns something wrong, and the range [cow_start, |
| cur_offset) remains locked forever. |
| |
| cc: <stable@vger.kernel.org> |
| Signed-off-by: Liu Bo <bo.li.liu@oracle.com> |
| Reviewed-by: Josef Bacik <jbacik@fb.com> |
| Signed-off-by: David Sterba <dsterba@suse.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/btrfs/inode.c | 5 ++++- |
| 1 file changed, 4 insertions(+), 1 deletion(-) |
| |
| --- a/fs/btrfs/inode.c |
| +++ b/fs/btrfs/inode.c |
| @@ -1292,8 +1292,11 @@ next_slot: |
| leaf = path->nodes[0]; |
| if (path->slots[0] >= btrfs_header_nritems(leaf)) { |
| ret = btrfs_next_leaf(root, path); |
| - if (ret < 0) |
| + if (ret < 0) { |
| + if (cow_start != (u64)-1) |
| + cur_offset = cow_start; |
| goto error; |
| + } |
| if (ret > 0) |
| break; |
| leaf = path->nodes[0]; |