From 6e2c8ef7267694125d87cfc8232dc36034de8b01 Mon Sep 17 00:00:00 2001 From: Vitaly Fertman Date: Wed, 25 Mar 2020 15:55:53 +0300 Subject: [PATCH] LU-13388 lod: unprotected access to component entries a race is possible between setattr, which may want to traverse the component set, and the layout_change, which may change the component set if SEL is enabled. Take an UPDATE lock on layout write operation. HPE-bug-id: LUS-8146 Signed-off-by: Vitaly Fertman Change-Id: Idf8a5c3d423707043153892f607cdd54099d9579 Reviewed-by: Alexey Lyashkov Reviewed-by: Andriy Skulysh Tested-by: Elena Gryaznova Reviewed-on: https://es-gerrit.dev.cray.com/156681 Reviewed-on: https://review.whamcloud.com/38069 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Oleg Drokin --- lustre/mdt/mdt_handler.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index bfec8e1..4deb40e 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -1498,10 +1498,15 @@ int mdt_layout_change(struct mdt_thread_info *info, struct mdt_object *obj, if (rc > 0) { /* not resent */ + __u64 lockpart = MDS_INODELOCK_LAYOUT; + + /* take layout lock to prepare layout change */ + if (layout->mlc_opc == MD_LAYOUT_WRITE) + lockpart |= MDS_INODELOCK_UPDATE; + mdt_lock_handle_init(lhc); mdt_lock_reg_init(lhc, LCK_EX); - rc = mdt_reint_object_lock(info, obj, lhc, MDS_INODELOCK_LAYOUT, - false); + rc = mdt_reint_object_lock(info, obj, lhc, lockpart, false); if (rc) RETURN(rc); } -- 1.8.3.1