mirror of
https://github.com/torvalds/linux.git
synced 2024-11-26 14:12:06 +00:00
gfs2 fix
- Don't get stuck writing page onto itself under direct I/O. -----BEGIN PGP SIGNATURE----- iQJIBAABCAAyFiEEJZs3krPW0xkhLMTc1b+f6wMTZToFAmR/KcEUHGFncnVlbmJh QHJlZGhhdC5jb20ACgkQ1b+f6wMTZTr3wA//eCaUYWKOiSXbbvNeP1pdawN8zRZO alpK/nsujcB4bDdiDUTREYFBfcmBKEIboFz6e02DL8MPp2mc0fZ/Ox9yq/nR7o9x 9Y1CjWmC1zoUkqw6V8+vbg0m432OlcWglppgywHjvyUiEnyUzBfnxIRH/k0lLYor yR7vViSZQhJ4jroSeEVNKsCeZUiY7y5tiLo+bcHYYF7lolab/ZfNxacr1/lSAuww WS0frjAeSBneQ5aU2JQ60lbJcJQydfdoS3n0dlyX6qJeVoFCnhQAJeiVSQaYMFpE HaYFs/3YGjzAkoWqX5CAzLIfxsIHepdaP4PtITg3xwyMQ1j3X5H5n1FOyJCcbXz7 s7gq/RXjU3TV/hVPSukVGhwjavB8gMrbQtmpSYHpA99ldeNfIVwps2PSWdoDND/B 7w+g0T5U+yd7DNz2tL9YML7Anioc0K6y1hVvacuPIgNHJyLQ5XaPYJXUUJFfl0X6 njcZVmfK56RQRPR7jDp26F4X+Pw+GjahJJq05zCwsmFnP6+pX2gjYNx9LidXBugU 1L8BlN2IZvc9ShvInZIuQHwTMEXAMjjSd5JtX7iZLnHxeWDfIlo64ZrroiiNbrk6 pDqG+C6fkYV1h1fzX3bvFZIvFoKERxu9u9TunBIiBQFHQNYWoe2i5zpZNXyT7Soo epIqTaWmf8l/3vo= =9syc -----END PGP SIGNATURE----- Merge tag 'gfs2-v6.4-rc4-fix' of git://git.kernel.org/pub/scm/linux/kernel/git/gfs2/linux-gfs2 Pull gfs2 fix from Andreas Gruenbacher: - Don't get stuck writing page onto itself under direct I/O * tag 'gfs2-v6.4-rc4-fix' of git://git.kernel.org/pub/scm/linux/kernel/git/gfs2/linux-gfs2: gfs2: Don't get stuck writing page onto itself under direct I/O
This commit is contained in:
commit
0bdd0f0bf1
@ -784,9 +784,13 @@ static inline bool should_fault_in_pages(struct iov_iter *i,
|
||||
if (!user_backed_iter(i))
|
||||
return false;
|
||||
|
||||
/*
|
||||
* Try to fault in multiple pages initially. When that doesn't result
|
||||
* in any progress, fall back to a single page.
|
||||
*/
|
||||
size = PAGE_SIZE;
|
||||
offs = offset_in_page(iocb->ki_pos);
|
||||
if (*prev_count != count || !*window_size) {
|
||||
if (*prev_count != count) {
|
||||
size_t nr_dirtied;
|
||||
|
||||
nr_dirtied = max(current->nr_dirtied_pause -
|
||||
@ -870,6 +874,7 @@ static ssize_t gfs2_file_direct_write(struct kiocb *iocb, struct iov_iter *from,
|
||||
struct gfs2_inode *ip = GFS2_I(inode);
|
||||
size_t prev_count = 0, window_size = 0;
|
||||
size_t written = 0;
|
||||
bool enough_retries;
|
||||
ssize_t ret;
|
||||
|
||||
/*
|
||||
@ -913,11 +918,17 @@ retry:
|
||||
if (ret > 0)
|
||||
written = ret;
|
||||
|
||||
enough_retries = prev_count == iov_iter_count(from) &&
|
||||
window_size <= PAGE_SIZE;
|
||||
if (should_fault_in_pages(from, iocb, &prev_count, &window_size)) {
|
||||
gfs2_glock_dq(gh);
|
||||
window_size -= fault_in_iov_iter_readable(from, window_size);
|
||||
if (window_size)
|
||||
goto retry;
|
||||
if (window_size) {
|
||||
if (!enough_retries)
|
||||
goto retry;
|
||||
/* fall back to buffered I/O */
|
||||
ret = 0;
|
||||
}
|
||||
}
|
||||
out_unlock:
|
||||
if (gfs2_holder_queued(gh))
|
||||
|
Loading…
Reference in New Issue
Block a user