[Ocfs2-tools-devel] [PATCH 3/3] tunefs.ocfs2: Use one I/O cache.

Sunil Mushran sunil.mushran at oracle.com
Thu Jul 23 12:00:11 PDT 2009


Signed-off-by: Sunil Mushran <sunil.mushran at oracle.com>


Joel Becker wrote:
> We nest ocfs2_filesys structures for each operation.  However, this can
> mean that the I/O cache on the master filesys is stale when a child
> filesys has written to its own cache.
>
> Instead, we'll create an I/O cache on the master filesys and share it in
> the children.  That way all operations have a consistent view of the
> disk.
>
> Signed-off-by: Joel Becker <joel.becker at oracle.com>
> ---
>  tunefs.ocfs2/libocfs2ne.c |   28 ++++++++++++++++++++++++++++
>  1 files changed, 28 insertions(+), 0 deletions(-)
>
> diff --git a/tunefs.ocfs2/libocfs2ne.c b/tunefs.ocfs2/libocfs2ne.c
> index f588596..5044f65 100644
> --- a/tunefs.ocfs2/libocfs2ne.c
> +++ b/tunefs.ocfs2/libocfs2ne.c
> @@ -1259,10 +1259,21 @@ static void tunefs_init_cache(ocfs2_filesys *fs)
>  {
>  	errcode_t err;
>  	struct tunefs_private *tp = to_private(fs);
> +	struct tunefs_filesystem_state *state = tunefs_get_state(fs);
>  	uint64_t blocks_wanted;
>  	int scale_down;
>  
>  	/*
> +	 * We have one I/O cache for all ocfs2_filesys structures.  This
> +	 * guarantees a consistent view of the disk.  The master filesys
> +	 * allocates it, child filesyses just use it.
> +	 */
> +	if (state->ts_master != fs) {
> +		fs->fs_io = state->ts_master->fs_io;
> +		return;
> +	}
> +
> +	/*
>  	 * Operations needing a large cache really want enough to
>  	 * hold the whole filesystem in memory.  The rest of the
>  	 * operations don't need much at all.  A cache big enough to
> @@ -1314,6 +1325,21 @@ static void tunefs_init_cache(ocfs2_filesys *fs)
>  	}
>  }
>  
> +static void tunefs_drop_cache(ocfs2_filesys *fs)
> +{
> +	struct tunefs_filesystem_state *state = tunefs_get_state(fs);
> +
> +	/*
> +	 * The master filesys created our cache.  We don't want
> +	 * ocfs2_close() to kill it if we're closing a non-master,
> +	 * so kill the pointer for those.
> +	 */
> +	if (state->ts_master == fs)
> +		io_destroy_cache(fs->fs_io);
> +	else
> +		fs->fs_io = NULL;
> +}
> +
>  static errcode_t tunefs_add_fs(ocfs2_filesys *fs, int flags)
>  {
>  	errcode_t err;
> @@ -1470,6 +1496,7 @@ errcode_t tunefs_open(const char *device, int flags,
>  out:
>  	if (err && !tunefs_special_errorp(err)) {
>  		if (fs) {
> +			tunefs_drop_cache(fs);
>  			tunefs_remove_fs(fs);
>  			ocfs2_close(fs);
>  			fs = NULL;
> @@ -1499,6 +1526,7 @@ errcode_t tunefs_close(ocfs2_filesys *fs)
>  		if (!err)
>  			err = tmp;
>  
> +		tunefs_drop_cache(fs);
>  		tunefs_remove_fs(fs);
>  		tmp = ocfs2_close(fs);
>  		if (!err)
>   




More information about the Ocfs2-tools-devel mailing list