Fwd: Need some help regarding write_begin, write_end and writepage(s).

Pranay Srivastava kumar.srivastava.pranay at gmail.com
Wed Jan 4 01:33:07 EST 2017


Hi Valdis,


On Wed, Jan 4, 2017 at 12:58 AM,  <Valdis.Kletnieks at vt.edu> wrote:
> On Thu, 29 Dec 2016 12:35:52 +0530, Pranay Srivastava said:
>> Hello,
>>
>> I'm trying to understand the write_begin, write_end and writepages /
>> writepage call
>> sequence by having a small file system coded myself.
>>
>> I'm not using block_write_begin / block_write_end also not using
>> mpage_writepages
>> as well.
>>
>> The issue however is that apart from write_begin and write_end, writepages never
>> gets called.
>
> writepages name implies that it's the API for writing multiple blocks in one call.
> Does your filesystem understand how to issue multi-block requests?  Did you

It's not about submitting batch request here. The issue I'm facing is
that even after
calling

set_page_dirty [ with aops->set_page_dirty = __set_page_dirty_nobuffers]

and doing

__mark_inode_dirty(inode, I_DIRTY_PAGES | I_DIRTY)

I was hoping that with an iput_final call, write_inode_now would be called which
would trigger my writepage. But that doesn't happen.

>From my understanding of iput_final, the writeout won't happen unless
the file system
is being unmounted[Correct?]  [ A check of MS_ACTIVE].

But that would work only for the root inode,as when the file is closed
[ say only 1 process has opened that file] so iput_final on that file's
inode won't call write_inode_now since file system is mounted [Correct?]

So now in order to trigger writepage, I have to make a call to
write_inode_now with
sync parameter as 0. So what I see now is

1.  A write of say 1 MB is to be done.
2.  generic_perform_write is called and it calls write_begin and
write_end for each page.
3. My write_end has actually become synchronous write instead of a
buffered one so each page actually
    is written out at write_end [ due to a call to write_inode_now in write_end]

I was kind of hoping for somehow to batch these writes[ 1 page at a
time] but on iput_final.

Oh 1 more thing, in generic_write_iter, there's a call to fsync and
this call never comes to my file system!
I'm pretty sure I'm missing some dirty flags somewhere but it's not
fallen in place currently.

Thanks for your reply though. I really appreciate it.

> *test* with userspace calls that *should* generate multi-block requests?
 A large write buffer > PAGE_SIZE ought to do it right?



More information about the Kernelnewbies mailing list