Jeff Layton <jlayton@xxxxxxxxxx> wrote: > > +/** > > + * fscache_note_page_release - Note that a netfs page got released > > + * @cookie: The cookie corresponding to the file > > + * > > + * Note that a page that has been copied to the cache has been released. This > > + * means that future reads will need to look in the cache to see if it's there. > > + */ > > +static inline > > +void fscache_note_page_release(struct fscache_cookie *cookie) > > +{ > > + if (cookie && > > + test_bit(FSCACHE_COOKIE_HAVE_DATA, &cookie->flags) && > > + test_bit(FSCACHE_COOKIE_NO_DATA_TO_READ, &cookie->flags)) > > + clear_bit(FSCACHE_COOKIE_NO_DATA_TO_READ, &cookie->flags); > > +} > > + > > #endif /* _LINUX_FSCACHE_H */ > > > > > > Is this logic correct? > > FSCACHE_COOKIE_HAVE_DATA gets set in cachefiles_write_complete, but will > that ever be called on a cookie that has no data? Will we ever call > cachefiles_write at all when there is no data to be written? FSCACHE_COOKIE_NO_DATA_TO_READ is set if we have no data in the cache yet (ie. the backing file lookup was negative, the file is 0 length or the cookie got invalidated). It means that we have no data in the cache, not that the file is necessarily empty on the server. FSCACHE_COOKIE_HAVE_DATA is set once we've stored data in the backing file. >From that point on, we have data we *could* read - however, it's covered by pages in the netfs pagecache until at such time one of those covering pages is released. So if we've written data to the cache (HAVE_DATA) and there wasn't any data in the cache when we started (NO_DATA_TO_READ), it may no longer be true that we can skip reading from the cache. Read skipping is done by cachefiles_prepare_read(). Note that I'm not doing tracking on a per-page basis, but only on a per-file basis. David