Tao Ma
2008-Oct-06 08:59 UTC
[Ocfs2-devel] [PATCH] ocfs2/mmap: return 0 in page_mkwrite to let VFS retry.
In ocfs2_page_mkwrite, we return -EINVAL when we found the page mapping isn't updated, and it will cause the user space program get SIGBUS and exit. The reason is that during race writeable mmap, we will do unmap_mapping_range in ocfs2_data_downconvert_worker. The good thing is that if we reuturn 0 in page_mkwrite, VFS will retry fault and then call page_mkwrite again, so it is safe to return 0 here. Signed-off-by: Tao Ma <tao.ma at oracle.com> --- fs/ocfs2/mmap.c | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) diff --git a/fs/ocfs2/mmap.c b/fs/ocfs2/mmap.c index 3dc18d6..eea1d24 100644 --- a/fs/ocfs2/mmap.c +++ b/fs/ocfs2/mmap.c @@ -113,7 +113,11 @@ static int __ocfs2_page_mkwrite(struct inode *inode, struct buffer_head *di_bh, * ocfs2_write_begin_nolock(). */ if (!PageUptodate(page) || page->mapping != inode->i_mapping) { - ret = -EINVAL; + /* + * the page has been umapped in ocfs2_data_downconvert_worker. + * So return 0 here and let VFS retry. + */ + ret = 0; goto out; } -- 1.5.3.6.861.gd794-dirty
Sunil Mushran
2008-Oct-06 17:15 UTC
[Ocfs2-devel] [PATCH] ocfs2/mmap: return 0 in page_mkwrite to let VFS retry.
Tao, Please can you attach this to the bugzilla. http://oss.oracle.com/bugzilla/show_bug.cgi?id=1019 Easier to track fixes. Thanks Sunil Tao Ma wrote:> In ocfs2_page_mkwrite, we return -EINVAL when we found the page mapping > isn't updated, and it will cause the user space program get SIGBUS and > exit. The reason is that during race writeable mmap, we will do > unmap_mapping_range in ocfs2_data_downconvert_worker. The good thing is > that if we reuturn 0 in page_mkwrite, VFS will retry fault and then > call page_mkwrite again, so it is safe to return 0 here. > > Signed-off-by: Tao Ma <tao.ma at oracle.com> > --- > fs/ocfs2/mmap.c | 6 +++++- > 1 files changed, 5 insertions(+), 1 deletions(-) > > diff --git a/fs/ocfs2/mmap.c b/fs/ocfs2/mmap.c > index 3dc18d6..eea1d24 100644 > --- a/fs/ocfs2/mmap.c > +++ b/fs/ocfs2/mmap.c > @@ -113,7 +113,11 @@ static int __ocfs2_page_mkwrite(struct inode *inode, struct buffer_head *di_bh, > * ocfs2_write_begin_nolock(). > */ > if (!PageUptodate(page) || page->mapping != inode->i_mapping) { > - ret = -EINVAL; > + /* > + * the page has been umapped in ocfs2_data_downconvert_worker. > + * So return 0 here and let VFS retry. > + */ > + ret = 0; > goto out; > } > >