[linux-cifs-client] Re: [PATCH] cifs: prevent cifs_writepages() from skipping unwritten pages

Dave Kleikamp shaggy at linux.vnet.ibm.com
Mon Nov 17 17:57:16 GMT 2008


On Mon, 2008-11-17 at 11:02 -0600, Shirish S Pargaonkar wrote:
> 
> 
> Dave Kleikamp <shaggy at linux.vnet.ibm.com> wrote on 11/17/2008 09:59:07
> AM:
> 
> > On Mon, 2008-11-17 at 09:42 -0600, Shirish S Pargaonkar wrote:
> > 
> > > Shaggy, 
> > > 
> > > But if the pdflush grabbed it to write, it would percolate down
> to 
> > > calling cifs_writepages right?  If so, how come we do not see
> those 
> > > at the server, we would have seen samba server logging those write
> > > andx 
> > > and perhaps the offsets would be out of order but there in the
> samba 
> > > log file nonetheless! 
> > > 
> > You're more familiar with what's been logged, but let me explain
> what I
> > think may be happening, and you can tell me if it fits your
> > observations.
> > 
> > The cifs_flush thread gets into cifs_writepages and
> pagevec_lookup_tag()
> > returns 14 pages, let's say pages 0-13.
> >  -----
> > The pdflush thread writes some smaller number of pages, 0-4.
> >  -----
> > After waiting on page 0, the cifs_flush thread sees that it's no
> longer
> > dirty, and calls pagevec_lookup_tag() again, but index has been set
> to
> > 14, so it gets back pages 14-27.  Pages 5-13 get missed.
> > -- 
> > David Kleikamp
> > IBM Linux Technology Center
> > 
> 
> I see the opposite, i.e. the upper pages are not received by samba
> server. 
> For example, after writing 56KB at the 56K boundary, 
> 8 pages are not received by the samba server but rest of them are. 
> 
> Here is an example of what I see... 
> 
> This is the log level 10 output on the samba server. 
> 
> 
> real_write_file (39.test): pos = 19267584, size = 57344, returned
> 57344 
> real_write_file (39.test): pos = 19324928, size = 57344, returned
> 57344 
> real_write_file (39.test): pos = 19382272, size = 57344, returned
> 57344 
> real_write_file (39.test): pos = 19439616, size = 57344, returned
> 57344 
> real_write_file (39.test): pos = 19496960, size = 57344, returned
> 57344 
> real_write_file (39.test): pos = 19587072, size = 57344, returned
> 57344 
> real_write_file (39.test): pos = 19644416, size = 57344, returned
> 57344 
> real_write_file (39.test): pos = 19701760, size = 57344, returned
> 57344 
> 
> which matches with the hole in the file as the hex dump of the file
> shows 
> 
> 12a5fe0: 6db6 6db6 6db6 6db6 6db6 6db6 6db6 6db6  m.m.m.m.m.m.m.m. 
> 12a5ff0: 6db6 6db6 6db6 6db6 6db6 6db6 6db6 6db6  m.m.m.m.m.m.m.m. 
> 12a6000: 0000 0000 0000 0000 0000 0000 0000 0000  ................ 
> 12a6010: 0000 0000 0000 0000 0000 0000 0000 0000  ................ 
>                         ......... 
>                        ......... 
> 12adfe0: 0000 0000 0000 0000 0000 0000 0000 0000  ................ 
> 12adff0: 0000 0000 0000 0000 0000 0000 0000 0000  ................ 
> 12ae000: 6db6 6db6 6db6 6db6 6db6 6db6 6db6 6db6  m.m.m.m.m.m.m.m. 
> 12ae010: 6db6 6db6 6db6 6db6 6db6 6db6 6db6 6db6  m.m.m.m.m.m.m.m. 
> 12ae020: 6db6 6db6 6db6 6db6 6db6 6db6 6db6 6db6  m.m.m.m.m.m.m.m. 
> 
> I do not see the top 8 pages starting at position 19554304 but see 
> 14 pages starting at position 19587072 instead. 
> Upto position 19496960, all position (offsets in write andx) have
> been 
> on 56K boundary but not starting at position 19587072 and IMHO that 
> is because top first 8 pages of 14 pages starting at 19554304 did 
> never arrive at the samba server. 
> If so, we could have seen an entry like this in the samba server log 
>  real_write_file (39.test): pos = 19554304, size = 32768, returned
> 32768 

Now I'm confused.  If cifs_writepages breaks out of the for loop for
some reason other than that the page is already marked non-dirty, then
why does it resume 8 pages later and not 14?  How does my patch fix it?
Going back to try the same page succeeds the next time?

I could see something like this during write-behind, if pages are being
flushed out while the testcase is still writing to the file, but I would
expect a later call to cifs_flush when the file is closed to go back and
clean it up afterwards.

> Regards, 
> 
> Shirish 
-- 
David Kleikamp
IBM Linux Technology Center



More information about the linux-cifs-client mailing list