Junxiao Bi
2022-Jun-07 17:12 UTC
[Ocfs2-devel] [PATCH V2] ocfs2: kill EBUSY from dlmfs_evict_inode
When unlink a dlmfs, first it will invoke dlmfs_unlink(), and then invoke
dlmfs_evict_inode(), user_dlm_destroy_lock() is invoked in both places,
the second one from dlmfs_evict_inode() will get EBUSY error because
USER_LOCK_IN_TEARDOWN is already set in lockres. This doesn't affect
any function, just the error log is annoying.
Signed-off-by: Junxiao Bi <junxiao.bi at oracle.com>
---
V2 <- V1:
- s/anonying/annoying in patch log.
- s/destroyed/teardown in dlmfs_evict_inode()
fs/ocfs2/dlmfs/dlmfs.c | 14 +++++++++++---
1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/fs/ocfs2/dlmfs/dlmfs.c b/fs/ocfs2/dlmfs/dlmfs.c
index e360543ad7e7..8b2020f92b5f 100644
--- a/fs/ocfs2/dlmfs/dlmfs.c
+++ b/fs/ocfs2/dlmfs/dlmfs.c
@@ -296,17 +296,25 @@ static void dlmfs_evict_inode(struct inode *inode)
{
int status;
struct dlmfs_inode_private *ip;
+ struct user_lock_res *lockres;
+ int teardown;
clear_inode(inode);
mlog(0, "inode %lu\n", inode->i_ino);
ip = DLMFS_I(inode);
+ lockres = &ip->ip_lockres;
if (S_ISREG(inode->i_mode)) {
- status = user_dlm_destroy_lock(&ip->ip_lockres);
- if (status < 0)
- mlog_errno(status);
+ spin_lock(&lockres->l_lock);
+ teardown = !!(lockres->l_flags & USER_LOCK_IN_TEARDOWN);
+ spin_unlock(&lockres->l_lock);
+ if (!teardown) {
+ status = user_dlm_destroy_lock(lockres);
+ if (status < 0)
+ mlog_errno(status);
+ }
iput(ip->ip_parent);
goto clear_fields;
}
--
2.24.3 (Apple Git-128)
Joseph Qi
2022-Jun-08 02:21 UTC
[Ocfs2-devel] [PATCH V2] ocfs2: kill EBUSY from dlmfs_evict_inode
On 6/8/22 1:12 AM, Junxiao Bi wrote:> When unlink a dlmfs, first it will invoke dlmfs_unlink(), and then invoke > dlmfs_evict_inode(), user_dlm_destroy_lock() is invoked in both places, > the second one from dlmfs_evict_inode() will get EBUSY error because > USER_LOCK_IN_TEARDOWN is already set in lockres. This doesn't affect > any function, just the error log is annoying. > > Signed-off-by: Junxiao Bi <junxiao.bi at oracle.com>Reviewed-by: Joseph Qi <joseph.qi at linux.alibaba.com>> --- > V2 <- V1: > - s/anonying/annoying in patch log. > - s/destroyed/teardown in dlmfs_evict_inode() > > fs/ocfs2/dlmfs/dlmfs.c | 14 +++++++++++--- > 1 file changed, 11 insertions(+), 3 deletions(-) > > diff --git a/fs/ocfs2/dlmfs/dlmfs.c b/fs/ocfs2/dlmfs/dlmfs.c > index e360543ad7e7..8b2020f92b5f 100644 > --- a/fs/ocfs2/dlmfs/dlmfs.c > +++ b/fs/ocfs2/dlmfs/dlmfs.c > @@ -296,17 +296,25 @@ static void dlmfs_evict_inode(struct inode *inode) > { > int status; > struct dlmfs_inode_private *ip; > + struct user_lock_res *lockres; > + int teardown; > > clear_inode(inode); > > mlog(0, "inode %lu\n", inode->i_ino); > > ip = DLMFS_I(inode); > + lockres = &ip->ip_lockres; > > if (S_ISREG(inode->i_mode)) { > - status = user_dlm_destroy_lock(&ip->ip_lockres); > - if (status < 0) > - mlog_errno(status); > + spin_lock(&lockres->l_lock); > + teardown = !!(lockres->l_flags & USER_LOCK_IN_TEARDOWN); > + spin_unlock(&lockres->l_lock); > + if (!teardown) { > + status = user_dlm_destroy_lock(lockres); > + if (status < 0) > + mlog_errno(status); > + } > iput(ip->ip_parent); > goto clear_fields; > }