[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