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
This commit is contained in:
commit
6dc728ccd3
|
@ -530,13 +530,13 @@ void fuse_read_fill(struct fuse_req *req, struct file *file, loff_t pos,
|
||||||
req->out.args[0].size = count;
|
req->out.args[0].size = count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fuse_release_user_pages(struct fuse_req *req, int write)
|
static void fuse_release_user_pages(struct fuse_req *req, bool should_dirty)
|
||||||
{
|
{
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
for (i = 0; i < req->num_pages; i++) {
|
for (i = 0; i < req->num_pages; i++) {
|
||||||
struct page *page = req->pages[i];
|
struct page *page = req->pages[i];
|
||||||
if (write)
|
if (should_dirty)
|
||||||
set_page_dirty_lock(page);
|
set_page_dirty_lock(page);
|
||||||
put_page(page);
|
put_page(page);
|
||||||
}
|
}
|
||||||
|
@ -1320,6 +1320,7 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter,
|
||||||
loff_t *ppos, int flags)
|
loff_t *ppos, int flags)
|
||||||
{
|
{
|
||||||
int write = flags & FUSE_DIO_WRITE;
|
int write = flags & FUSE_DIO_WRITE;
|
||||||
|
bool should_dirty = !write && iter_is_iovec(iter);
|
||||||
int cuse = flags & FUSE_DIO_CUSE;
|
int cuse = flags & FUSE_DIO_CUSE;
|
||||||
struct file *file = io->file;
|
struct file *file = io->file;
|
||||||
struct inode *inode = file->f_mapping->host;
|
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,
|
||||||
nres = fuse_send_read(req, io, pos, nbytes, owner);
|
nres = fuse_send_read(req, io, pos, nbytes, owner);
|
||||||
|
|
||||||
if (!io->async)
|
if (!io->async)
|
||||||
fuse_release_user_pages(req, !write);
|
fuse_release_user_pages(req, should_dirty);
|
||||||
if (req->out.h.error) {
|
if (req->out.h.error) {
|
||||||
err = req->out.h.error;
|
err = req->out.h.error;
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue