* Is this a bug?
@ 2011-04-02 8:05 Ding Dinghua
2011-04-02 16:32 ` Amir Goldstein
0 siblings, 1 reply; 5+ messages in thread
From: Ding Dinghua @ 2011-04-02 8:05 UTC (permalink / raw)
To: linux-ext4
When truncate files and free blocks, the following codes make me puzzled:
void ext4_free_blocks(handle_t *handle, struct inode *inode,
struct buffer_head *bh, ext4_fsblk_t block,
unsigned long count, int flags)
{
if (flags & EXT4_FREE_BLOCKS_FORGET) {
struct buffer_head *tbh = bh;
int i;
BUG_ON(bh && (count > 1));
for (i = 0; i < count; i++) {
if (!bh)
tbh = sb_find_get_block(inode->i_sb,
block + i);
if (unlikely(!tbh))
continue;
ext4_forget(handle, flags & EXT4_FREE_BLOCKS_METADATA,
inode, tbh, block + i);
}
}
}
I notice that ext4_forget mainly do two things:
a) call jbd2_journa_forget to forget the modification of some buffer head
b) or deal with the revoke issue
however, if we are freeing data blocks && ext4_forget get into branch a),
tbh is not the buffer_head which journal took care of in ext4_write_begin,
so i'm puzzled with this.
Could anyone explain it to me? Thanks.
--
Ding Dinghua
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Is this a bug?
2011-04-02 8:05 Is this a bug? Ding Dinghua
@ 2011-04-02 16:32 ` Amir Goldstein
2011-04-03 9:24 ` Ding Dinghua
0 siblings, 1 reply; 5+ messages in thread
From: Amir Goldstein @ 2011-04-02 16:32 UTC (permalink / raw)
To: Ding Dinghua; +Cc: linux-ext4
On Sat, Apr 2, 2011 at 1:05 AM, Ding Dinghua <dingdinghua85@gmail.com> wrote:
> When truncate files and free blocks, the following codes make me puzzled:
>
> void ext4_free_blocks(handle_t *handle, struct inode *inode,
> struct buffer_head *bh, ext4_fsblk_t block,
> unsigned long count, int flags)
> {
> if (flags & EXT4_FREE_BLOCKS_FORGET) {
> struct buffer_head *tbh = bh;
> int i;
>
> BUG_ON(bh && (count > 1));
>
> for (i = 0; i < count; i++) {
> if (!bh)
> tbh = sb_find_get_block(inode->i_sb,
> block + i);
> if (unlikely(!tbh))
> continue;
> ext4_forget(handle, flags & EXT4_FREE_BLOCKS_METADATA,
> inode, tbh, block + i);
> }
> }
> }
>
> I notice that ext4_forget mainly do two things:
> a) call jbd2_journa_forget to forget the modification of some buffer head
> b) or deal with the revoke issue
> however, if we are freeing data blocks && ext4_forget get into branch a),
Simple. we don't pass the FORGET flag when freeing data blocks,
only when freeing metadata blocks, which may have been journalled
already.
I am not sure about the journal=data case through.
> tbh is not the buffer_head which journal took care of in ext4_write_begin,
> so i'm puzzled with this.
>
> Could anyone explain it to me? Thanks.
>
> --
> Ding Dinghua
> --
> To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Is this a bug?
2011-04-02 16:32 ` Amir Goldstein
@ 2011-04-03 9:24 ` Ding Dinghua
2011-04-03 14:51 ` Yongqiang Yang
0 siblings, 1 reply; 5+ messages in thread
From: Ding Dinghua @ 2011-04-03 9:24 UTC (permalink / raw)
To: Amir Goldstein; +Cc: linux-ext4
2011/4/3 Amir Goldstein <amir73il@gmail.com>:
> On Sat, Apr 2, 2011 at 1:05 AM, Ding Dinghua <dingdinghua85@gmail.com> wrote:
>> When truncate files and free blocks, the following codes make me puzzled:
>>
>> void ext4_free_blocks(handle_t *handle, struct inode *inode,
>> struct buffer_head *bh, ext4_fsblk_t block,
>> unsigned long count, int flags)
>> {
>> if (flags & EXT4_FREE_BLOCKS_FORGET) {
>> struct buffer_head *tbh = bh;
>> int i;
>>
>> BUG_ON(bh && (count > 1));
>>
>> for (i = 0; i < count; i++) {
>> if (!bh)
>> tbh = sb_find_get_block(inode->i_sb,
>> block + i);
>> if (unlikely(!tbh))
>> continue;
>> ext4_forget(handle, flags & EXT4_FREE_BLOCKS_METADATA,
>> inode, tbh, block + i);
>> }
>> }
>> }
>>
>> I notice that ext4_forget mainly do two things:
>> a) call jbd2_journa_forget to forget the modification of some buffer head
>> b) or deal with the revoke issue
>> however, if we are freeing data blocks && ext4_forget get into branch a),
>
> Simple. we don't pass the FORGET flag when freeing data blocks,
> only when freeing metadata blocks, which may have been journalled
> already.
> I am not sure about the journal=data case through.
Thanks for reply. The reason for me to dip into this issue is journal=data mode.
>
>> tbh is not the buffer_head which journal took care of in ext4_write_begin,
>> so i'm puzzled with this.
>>
>> Could anyone explain it to me? Thanks.
>>
>> --
>> Ding Dinghua
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>
>
--
Ding Dinghua
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Is this a bug?
2011-04-03 9:24 ` Ding Dinghua
@ 2011-04-03 14:51 ` Yongqiang Yang
2011-04-03 15:44 ` Amir Goldstein
0 siblings, 1 reply; 5+ messages in thread
From: Yongqiang Yang @ 2011-04-03 14:51 UTC (permalink / raw)
To: Ding Dinghua; +Cc: Amir Goldstein, linux-ext4
On Sun, Apr 3, 2011 at 5:24 PM, Ding Dinghua <dingdinghua85@gmail.com> wrote:
> 2011/4/3 Amir Goldstein <amir73il@gmail.com>:
>> On Sat, Apr 2, 2011 at 1:05 AM, Ding Dinghua <dingdinghua85@gmail.com> wrote:
>>> When truncate files and free blocks, the following codes make me puzzled:
>>>
>>> void ext4_free_blocks(handle_t *handle, struct inode *inode,
>>> struct buffer_head *bh, ext4_fsblk_t block,
>>> unsigned long count, int flags)
>>> {
>>> if (flags & EXT4_FREE_BLOCKS_FORGET) {
>>> struct buffer_head *tbh = bh;
>>> int i;
>>>
>>> BUG_ON(bh && (count > 1));
>>>
>>> for (i = 0; i < count; i++) {
>>> if (!bh)
>>> tbh = sb_find_get_block(inode->i_sb,
>>> block + i);
>>> if (unlikely(!tbh))
>>> continue;
>>> ext4_forget(handle, flags & EXT4_FREE_BLOCKS_METADATA,
>>> inode, tbh, block + i);
>>> }
>>> }
>>> }
>>>
>>> I notice that ext4_forget mainly do two things:
>>> a) call jbd2_journa_forget to forget the modification of some buffer head
>>> b) or deal with the revoke issue
>>> however, if we are freeing data blocks && ext4_forget get into branch a),
>>
>> Simple. we don't pass the FORGET flag when freeing data blocks,
>> only when freeing metadata blocks, which may have been journalled
>> already.
>> I am not sure about the journal=data case through.
> Thanks for reply. The reason for me to dip into this issue is journal=data mode.
I think data processing in journal=data mode is similar to metadata
processing in joutnal=ordered mode.
>>
>>> tbh is not the buffer_head which journal took care of in ext4_write_begin,
>>> so i'm puzzled with this.
>>>
>>> Could anyone explain it to me? Thanks.
>>>
>>> --
>>> Ding Dinghua
>>> --
>>> To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
>>> the body of a message to majordomo@vger.kernel.org
>>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>>
>>
>
>
>
> --
> Ding Dinghua
> --
> To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
--
Best Wishes
Yongqiang Yang
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Is this a bug?
2011-04-03 14:51 ` Yongqiang Yang
@ 2011-04-03 15:44 ` Amir Goldstein
0 siblings, 0 replies; 5+ messages in thread
From: Amir Goldstein @ 2011-04-03 15:44 UTC (permalink / raw)
To: Ding Dinghua; +Cc: Yongqiang Yang, Ext4 Developers List
On Sun, Apr 3, 2011 at 7:51 AM, Yongqiang Yang <xiaoqiangnk@gmail.com> wrote:
> On Sun, Apr 3, 2011 at 5:24 PM, Ding Dinghua <dingdinghua85@gmail.com> wrote:
>> 2011/4/3 Amir Goldstein <amir73il@gmail.com>:
>>> On Sat, Apr 2, 2011 at 1:05 AM, Ding Dinghua <dingdinghua85@gmail.com> wrote:
>>>> When truncate files and free blocks, the following codes make me puzzled:
>>>>
>>>> void ext4_free_blocks(handle_t *handle, struct inode *inode,
>>>> struct buffer_head *bh, ext4_fsblk_t block,
>>>> unsigned long count, int flags)
>>>> {
>>>> if (flags & EXT4_FREE_BLOCKS_FORGET) {
>>>> struct buffer_head *tbh = bh;
>>>> int i;
>>>>
>>>> BUG_ON(bh && (count > 1));
>>>>
>>>> for (i = 0; i < count; i++) {
>>>> if (!bh)
>>>> tbh = sb_find_get_block(inode->i_sb,
>>>> block + i);
>>>> if (unlikely(!tbh))
>>>> continue;
>>>> ext4_forget(handle, flags & EXT4_FREE_BLOCKS_METADATA,
>>>> inode, tbh, block + i);
>>>> }
>>>> }
>>>> }
>>>>
>>>> I notice that ext4_forget mainly do two things:
>>>> a) call jbd2_journa_forget to forget the modification of some buffer head
>>>> b) or deal with the revoke issue
>>>> however, if we are freeing data blocks && ext4_forget get into branch a),
>>>
>>> Simple. we don't pass the FORGET flag when freeing data blocks,
>>> only when freeing metadata blocks, which may have been journalled
>>> already.
>>> I am not sure about the journal=data case through.
>> Thanks for reply. The reason for me to dip into this issue is journal=data mode.
> I think data processing in journal=data mode is similar to metadata
> processing in joutnal=ordered mode.
not exactly. Ding is right to be puzzled, because journal=data
journals inode page cache buffers and not block device buffers, like
metadata.
However, I think what happens is that prior to ext4_clear_blocks, which
invokes ext4_free_blocks with the FORGET flag, ext4_invalidatepage
will have been called already and forget about data buffers which were modified
in the current running transaction.
ext4_free_blocks will then handle revoke of data blocks which were modified in
previous transaction. for example, in orphan cleanup, ext4_free_blocks will be
will be called from ext4_truncate, but there will be no pages to invalidate.
this is my guess. I haven't studied this case thoroughly.
>>>
>>>> tbh is not the buffer_head which journal took care of in ext4_write_begin,
>>>> so i'm puzzled with this.
>>>>
>>>> Could anyone explain it to me? Thanks.
>>>>
>>>> --
>>>> Ding Dinghua
>>>> --
>>>> To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
>>>> the body of a message to majordomo@vger.kernel.org
>>>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>>>
>>>
>>
>>
>>
>> --
>> Ding Dinghua
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>
>
>
>
> --
> Best Wishes
> Yongqiang Yang
>
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2011-04-03 15:44 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-04-02 8:05 Is this a bug? Ding Dinghua
2011-04-02 16:32 ` Amir Goldstein
2011-04-03 9:24 ` Ding Dinghua
2011-04-03 14:51 ` Yongqiang Yang
2011-04-03 15:44 ` Amir Goldstein
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox