[Ocfs2-devel] [PATCH 0/40] ocfs2: Detach ocfs2 metadata I/O from struct inode

Tao Ma tao.ma at oracle.com
Sun Feb 15 17:36:53 PST 2009


Hi Joel,
	I deem that 1-3 is the same as the patch you sent to me several days 
ago. right? As I have reviewed them before, so didn't touch them this time.
	For 4~7, read them and like them. Just small comments ;)
	For 8~40, since they are just replacing parameters. Just skim them.

anyway, They are cool and relieve me from my current work. Thank you 
very much.
For all the patches, Acked-by: Tao Ma <tao.ma at oracle.com>

Regards,
Tao

Joel Becker wrote:
> The following series of patches attempts to detach metadata I/O from
> struct inode.   They are currently tied together pretty tightly.
> Metadata reads happen via the ocfs2_read_blocks() functions, writes via
> both jbd2 and ocfs2_write_blocks().
> 
> - Each inode has a cache of associated metadata blocks stored on its
>   ip_metadata_cache member.  The ocfs2_read/write_blocks() functions
>   take a struct inode to access this member.
> 
> - The journal mostly doesn't care about inodes.  It does, however, need
>   to set the transaction id on the inode so that dlmglue knows when an
>   inode needs to checkpoint.
> 
> - All the metadata I/O paths use ip_io_mutex to synchronize their
>   actions against each other.
> 
> The problem is that if someone wants to use our metadata I/O facilities,
> they have to have a struct inode.  But not everything in ocfs2 is an
> inode (even if it seems that way sometimes).  So we want to disconnect
> them.
> 
> It turns out that most of what goes on is about ocfs2_caching_info.  So
> if we move the last few relevant bits to ocfs2_caching_info, we can then
> embed ocfs2_caching_info into another structure just as easily as we do
> inside struct inode.  That's the theory, anyway.
> 
> The first three patches move the cache code to ocfs2_caching_info
> entirely.  The functions affecting the metadata cache, like
> ocfs2_set_buffer_uptodate(), etc, take a struct ocfs2_caching_info
> instead of a struct inode.  That sort of thing.  It's nice and easy.
> 
> The next three patches move the journal transaction ids to struct
> ocfs2_caching_info.  When they are done, the ocfs2_journal_access*()
> functions take a stuct ocfs2_caching_info, and the dlmglue checks the
> ocfs2_caching_info regarding checkpoints.  So it only takes us six
> patches to isolate ocfs2_caching_info in the metadata I/O API.
> 
> The remaining 34 patches slowly but surely move alloc.c to the new API.
> Our btree code is heavily invested in the idea that all btrees are
> rooted, somehow, at an inode.  Since we want to root a btree at a
> non-inode, we need to fix that.  The good news, of course, is that the
> ocfs2_extent_tree abstraction is already there to rescue us.  We attach
> the ocfs2_caching_info to a particular ocfs2_extent_tree, and we can
> then send that ocfs2_extent_tree down through the btree code.  At the
> end of this series, the generic btree code doesn't reference struct
> inode at all.
> 
> There are a lot of patches because this entire series is supposed to be
> isomorphic.  No behavior is to change, just the flexibility of our API.
> Thus, each patch tries to be readily understandable.  Thank you for your
> patience!
> 
> [View]
> http://oss.oracle.com/git/?p=jlbec/linux-2.6.git;a=shortlog;h=cacheme
> [Pull]
> git://oss.oracle.com/git/jlbec/linux-2.6.git cacheme
> 
> Joel Becker (40):
>       ocfs2: Make the ocfs2_caching_info structure self-contained.
>       ocfs2: Change metadata caching locks to an operations structure.
>       ocfs2: Take the inode out of the metadata read/write paths.
>       ocfs2: move ip_last_trans to struct ocfs2_caching_info
>       ocfs2: move ip_created_trans to struct ocfs2_caching_info
>       ocfs2: Pass struct ocfs2_caching_info to the journal functions.
>       ocfs2: Store the ocfs2_caching_info on ocfs2_extent_tree.
>       ocfs2: Pass ocfs2_caching_info to ocfs2_read_extent_block().
>       ocfs2: ocfs2_find_path() only needs the caching info
>       ocfs2: ocfs2_create_new_meta_bhs() doesn't need struct inode.
>       ocfs2: Pass ocfs2_extent_tree to ocfs2_unlink_path()
>       ocfs2: ocfs2_complete_edge_insert() doesn't need struct inode at all.
>       ocfs2: Get inode out of ocfs2_rotate_subtree_root_right().
>       ocfs2: Pass ocfs2_extent_tree to ocfs2_get_subtree_root()
>       ocfs2: Drop struct inode from ocfs2_extent_tree_operations.
>       ocfs2: ocfs2_rotate_tree_right() doesn't need struct inode.
>       ocfs2: ocfs2_update_edge_lengths() doesn't need struct inode.
>       ocfs2: ocfs2_rotate_subtree_left() doesn't need struct inode.
>       ocfs2: __ocfs2_rotate_tree_left() doesn't need struct inode.
>       ocfs2: ocfs2_rotate_tree_left() no longer needs struct inode.
>       ocfs2: ocfs2_merge_rec_left/right() no longer need struct inode.
>       ocfs2: ocfs2_try_to_merge_extent() doesn't need struct inode.
>       ocfs2: ocfs2_grow_branch() no longer needs struct inode.
>       ocfs2: ocfs2_append_rec_to_path() loses struct inode.
>       ocfs2: ocfs2_truncate_rec() doesn't need struct inode.
>       ocfs2: Make truncating the extent map an extent_tree_operation.
>       ocfs2: ocfs2_insert_at_leaf() doesn't need struct inode.
>       ocfs2: Give ocfs2_split_record() an extent_tree instead of an inode.
>       ocfs2: ocfs2_do_insert_extent() and ocfs2_insert_path() no longer need an 
>       ocfs2: ocfs2_extent_contig() only requires the superblock.
>       ocfs2: Swap inode for extent_tree in ocfs2_figure_merge_contig_type().
>       ocfs2: Remove inode from ocfs2_figure_extent_contig().
>       ocfs2: ocfs2_figure_insert_type() no longer needs struct inode.
>       ocfs2: Make extent map insertion an extent_tree_operation.
>       ocfs2: ocfs2_insert_extent() no longer needs struct inode.
>       ocfs2: ocfs2_add_clusters_in_btree() no longer needs struct inode.
>       ocfs2: ocfs2_remove_extent() no longer needs struct inode.
>       ocfs2: ocfs2_split_and_insert() no longer needs struct inode.
>       ocfs2: __ocfs2_mark_extent_written() doesn't need struct inode.
>       ocfs2: Pass ocfs2_caching_info into ocfs_init_*_extent_tree().
> 
>  alloc.c          |  896 ++++++++++++++++++++++++++++---------------------------
>  alloc.h          |   33 --
>  aops.c           |   10 
>  buffer_head_io.c |   47 +-
>  buffer_head_io.h |    8 
>  dir.c            |   38 +-
>  dlmglue.c        |    4 
>  extent_map.c     |   14 
>  file.c           |   21 -
>  inode.c          |   80 ++++
>  inode.h          |   20 -
>  journal.c        |   53 +--
>  journal.h        |   70 ++--
>  localalloc.c     |   12 
>  namei.c          |   37 +-
>  ocfs2.h          |   38 ++
>  quota_global.c   |    5 
>  quota_local.c    |   16 
>  resize.c         |   16 
>  slot_map.c       |   10 
>  suballoc.c       |   35 +-
>  super.c          |    5 
>  uptodate.c       |  265 +++++++++-------
>  uptodate.h       |   51 ++-
>  xattr.c          |   81 ++--
>  25 files changed, 1056 insertions(+), 809 deletions(-)
> 
> 



More information about the Ocfs2-devel mailing list