From 49ab1509427738607c8a0be1f7bb94a952c98ea3 Mon Sep 17 00:00:00 2001 From: Lai Siyao Date: Sun, 27 Sep 2020 14:36:57 +0800 Subject: [PATCH] LU-14004 llite: default lsm update may memory leak ll_update_default_lsm_md() should check whether lli_default_lsm_md is set before setting it to the data from lustre_md, and if it's set, release the old data to avoid memory leak. Lustre-change: https://review.whamcloud.com/40103 Lustre-commit: cd2ad336177f8f3130de264709dc326349a22b23 Signed-off-by: Lai Siyao Change-Id: I9c8434c5d62f9fb751788031d6769fd49427c371 Reviewed-by: Andreas Dilger Reviewed-by: Bobi Jam Reviewed-by: Oleg Drokin Reviewed-on: https://review.whamcloud.com/44454 Tested-by: jenkins Tested-by: Maloo --- lustre/llite/llite_lib.c | 35 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/lustre/llite/llite_lib.c b/lustre/llite/llite_lib.c index e2b9741..0b22183 100644 --- a/lustre/llite/llite_lib.c +++ b/lustre/llite/llite_lib.c @@ -1497,30 +1497,27 @@ static void ll_update_default_lsm_md(struct inode *inode, struct lustre_md *md) } up_write(&lli->lli_lsm_sem); } - } else if (lli->lli_default_lsm_md) { - /* update default lsm if it changes */ + return; + } + + if (lli->lli_default_lsm_md) { + /* do nonthing if default lsm isn't changed */ down_read(&lli->lli_lsm_sem); if (lli->lli_default_lsm_md && - !lsm_md_eq(lli->lli_default_lsm_md, md->default_lmv)) { - up_read(&lli->lli_lsm_sem); - down_write(&lli->lli_lsm_sem); - if (lli->lli_default_lsm_md) - lmv_free_memmd(lli->lli_default_lsm_md); - lli->lli_default_lsm_md = md->default_lmv; - lsm_md_dump(D_INODE, md->default_lmv); - md->default_lmv = NULL; - up_write(&lli->lli_lsm_sem); - } else { + lsm_md_eq(lli->lli_default_lsm_md, md->default_lmv)) { up_read(&lli->lli_lsm_sem); + return; } - } else { - /* init default lsm */ - down_write(&lli->lli_lsm_sem); - lli->lli_default_lsm_md = md->default_lmv; - lsm_md_dump(D_INODE, md->default_lmv); - md->default_lmv = NULL; - up_write(&lli->lli_lsm_sem); + up_read(&lli->lli_lsm_sem); } + + down_write(&lli->lli_lsm_sem); + if (lli->lli_default_lsm_md) + lmv_free_memmd(lli->lli_default_lsm_md); + lli->lli_default_lsm_md = md->default_lmv; + lsm_md_dump(D_INODE, md->default_lmv); + md->default_lmv = NULL; + up_write(&lli->lli_lsm_sem); } static int ll_update_lsm_md(struct inode *inode, struct lustre_md *md) -- 1.8.3.1