Skip to content

Commit 6dc728c

Browse files
committed
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse
Pull fuse fix from Miklos Szeredi: "This fixes a deadlock when fuse, direct I/O and loop device are combined" * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse: fuse: direct-io: don't dirty ITER_BVEC pages
2 parents 5c44ad6 + 8fba54a commit 6dc728c

File tree

1 file changed

+4
-3
lines changed

1 file changed

+4
-3
lines changed

fs/fuse/file.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -530,13 +530,13 @@ void fuse_read_fill(struct fuse_req *req, struct file *file, loff_t pos,
530530
req->out.args[0].size = count;
531531
}
532532

533-
static void fuse_release_user_pages(struct fuse_req *req, int write)
533+
static void fuse_release_user_pages(struct fuse_req *req, bool should_dirty)
534534
{
535535
unsigned i;
536536

537537
for (i = 0; i < req->num_pages; i++) {
538538
struct page *page = req->pages[i];
539-
if (write)
539+
if (should_dirty)
540540
set_page_dirty_lock(page);
541541
put_page(page);
542542
}
@@ -1320,6 +1320,7 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter,
13201320
loff_t *ppos, int flags)
13211321
{
13221322
int write = flags & FUSE_DIO_WRITE;
1323+
bool should_dirty = !write && iter_is_iovec(iter);
13231324
int cuse = flags & FUSE_DIO_CUSE;
13241325
struct file *file = io->file;
13251326
struct inode *inode = file->f_mapping->host;
@@ -1363,7 +1364,7 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter,
13631364
nres = fuse_send_read(req, io, pos, nbytes, owner);
13641365

13651366
if (!io->async)
1366-
fuse_release_user_pages(req, !write);
1367+
fuse_release_user_pages(req, should_dirty);
13671368
if (req->out.h.error) {
13681369
err = req->out.h.error;
13691370
break;

0 commit comments

Comments
 (0)