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 <c17818@cray.com>
Change-Id: Idf8a5c3d423707043153892f607cdd54099d9579
Reviewed-by: Alexey Lyashkov <c17817@cray.com>
Reviewed-by: Andriy Skulysh <c17819@cray.com>
Tested-by: Elena Gryaznova <c17455@cray.com>
Reviewed-on: https://es-gerrit.dev.cray.com/156681
Reviewed-on: https://review.whamcloud.com/38069
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
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);
}