Commit f6011081f5e290756bd90fe96f1e86d3eac76f77
Committed by
Miklos Szeredi
1 parent
cb2ffb26e6
fuse: writepages: roll back changes if request not found
fuse_writepage_in_flight() returns false if it fails to find request with given index in fi->writepages. Then the caller proceeds with populating data->orig_pages[] and incrementing req->num_pages. Hence, fuse_writepage_in_flight() must revert changes it made in request before returning false. Signed-off-by: Maxim Patlasov <MPatlasov@parallels.com> Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
Showing 1 changed file with 4 additions and 2 deletions Side-by-side Diff
fs/fuse/file.c
... | ... | @@ -1649,7 +1649,6 @@ |
1649 | 1649 | |
1650 | 1650 | spin_lock(&fc->lock); |
1651 | 1651 | list_del(&new_req->writepages_entry); |
1652 | - new_req->num_pages = 1; | |
1653 | 1652 | list_for_each_entry(old_req, &fi->writepages, writepages_entry) { |
1654 | 1653 | BUG_ON(old_req->inode != new_req->inode); |
1655 | 1654 | curr_index = old_req->misc.write.in.offset >> PAGE_CACHE_SHIFT; |
1656 | 1655 | |
1657 | 1656 | |
... | ... | @@ -1659,9 +1658,12 @@ |
1659 | 1658 | break; |
1660 | 1659 | } |
1661 | 1660 | } |
1662 | - if (!found) | |
1661 | + if (!found) { | |
1662 | + list_add(&new_req->writepages_entry, &fi->writepages); | |
1663 | 1663 | goto out_unlock; |
1664 | + } | |
1664 | 1665 | |
1666 | + new_req->num_pages = 1; | |
1665 | 1667 | for (tmp = old_req; tmp != NULL; tmp = tmp->misc.write.next) { |
1666 | 1668 | BUG_ON(tmp->inode != new_req->inode); |
1667 | 1669 | curr_index = tmp->misc.write.in.offset >> PAGE_CACHE_SHIFT; |