On Tue, 29 Aug 2023 at 20:37, Lei Huang <lei.huang@xxxxxxxxxxxxxxx> wrote: > > Our user space filesystem relies on fuse to provide POSIX interface. > In our test, a known string is written into a file and the content > is read back later to verify correct data returned. We observed wrong > data returned in read buffer in rare cases although correct data are > stored in our filesystem. > > Fuse kernel module calls iov_iter_get_pages2() to get the physical > pages of the user-space read buffer passed in read(). The pages are > not pinned to avoid page migration. When page migration occurs, the > consequence are two-folds. > > 1) Applications do not receive correct data in read buffer. > 2) fuse kernel writes data into a wrong place. > > Using iov_iter_extract_pages() to pin pages fixes the issue in our > test. > > An auxiliary variable "struct page **pt_pages" is used in the patch > to prepare the 2nd parameter for iov_iter_extract_pages() since > iov_iter_get_pages2() uses a different type for the 2nd parameter. > > Signed-off-by: Lei Huang <lei.huang@xxxxxxxxxxxxxxx> Applied, with a modification to only unpin if iov_iter_extract_will_pin() returns true. Thanks, Miklos