[Ocfs2-tools-devel] [PATCH 5/6] Resend: Add unwritten extent
support in ocfs2-tools, take 2
tao.ma
tao.ma at oracle.com
Fri Sep 28 18:34:23 PDT 2007
Mark Fasheh wrote:
> On Wed, Sep 26, 2007 at 06:50:16PM -0700, Joel Becker wrote:
>
>> On Thu, Sep 27, 2007 at 09:40:21AM +0800, tao.ma wrote:
>>
>>>> Oho! We have a problem. In ocfs2_read_whole_file, we have a
>>>> reader function (read_whole_func) that doesn't check unwritten extents.
>>>> That needs to be added to patch #6. Of course, how to tell the
>>>> function?
>>>> Also, extras/set_random_bits.c uses it. I think that the
>>>> fsck.ocfs2 users are safe (symlinks and directories).
>>>>
>>>>
>>> Yes, that is what I worry about. the callback has no idea of whether the
>>> block is marked as unwritten. So maybe as I have said previously, add a new
>>> parameter in callback's definition that this block exists in an unwritten
>>> extent?
>>> Do you have any suggestion or just agree with me? :)
>>>
>> If it was just read, we could easily pass a flag and expect the
>> callback to do the right thing. However, write is much harder.
>>
>
> Passing a flags field is probably the right solution for reads.
>
> Block iteration in general is a very bad interface for doing data writes on
> ocfs2 though. There's a reason why we moved away from get_block based writes
> in kernel. In all fairness, it made no difference until we started
> supporting sparse files.
>
> ocfs2_extent_iterate_inode() doesn't handle holes either. And since it looks
> like ocfs2_block_iterate_inode() is based on it, I'll assume the same there.
> Hopefully all the read code is smart enough to at least put zero's where a
> hole or unwritten extent is.
>
>
>
>> I don't quite know the solution. The rule is, if you have an
>> unwritten extent, you must zero the parts you don't actually write. But
>> block_iterate() is block-based. It doesn't know from extents. I think
>> that block_iterate() will have to know about it. Somehow know that a
>> block was written to by the callback and thus zero around it. Mark, any
>> thoughts?
>>
>
> Disallow hole-filling or writes to unwritten regions via those functions?
>
> Honestly, there's not much else unless we teach them all how to mark an
> extent written or allocate clusters - and then they're not exactly block
> iteration functions any more ;)
>
> Imho we should have code which wants to read and write data to regular files
> just use ocfs2_file_read() and ocfs2_file_write(). There's still a place for
> block or extent iteration, but I think it's no longer suitable for basic
> file data i/o.
> --Mark
>
OK, so let me generalize the consensus we make:
1. Add a new paremater to ocfs2_block_iterate like function, so that
return zero if they need to read.
2. As for write, the user should really call ocfs2_file_write instead of
these iterate things. ;)
3. As for extent record iteration, we really should not touch the flag
to avoid splitting or merging. But we should have the ability the modify
the cluster length like ocfs2_truncate. And it would work already with
current code I think.
More information about the Ocfs2-tools-devel
mailing list