* 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