Whamcloud - gitweb
LU-14004 llite: default lsm update may memory leak 03/40103/5
authorLai Siyao <lai.siyao@whamcloud.com>
Sun, 27 Sep 2020 06:36:57 +0000 (14:36 +0800)
committerOleg Drokin <green@whamcloud.com>
Thu, 27 May 2021 18:17:30 +0000 (18:17 +0000)
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.

Signed-off-by: Lai Siyao <lai.siyao@whamcloud.com>
Change-Id: I9c8434c5d62f9fb751788031d6769fd49427c371
Reviewed-on: https://review.whamcloud.com/40103
Tested-by: jenkins <devops@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Bobi Jam <bobijam@hotmail.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/llite/llite_lib.c

index 2b0bd62..62a3faa 100644 (file)
@@ -1588,30 +1588,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)