At 10:04 09/02/03, Chris Mason wrote:
>On Tue, 2009-02-03 at 09:36 +0900, Hisashi Hifumi wrote:
>> At 23:12 09/02/02, Chris Mason wrote:
>> >On Mon, 2009-02-02 at 20:00 +0900, Hisashi Hifumi wrote:
>> >> Hi Chris.
>> >> 
>> >> I think it is needed to call mark_inode_dirty() when file size expands
>> >> in order to flush metadata updates to HDD through sync() syscall or
>> >> background_writeout().
>> >> 
>> >
>> >Thanks for reading through this code and sending the patch.
>> >
>> >I find the I_DIRTY flags one of the more confusing parts of the generic
>> >fs writeback cdoe.  But, I think what happens is the
>> >btrfs_set_page_dirty function calls __set_page_dirty_nobuffers() which
>> >does:
>> >
>> >if (mapping->host) {
>> >     /* !PageAnon && !swapper_space */
>> >      __mark_inode_dirty(mapping->host, I_DIRTY_PAGES);
>> >}
>> >
>> >This should be enough to make sure the btrfs inodes are processed by
>> >background writeout and sync().  Please let me know if I'm misreading
>> >things.
>> 
>> Surely, as you pointed out, btrfs_set_page_dirty calls
>> if (mapping->host) {
>>      /* !PageAnon && !swapper_space */
>>       __mark_inode_dirty(mapping->host, I_DIRTY_PAGES);
>> }
>> through _set_page_dirty_nobuffers.
>> But I_DIRTY_PAGES is not sufficient.
>> To flush metadata update to HDD through sync(), I_DIRTY_SYNC or 
>> I_DIRTY_DATASYNC flag is needed. see __sync_single_inode.
>
>Since btrfs uses a dirty_inode callback, our inodes are never really
>dirty. The btree metadata always has the same information as the in-core
>inode does.
>
>The extra transaction commit steps taken at sync time are enough to get
>all the relevant metadata on disk.
>
>So, I think what happens is that I_DIRTY_PAGES is enough to get the data
>pages on disk and the transaction commit gets the metadata on disk.


metadata update transaction is made through dirty_inode call back, but
to run dirty_inode callback I_DIRTY_SYNC or  I_DIRTY_DATASYNC flag is needed.
(see __mark_inode_dirty).

Also, to commit transaction to disk through write_inode callback, I_DIRTY_SYNC 
or  I_DIRTY_DATASYNC flag is needed.(see _sync_single_inode)

So I think my patch fixes this issue.



--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to