[linux-cifs-client] Re: fsx-linux failing with latest cifs-2.6 git
tree
Jeff Layton
jlayton at redhat.com
Fri Nov 21 20:50:35 GMT 2008
On Fri, 21 Nov 2008 14:38:18 -0600
"Steve French" <smfrench at gmail.com> wrote:
> Fix attached.
>
> Shaggy/Jeff/Nick etc. do you want to review/ack it since it is late in the rc?
>
> On Fri, Nov 21, 2008 at 2:18 PM, Steve French <smfrench at gmail.com> wrote:
> > Looks like the following change to cifs_write_begin does fix it ...
> > thanks Shaggy ...
> >
> > @@ -2062,8 +2074,10 @@ static int cifs_write_begin(struct file *file,
> > struct address_space *mapping,
> > {
> > pgoff_t index = pos >> PAGE_CACHE_SHIFT;
> > loff_t offset = pos & (PAGE_CACHE_SIZE - 1);
> > + loff_t page_start = pos & PAGE_MASK;
> >
> > cFYI(1, ("write_begin from %lld len %d", (long long)pos, len));
> > @@ -2081,13 +2095,14 @@ static int cifs_write_begin(struct file *file,
> > struct address_space *mapping,
> > int rc;
> >
> > /* might as well read a page, it is fast enough */
> > - rc = cifs_readpage_worker(file, *pagep, &offset);
> > + rc = cifs_readpage_worker(file, *pagep, &page_start);
> >
> > /* we do not need to pass errors back
> > e.g. if we do not have read access to the file
> > because cifs_write_end will attempt synchronous writes
> > -- shaggy */
> >
> >
> > On Fri, Nov 21, 2008 at 1:41 PM, Dave Kleikamp
> > <shaggy at linux.vnet.ibm.com> wrote:
> >> On Fri, 2008-11-21 at 13:13 -0600, Steve French wrote:
> >>> Looks like this section of code is wrong in cifs_write_begin:
> >>>
> >>> if ((file->f_flags & O_ACCMODE) != O_WRONLY) {
> >>> int rc;
> >>>
> >>> /* might as well read a page, it is fast enough */
> >>> rc = cifs_readpage_worker(file, *pagep, &offset);
> >>>
> >>> /* we do not need to pass errors back
> >>> e.g. if we do not have read access to the file
> >>> because cifs_write_end will attempt synchronous writes
> >>> -- shaggy */
> >>>
> >>>
> >>> We see a case in which a write begins at offset 0x2e42f but the range
> >>> immediately before it is unitialized in write_begin
> >>>
> >>> shouldn't we be doing a read of the whole page?
> >>
> >> What cifs_write_begin() passes in as offset is completely wrong. It
> >> should be the file offset of the beginning of the page rather than some
> >> offset within the page.
> >> --
> >> David Kleikamp
> >> IBM Linux Technology Center
> >>
Good catch...
Acked-by: Jeff Layton <jlayton at redhat.com>
More information about the linux-cifs-client
mailing list