On 07/25/2012 03:56 PM, Boaz Harrosh wrote: > On 07/25/2012 03:29 PM, Ben Hutchings wrote: > >> On Tue, 2012-07-24 at 13:07 -0700, [email protected] wrote: >>> The patch below does not apply to the 3.4-stable tree. >>> If someone wants it applied there, or to any other stable or longterm >>> tree, then please email the backport, including the original git commit >>> id to <[email protected]>. >> [...] >> >> Here's the version I used for 3.2.24. It applies and builds cleanly on >> 3.4, and no-one has told me it's wrong. >> >> Ben. >> > > > Yes ACK-by: Boaz Harrosh <[email protected]> > > Sorry guys for the mess. I should have cloned stable and tested the > rebase properly. I usually do and promise to do so in the future. > Was really last minute this time. > > Thanks Ben for the fix. Beer on me next time. > > Thanks greg > Boaz >
Hi Greg Please also add the attached patch fixed by Ben Hutchings. To the 3.4 stable releases. Has it is upstream it failed to patch. I have not seen it in the patches stream you posted last. If it was already added then sorry for the noise. Thanks Boaz
From: Boaz Harrosh <[email protected]> Date: Fri, 8 Jun 2012 02:02:30 +0300 Subject: pnfs-obj: Fix __r4w_get_page when offset is beyond i_size commit c999ff68029ebd0f56ccae75444f640f6d5a27d2 upstream. It is very common for the end of the file to be unaligned on stripe size. But since we know it's beyond file's end then the XOR should be preformed with all zeros. Old code used to just read zeros out of the OSD devices, which is a great waist. But what scares me more about this situation is that, we now have pages attached to the file's mapping that are beyond i_size. I don't like the kind of bugs this calls for. Fix both birds, by returning a global zero_page, if offset is beyond i_size. TODO: Change the API to ->__r4w_get_page() so a NULL can be returned without being considered as error, since XOR API treats NULL entries as zero_pages. [Bug since 3.2. Should apply the same way to all Kernels since] CC: Stable <[email protected]> Signed-off-by: Boaz Harrosh <[email protected]> [bwh: Backported to 3.2: adjust for lack of wdata->header] Signed-off-by: Ben Hutchings <[email protected]> --- --- a/fs/nfs/objlayout/objio_osd.c +++ b/fs/nfs/objlayout/objio_osd.c @@ -467,8 +467,16 @@ static struct page *__r4w_get_page(void struct objio_state *objios = priv; struct nfs_write_data *wdata = objios->oir.rpcdata; pgoff_t index = offset / PAGE_SIZE; - struct page *page = find_get_page(wdata->inode->i_mapping, index); + struct page *page; + loff_t i_size = i_size_read(wdata->inode); + if (offset >= i_size) { + *uptodate = true; + dprintk("%s: g_zero_page index=0x%lx\n", __func__, index); + return ZERO_PAGE(0); + } + + page = find_get_page(wdata->inode->i_mapping, index); if (!page) { page = find_or_create_page(wdata->inode->i_mapping, index, GFP_NOFS); @@ -489,8 +497,10 @@ static struct page *__r4w_get_page(void static void __r4w_put_page(void *priv, struct page *page) { - dprintk("%s: index=0x%lx\n", __func__, page->index); - page_cache_release(page); + dprintk("%s: index=0x%lx\n", __func__, + (page == ZERO_PAGE(0)) ? -1UL : page->index); + if (ZERO_PAGE(0) != page) + page_cache_release(page); return; }
