From ce75d8f368a506993730da4224f4cfc18c2a0260 Mon Sep 17 00:00:00 2001 From: Nathaniel Clark Date: Wed, 5 Nov 2014 13:05:22 -0500 Subject: [PATCH] LU-3573 osd-zfs: Only advance zap cursor as needed Only advance the zap cursor when ozi_pos is not advanced, otherwise occasionally the a file could get "lost" because the zap_cursor would advance over it before the retrieve happened. Handle '..' like '.' when retrieving ZAP values. Lustre-commit: 0780fde4d415aa1f407ed0094f20f30e6f1b0d3a Lustre-change: http://review.whamcloud.com/12904 Test-Parameters: mdtfilesystemtype=zfs mdsfilesystemtype=zfs ostfilesystemtype=zfs testlist=conf-sanity,conf-sanity,conf-sanity,conf-sanity Signed-off-by: Nathaniel Clark Reviewed-by: Isaac Huang Reviewed-by: Alex Zhuravlev Reviewed-by: Oleg Drokin Change-Id: I916573c70c8828bed6905b5eda9344b4a49b7f11 Reviewed-by: Andreas Dilger Reviewed-on: http://review.whamcloud.com/13357 Tested-by: Jenkins Tested-by: Maloo --- lustre/osd-zfs/osd_index.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lustre/osd-zfs/osd_index.c b/lustre/osd-zfs/osd_index.c index 29df71d..e347cfc 100644 --- a/lustre/osd-zfs/osd_index.c +++ b/lustre/osd-zfs/osd_index.c @@ -796,6 +796,8 @@ static int osd_dir_it_next(const struct lu_env *env, struct dt_it *di) zap_attribute_t *za = &osd_oti_get(env)->oti_za; int rc; + ENTRY; + /* temp. storage should be enough for any key supported by ZFS */ CLASSERT(sizeof(za->za_name) <= sizeof(it->ozi_name)); @@ -808,9 +810,10 @@ static int osd_dir_it_next(const struct lu_env *env, struct dt_it *di) it->ozi_pos++; if (it->ozi_pos <=2) RETURN(0); - } - zap_cursor_advance(it->ozi_zc); + } else { + zap_cursor_advance(it->ozi_zc); + } /* * According to current API we need to return error if its last entry. @@ -925,14 +928,11 @@ static int osd_dir_it_rec(const struct lu_env *env, const struct dt_it *di, osd_it_append_attrs(lde, attr, 2, IFTODT(S_IFDIR)); lde->lde_reclen = cpu_to_le16(lu_dirent_calc_size(2, attr)); rc = osd_find_parent_fid(env, &it->ozi_obj->oo_dt, &lde->lde_fid); - /* - * early Orion code was not setting LinkEA, so it's possible - * some setups still have objects with no LinkEA set. - * but at that time .. was a real record in the directory - * so we should try to lookup .. in ZAP - */ - if (rc != -ENOENT) - GOTO(out, rc); + + /* ENOENT happens at the root of filesystem so ignore it */ + if (rc == -ENOENT) + rc = 0; + GOTO(out, rc); } LASSERT(lde); -- 1.8.3.1