From 0920f54a0866f77b49afd2308b798d4db3b69802 Mon Sep 17 00:00:00 2001 From: Nikitas Angelinas Date: Fri, 31 Aug 2018 11:04:18 +0300 Subject: [PATCH] LU-10818 obdecho: don't set ma_need in echo_attr_get_complex() echo_attr_get_complex() copies ma_need to a local variable, masks MA_* values other than MA_INODE if MA_INODE is set in ma_need, and restores the saved value of ma_need before the function exits. This does not seem to be useful, and triggers an assertion in echo_big_lmm_get() when MA_LOV and/or MA_LMV is set in ma_need. Signed-off-by: Nikitas Angelinas Cray-bug-id: LUS-6252 Lustre-change: https://review.whamcloud.com/33097 Lustre-commit: 40f70cd4cb1bb33c754607862dece7c6c1c30d38 Reviewed-by: Patrick Farrell Reviewed-by: Andrew Perepechko Change-Id: I3f5a01b57bdd83937f19fd1fa392b53f7b316455 Reviewed-by: Andreas Dilger Reviewed-by: Lai Siyao Signed-off-by: Minh Diep Reviewed-on: https://review.whamcloud.com/33976 Tested-by: Jenkins Tested-by: Maloo --- lustre/obdecho/echo_client.c | 45 ++++++++++++++++++++------------------------ 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/lustre/obdecho/echo_client.c b/lustre/obdecho/echo_client.c index 1b558f7..ffa529a 100644 --- a/lustre/obdecho/echo_client.c +++ b/lustre/obdecho/echo_client.c @@ -1449,45 +1449,41 @@ static int echo_attr_get_complex(const struct lu_env *env, { struct echo_thread_info *info = echo_env_info(env); struct lu_buf *buf = &info->eti_buf; - umode_t mode = lu_object_attr(&next->mo_lu); - int need = ma->ma_need; + umode_t mode = lu_object_attr(&next->mo_lu); int rc = 0, rc2; ENTRY; ma->ma_valid = 0; - if (need & MA_INODE) { - ma->ma_need = MA_INODE; + if (ma->ma_need & MA_INODE) { rc = mo_attr_get(env, next, ma); if (rc) GOTO(out, rc); ma->ma_valid |= MA_INODE; } - if (need & MA_LOV) { - if (S_ISREG(mode) || S_ISDIR(mode)) { - LASSERT(ma->ma_lmm_size > 0); - buf->lb_buf = ma->ma_lmm; - buf->lb_len = ma->ma_lmm_size; - rc2 = mo_xattr_get(env, next, buf, XATTR_NAME_LOV); - if (rc2 > 0) { - ma->ma_lmm_size = rc2; - ma->ma_valid |= MA_LOV; - } else if (rc2 == -ENODATA) { - /* no LOV EA */ - ma->ma_lmm_size = 0; - } else if (rc2 == -ERANGE) { - rc2 = echo_big_lmm_get(env, next, ma); - if (rc2 < 0) - GOTO(out, rc = rc2); - } else { + if ((ma->ma_need & MA_LOV) && (S_ISREG(mode) || S_ISDIR(mode))) { + LASSERT(ma->ma_lmm_size > 0); + buf->lb_buf = ma->ma_lmm; + buf->lb_len = ma->ma_lmm_size; + rc2 = mo_xattr_get(env, next, buf, XATTR_NAME_LOV); + if (rc2 > 0) { + ma->ma_lmm_size = rc2; + ma->ma_valid |= MA_LOV; + } else if (rc2 == -ENODATA) { + /* no LOV EA */ + ma->ma_lmm_size = 0; + } else if (rc2 == -ERANGE) { + rc2 = echo_big_lmm_get(env, next, ma); + if (rc2 < 0) GOTO(out, rc = rc2); - } + } else { + GOTO(out, rc = rc2); } } - if (need & MA_LMV && S_ISDIR(mode)) { + if ((ma->ma_need & MA_LMV) && S_ISDIR(mode)) { LASSERT(ma->ma_lmm_size > 0); buf->lb_buf = ma->ma_lmm; buf->lb_len = ma->ma_lmm_size; @@ -1508,7 +1504,7 @@ static int echo_attr_get_complex(const struct lu_env *env, } #ifdef CONFIG_FS_POSIX_ACL - if (need & MA_ACL_DEF && S_ISDIR(mode)) { + if ((ma->ma_need & MA_ACL_DEF) && S_ISDIR(mode)) { buf->lb_buf = ma->ma_acl; buf->lb_len = ma->ma_acl_size; rc2 = mo_xattr_get(env, next, buf, XATTR_NAME_ACL_DEFAULT); @@ -1524,7 +1520,6 @@ static int echo_attr_get_complex(const struct lu_env *env, } #endif out: - ma->ma_need = need; CDEBUG(D_INODE, "after getattr rc = %d, ma_valid = %#llx ma_lmm=%p\n", rc, ma->ma_valid, ma->ma_lmm); RETURN(rc); -- 1.8.3.1