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;
 }
 

Reply via email to