On Sun, Feb 5, 2017 at 10:01 PM, Al Viro <viro@xxxxxxxxxxxxxxxxxx> wrote: > On Sun, Feb 05, 2017 at 09:15:24PM +0100, Miklos Szeredi wrote: > >> That case is fine. But nothing guarantees that fuse_abort_conn() >> won't be called (in the non-deadlock case) when data is being copied >> to the request args. Ending the request at such a point could easily >> lead to use after free, > > So why not leave ending it to your fuse_dev_do_write()/fuse_dev_do_read()? > See the reply I'd just sent (your mail arrived while I'd been writing that > one - saw it only after I'd sent mine). > > Basically, what if we keep FR_LOCKED through *all* fuse_dev_do_{read,write}(), > rather than dropping and regaining it many times and have fuse_abort_conn() > skip request_end() on FR_LOCKED ones? Then we can't break out of that deadlock: we wait until fuse_dev_do_write() is done until calling request_end() which ultimately results in unlocking page. But fuse_dev_do_write() won't complete until the page is unlocked. The only way out that I see is to have a refcount on all pages in args. Which means copying everything not already in refcountable page (i.e. args on stack) to a page array. It's definitely doable, but needs time to sort out, and I'm definitely lacking that (overlayfs currently trumps fuse). Thanks, Miklos -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html