[Ocfs2-tools-devel] [PATCH] Add extent flag as the parameter
to block iteration function.
tao.ma
tao.ma at oracle.com
Tue Oct 9 18:12:06 PDT 2007
Mark Fasheh wrote:
> On Tue, Oct 09, 2007 at 02:01:38PM +0800, tao.ma wrote:
>
>> As we have added unwritten extent in ocfs2, block iteration function
>> needs to know whether the content in the block is good. So add a new
>> parameter in block iteration function.
>>
>> As for the block writting, please don't use these block iteration
>> functions. Just use ocfs2_file_write since it knows everything about
>> unwritten extents. ;)
>>
>
> Ok, most of that looks good - we're deprecating this api so adding the flags
> is questionable, but I think in the end it's probably useful to complete it
> in case the existing callers need a quick fix (for example, fsck should
> probably check for and correct the unwritten flag in directory extents).
>
> Can you please move the OCFS2_EXTENT_*, OCFS2_BLOCK_* flag / return code definitions
> and ocfs2_extent_iterate{_inode}/ocfs2_block_iterate{_inode} prototypes to
> the bottom of libocfs2/include/ocfs2.h?
>
> Above them, we should add a comment indicating that the api is now
> deprecated.
>
> Maybe something like this:
>
> /*
> * Deprecated extent/block iterate functions.
> */
>
>
>
OK, no problem. I will move it.
>> diff --git a/libocfs2/fileio.c b/libocfs2/fileio.c
>> index 85730b2..d10d141 100644
>> --- a/libocfs2/fileio.c
>> +++ b/libocfs2/fileio.c
>> @@ -45,12 +45,17 @@ struct read_whole_context {
>> static int read_whole_func(ocfs2_filesys *fs,
>> uint64_t blkno,
>> uint64_t bcount,
>> + uint16_t ext_flags,
>> void *priv_data)
>> {
>> struct read_whole_context *ctx = priv_data;
>>
>> - ctx->errcode = io_read_block(fs->fs_io, blkno,
>> - 1, ctx->ptr);
>> + if (ext_flags & OCFS2_EXT_UNWRITTEN) {
>> + memset(ctx->ptr, 0, fs->fs_blocksize);
>> + ctx->errcode = 0;
>> + } else
>> + ctx->errcode = io_read_block(fs->fs_io, blkno,
>> + 1, ctx->ptr);
>> if (ctx->errcode)
>> return OCFS2_BLOCK_ABORT;
>>
>
> Can you just fix up ocfs2_read_whole_file() to use ocfs2_file_read()
> instead? This way it won't need any modification for inline-data.
>
After I re-read the function of ocfs2_read_whole_file, I have some new
thought about it. If you go through the code, you will see that it only
allocate the di->i_clusters and iterate all the clusters and read them.
So considering that now we have sparse file support, what should we do
if we meet with a large hole? It is useless for us to read many number
of zeros from ocfs2_file_read. Thanks to god that after I go through all
the caller of this function in ocfs2-tools, it is only used for slot_map
and heartbeat files.
I have to say this function should also be deprecated. Maybe I have to
also move its definition to the bottom of libocfs2/include/ocfs2.h since
it isn't suitable for sparse file now.
So my suggestion is that just leave it as what I have modified. You
don't have to modify it for inline-data and I will move the definition
to the bottom of libocfs2/include/ocfs2.h. Is it OK?
More information about the Ocfs2-tools-devel
mailing list