FUSE: nfsd with direct_io fix
Miklos Szeredi
maintainerPATCH 1/1 FUSE: nfsd with direct_io fix
This patch fixes an Oops which happens when a filesystem mounted with the "direct_io" mount option is exported through NFS. The problem is that nfsd passes a kernel buffer with the "set_fs(KERNEL_DS)" method to read and write, but get_user_pages() won't work on such a buffer. The current fix is "don't do that then". Long term solution will be to implement nfs serving in userspace. Bug spotted by David Shaw.
Signed-off-by Miklos Szeredi <[email protected]>
fs/fuse/file.c +4 -0
@@ -409,6 +409,10 @@ static int fuse_get_user_pages(struct fuunsigned offset = user_addr & ~PAGE_MASK ;int npages; +/* This doesn't work with nfsd */ +if (!current->mm) +return -EPERM ; + nbytes =min (nbytes, (unsigned )FUSE_MAX_PAGES_PER_REQ <<PAGE_SHIFT ); npages = (nbytes + offset +PAGE_SIZE -1 ) >>PAGE_SHIFT ; npages =min (npages,FUSE_MAX_PAGES_PER_REQ );