diff options
-rw-r--r-- | fs/ocfs2/refcounttree.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/fs/ocfs2/refcounttree.c b/fs/ocfs2/refcounttree.c index 01c6b3894406..7869622af22a 100644 --- a/fs/ocfs2/refcounttree.c +++ b/fs/ocfs2/refcounttree.c | |||
@@ -4250,10 +4250,11 @@ out: | |||
4250 | static int ocfs2_reflink(struct dentry *old_dentry, struct inode *dir, | 4250 | static int ocfs2_reflink(struct dentry *old_dentry, struct inode *dir, |
4251 | struct dentry *new_dentry, bool preserve) | 4251 | struct dentry *new_dentry, bool preserve) |
4252 | { | 4252 | { |
4253 | int error; | 4253 | int error, had_lock; |
4254 | struct inode *inode = d_inode(old_dentry); | 4254 | struct inode *inode = d_inode(old_dentry); |
4255 | struct buffer_head *old_bh = NULL; | 4255 | struct buffer_head *old_bh = NULL; |
4256 | struct inode *new_orphan_inode = NULL; | 4256 | struct inode *new_orphan_inode = NULL; |
4257 | struct ocfs2_lock_holder oh; | ||
4257 | 4258 | ||
4258 | if (!ocfs2_refcount_tree(OCFS2_SB(inode->i_sb))) | 4259 | if (!ocfs2_refcount_tree(OCFS2_SB(inode->i_sb))) |
4259 | return -EOPNOTSUPP; | 4260 | return -EOPNOTSUPP; |
@@ -4295,6 +4296,14 @@ static int ocfs2_reflink(struct dentry *old_dentry, struct inode *dir, | |||
4295 | goto out; | 4296 | goto out; |
4296 | } | 4297 | } |
4297 | 4298 | ||
4299 | had_lock = ocfs2_inode_lock_tracker(new_orphan_inode, NULL, 1, | ||
4300 | &oh); | ||
4301 | if (had_lock < 0) { | ||
4302 | error = had_lock; | ||
4303 | mlog_errno(error); | ||
4304 | goto out; | ||
4305 | } | ||
4306 | |||
4298 | /* If the security isn't preserved, we need to re-initialize them. */ | 4307 | /* If the security isn't preserved, we need to re-initialize them. */ |
4299 | if (!preserve) { | 4308 | if (!preserve) { |
4300 | error = ocfs2_init_security_and_acl(dir, new_orphan_inode, | 4309 | error = ocfs2_init_security_and_acl(dir, new_orphan_inode, |
@@ -4302,14 +4311,15 @@ static int ocfs2_reflink(struct dentry *old_dentry, struct inode *dir, | |||
4302 | if (error) | 4311 | if (error) |
4303 | mlog_errno(error); | 4312 | mlog_errno(error); |
4304 | } | 4313 | } |
4305 | out: | ||
4306 | if (!error) { | 4314 | if (!error) { |
4307 | error = ocfs2_mv_orphaned_inode_to_new(dir, new_orphan_inode, | 4315 | error = ocfs2_mv_orphaned_inode_to_new(dir, new_orphan_inode, |
4308 | new_dentry); | 4316 | new_dentry); |
4309 | if (error) | 4317 | if (error) |
4310 | mlog_errno(error); | 4318 | mlog_errno(error); |
4311 | } | 4319 | } |
4320 | ocfs2_inode_unlock_tracker(new_orphan_inode, 1, &oh, had_lock); | ||
4312 | 4321 | ||
4322 | out: | ||
4313 | if (new_orphan_inode) { | 4323 | if (new_orphan_inode) { |
4314 | /* | 4324 | /* |
4315 | * We need to open_unlock the inode no matter whether we | 4325 | * We need to open_unlock the inode no matter whether we |