Rajat
On Sat, Dec 18, 2010 at 6:51 AM, Prasad Joshi <prasadjoshi124@xxxxxxxxx> 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 ecartis@xxxxxxxxxxxx
Please read the FAQ at http://kernelnewbies.org/FAQ