Re: tail -f /mounted/share/filename is not working

Shirish Pargaonkar <[email protected]>
Newsgroups gmane.linux.file-systems.cifs
Message-ID <[email protected]>
On Fri, Mar 20, 2009 at 10:50 PM, Günter Kukkukk <[email protected]> wrote:
> Am Freitag, 20. März 2009 schrieb Suresh Jayaraman:
>> � wrote:
>> > Hi Steve, Jeff,
>> >
>> > this one is on my todo list for more than a year now.
>>
>> May be this behavior has changed now?  I tried to reproduce this on
>> 2.6.27.19 with directio option against a Samba-3.0.26 server. I could
>> not reproduce this at all (I used tail instead of statgk). I'm
>> seeing the stuff written with negligible delay on the client.
>>
>> Are you able to reproduce this with the recent kernels? If yes, are you
>> getting more clues as to what is happening with a tcpdump/cifsFYI ?
>
> About a year ago i had some short irc talk with Jeff about this tail -f ..
> problem, but we dropped it, cause other stuff had higher priority.
>
> I actually do my tests on Steve's recent git kernel tree - so 2.6.29-rc7 -
> against recent samba_v-3-3-test.
> As i already mentioned
>    "Btw - when using the mount option "directio", all _seems_ to be fine."
> the tail -f ... problem is only seen here when "directio" is _not_ used.
>
> The wire traffic to the server is only a repeated
>   QUERY_PATH_INFO (Query File Unix Basic)
> as requested periodically from the clients program fstat()
>
> Btw - my statgk applet has some advantages over 'tail' when debugging this, by also
> listing the size (..) change - and showing the ability to really read the appended
> line(s) - and list it as ASCII and also as some first hex bytes (which are often nil here).
>
> In inode.c --> cifs_revalidate() the var "invalidate_inode" is correctly set true.
>
> To me, the problematic part is inside this code fragment:
>
> -----------------------
>        if (invalidate_inode) {
>        /* shrink_dcache not necessary now that cifs dentry ops
>        are exported for negative dentries */
> /*              if (S_ISDIR(direntry->d_inode->i_mode))
>                        shrink_dcache_parent(direntry); */
>                if (S_ISREG(direntry->d_inode->i_mode)) {
>                        if (direntry->d_inode->i_mapping) {
>                                wbrc = filemap_fdatawait(direntry->d_inode->i_mapping);
>                                if (wbrc)
>                                        CIFS_I(direntry->d_inode)->write_behind_rc = wbrc;
>                        }
>                        /* may eventually have to do this for open files too */
>                        if (list_empty(&(cifsInode->openFileList))) {
>                                /* changed on server - flush read ahead pages */
>                                cFYI(1, ("Invalidating read ahead data on "
>                                         "closed file"));
>                                invalidate_remote_inode(direntry->d_inode);
>                        }
>                }
>        }
>
> -------------------------------
>
> The code path to use
>     invalidate_remote_inode(direntry->d_inode);
> is not hit.
> (when i force "invalidate_remote_inode(direntry->d_inode);" here, all
> looks much better)
>
> Sorry, when i'm wrong here. :-)
>
> Cheers, Günter
>
>>
>> >
>> > How to test:
>> >   server side: use "./wrt filename" or "./wrt -s 100 filename"
>> >                to start writing/appending to a file on a (samba) exported share
>> >                (regarding the '-s' option, I though writing large data would/could
>> >                 trigger some cifs "re-read server" internals (page dirty...))
>> >   cifs client side: (one might use 'tail -f /mnt/xyz/filename' as well)
>> >                     use ./statgk /mnt/xyz/filename
>> >
>> > On the cifs client side "statgk" uses fstat() to get possible _updated_
>> > file info from the server (filesize, times, ...) - cifs *realizes* (!) the size (times) change,
>> > but no "read additional data" from the server is done.
>> >
>>
>> Thanks,
>>
>
>
> _______________________________________________
> linux-cifs-client mailing list
> [email protected]
> https://lists.samba.org/mailman/listinfo/linux-cifs-client
>

I do not think calling/forcing invalidate_remote_inode() in
cifs_revalidate() is the solution, it will just get rid of uptodate
pages from the mapping of this inode, and cifs client will end up
reading the page/pages from server.
Has to be a better fix.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.