On 18/3/31 01:42, Ashish Samant wrote: > While reflinking an inode, we create a new inode in orphan directory, then > take EX lock on it, reflink the original inode to orphan inode and release > EX lock. Once the lock is released another node might request it in PR mode > which causes downconvert of the lock to PR mode. > > Later we attempt to initialize security acl for the orphan inode and move > it to the reflink destination. However, while doing this we dont take EX > lock on the inode. So effectively, we are doing this and accessing the > journal for this inode while holding PR lock. While accessing the journal, > we make > > ci->ci_last_trans = journal->j_trans_id > > At this point, if there is another downconvert request on this inode from > another node (PR->NL), we will trip on the following condition in > ocfs2_ci_checkpointed() > > BUG_ON(lockres->l_level != DLM_LOCK_EX && !checkpointed); > > because we hold the lock in PR mode and journal->j_trans_id is not greater > than ci_last_trans for the inode. > > Fix this by taking orphan inode cluster lock in EX mode before > initializing security and moving orphan inode to reflink destination. > Use the __tracker variant while taking inode lock to avoid recursive > locking in the ocfs2_init_security_and_acl() call chain. > > Signed-off-by: Ashish Samant <ashish.sam...@oracle.com>
Looks good. Reviewed-by: Joseph Qi <jiangqi...@gmail.com> _______________________________________________ Ocfs2-devel mailing list Ocfs2-devel@oss.oracle.com https://oss.oracle.com/mailman/listinfo/ocfs2-devel