I am not sure if memory what for your filesystem needs mapping, may be to support binary execution. Do you really need to support Writable or Shared memory mappings? If you are good with Read-only mappings or Private memory mapping (which does not modify data in page cache but modify a temporary COWed copy), the solution is simple - do not implement writepage method at all, there won't be any dirty data in page cache at any point of time, so no need to flush page cache, however you need to discard page cache range when you modify the file through f_op->write(), otherwise memory mapped files will read stale data.
Rajat On Sat, Dec 18, 2010 at 6:51 AM, Prasad Joshi <prasadjoshi...@gmail.com>wrote: > Hello All, > > I am working on a file system, that uses page cache only if a file is > memory mapped. This is how the code is designed > > write() > { > write the data onto the disk > > if (file not memory mapped) > return; > > /* file is memory mapped */ > while (till all data is not syced with page cache) { > if (data at current file offset held in page) { > update the page > } > } > } > > The code that updates a page is something like this > page = find_lock_page(mapping, index); > if (likely(!page)) { > /* page not cached */ > continue; > } > > if (mapping_writably_mapped(mapping)) > flush_dcache_page(page); > > pagefault_disable(); > > /* copy the data */ > BUG_ON(!in_atomic()); > page_buf = kmap_atomic(page, KM_USER0); > if (__copy_from_user_inatomic(page_buf+offset, user_buf, size)) { > kunmap(page); > unlock_page(page); > err = -EFAULT; > goto out_error; > } > kunmap_atomic(page_buf, KM_USER0); > pagefault_enable(); > > flush_dcache_page(page); > mark_page_accessed(page); > > SetPageUptodate(page); > ClearPageError(page); > unlock_page(page); > page_cache_release(page); > > If a fops->write() is called the data in page cache is already on to > the disk. I don't want a page update from this function to trigger > writepage() function. > > The writepage() function should only be called if an user updates a > memory mapped page. > > Would calling page_clear_dirty() from the write() code be sufficient? > > I need to call flush_dcache_page() as a page should be coherent with > other mappings. Does calling flush_dcache_page() result in call to > writepage()? > > Thanks and Regards, > Prasad > > -- > To unsubscribe from this list: send an email with > "unsubscribe kernelnewbies" to ecar...@nl.linux.org > Please read the FAQ at http://kernelnewbies.org/FAQ > >