[Ocfs2-tools-devel] [PATCH 3/6] Fix index of directories
Sunil Mushran
sunil.mushran at oracle.com
Tue Oct 25 13:45:38 PDT 2011
Question for Mark inlined.
On 08/22/2011 03:36 PM, Goldwyn Rodrigues wrote:
> In case the i_size of the directory changes, reset the dx_root of the
> inode, so it may be later detected for index directory rebuilds. In
> pass2, if the filesystem supports directory indexing, rebuild directory
> indexes.
>
> I used this method because otherwise we will have to bounce
> dirblock_data struct between passes. The dirblock_data is used only in
> pass1.
>
> This also helps the patchset - avoiding EROFS on index dir corruptions.
> http://oss.oracle.com/pipermail/ocfs2-devel/2011-August/008312.html
>
> Signed-off-by: Goldwyn Rodrigues<rgoldwyn at suse.de>
> ---
> fsck.ocfs2/extent.c | 5 +++++
> fsck.ocfs2/pass2.c | 13 ++++++++++---
> 2 files changed, 15 insertions(+), 3 deletions(-)
>
> diff --git a/fsck.ocfs2/extent.c b/fsck.ocfs2/extent.c
> index 2bd9738..8c765ab 100644
> --- a/fsck.ocfs2/extent.c
> +++ b/fsck.ocfs2/extent.c
> @@ -459,6 +459,11 @@ errcode_t o2fsck_check_extents(o2fsck_state *ost,
> (uint64_t)di->i_blkno,
> (uint64_t)di->i_size, expected)) {
> di->i_size = expected;
> + /* Reset i_dx_root for later re-build */
> + if (di->i_dyn_features& OCFS2_INDEXED_DIR_FL) {
> + di->i_dx_root = 0ULL;
> + di->i_dyn_features&= ~OCFS2_INDEXED_DIR_FL;
> + }
Shouldn't we be calling ocfs2_dx_dir_truncate()?
Mark?
> changed = 1;
> }
> }
> diff --git a/fsck.ocfs2/pass2.c b/fsck.ocfs2/pass2.c
> index 4b43a22..d1133b2 100644
> --- a/fsck.ocfs2/pass2.c
> +++ b/fsck.ocfs2/pass2.c
> @@ -732,6 +732,13 @@ static unsigned
> pass2_dir_block_iterate(o2fsck_dirblock_entry *dbe,
> verbosef("dir inode %"PRIu64" i_size %"PRIu64"\n",
> dbe->e_ino, (uint64_t)di->i_size);
>
> + /* Set the flag for index rebuilding */
> + if (ocfs2_supports_indexed_dirs(OCFS2_RAW_SB(dd->fs->fs_super))
> + && !(di->i_dyn_features& OCFS2_INLINE_DATA_FL)
> + && !(di->i_dyn_features& OCFS2_INDEXED_DIR_FL)) {
> + ret_flags |= OCFS2_DIRENT_CHANGED;
> + }
> +
> }
>
> verbosef("dir block %"PRIu64" block offs %"PRIu64" in ino\n",
> @@ -896,9 +903,9 @@ next:
> goto out;
> }
>
> - if (ocfs2_supports_indexed_dirs(OCFS2_RAW_SB(dd->fs->fs_super))&&
> - !(di->i_dyn_features& OCFS2_INLINE_DATA_FL)&&
> - (di->i_dyn_features& OCFS2_INDEXED_DIR_FL)) {
> + if (ocfs2_supports_indexed_dirs(OCFS2_RAW_SB(dd->fs->fs_super))
> + && !(di->i_dyn_features& OCFS2_INLINE_DATA_FL)) {
> + di->i_dyn_features |= OCFS2_INDEXED_DIR_FL;
> ret = o2fsck_try_add_reidx_dir(&dd->re_idx_dirs, dbe->e_ino);
> if (ret) {
> com_err(whoami, ret, "while adding block for "
More information about the Ocfs2-tools-devel
mailing list