ocfs2: delay inode update transactions after verifying the input flags
There is no need to start the inode update transactions before/while verifying the input flags. As a refinement, this patch delay the transactions utill the pre-check up is ok. Signed-off-by: Jie Liu <jeff.liu@oracle.com> Acked-by: Joel Becker <jlbec@evilplan.org> Cc: Mark Fasheh <mfasheh@suse.com> Cc: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
@@ -101,13 +101,6 @@ static int ocfs2_set_inode_attr(struct inode *inode, unsigned flags,
|
|||||||
if (!S_ISDIR(inode->i_mode))
|
if (!S_ISDIR(inode->i_mode))
|
||||||
flags &= ~OCFS2_DIRSYNC_FL;
|
flags &= ~OCFS2_DIRSYNC_FL;
|
||||||
|
|
||||||
handle = ocfs2_start_trans(osb, OCFS2_INODE_UPDATE_CREDITS);
|
|
||||||
if (IS_ERR(handle)) {
|
|
||||||
status = PTR_ERR(handle);
|
|
||||||
mlog_errno(status);
|
|
||||||
goto bail_unlock;
|
|
||||||
}
|
|
||||||
|
|
||||||
oldflags = ocfs2_inode->ip_attr;
|
oldflags = ocfs2_inode->ip_attr;
|
||||||
flags = flags & mask;
|
flags = flags & mask;
|
||||||
flags |= oldflags & ~mask;
|
flags |= oldflags & ~mask;
|
||||||
@@ -120,7 +113,14 @@ static int ocfs2_set_inode_attr(struct inode *inode, unsigned flags,
|
|||||||
if ((oldflags & OCFS2_IMMUTABLE_FL) || ((flags ^ oldflags) &
|
if ((oldflags & OCFS2_IMMUTABLE_FL) || ((flags ^ oldflags) &
|
||||||
(OCFS2_APPEND_FL | OCFS2_IMMUTABLE_FL))) {
|
(OCFS2_APPEND_FL | OCFS2_IMMUTABLE_FL))) {
|
||||||
if (!capable(CAP_LINUX_IMMUTABLE))
|
if (!capable(CAP_LINUX_IMMUTABLE))
|
||||||
goto bail_commit;
|
goto bail_unlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
handle = ocfs2_start_trans(osb, OCFS2_INODE_UPDATE_CREDITS);
|
||||||
|
if (IS_ERR(handle)) {
|
||||||
|
status = PTR_ERR(handle);
|
||||||
|
mlog_errno(status);
|
||||||
|
goto bail_unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
ocfs2_inode->ip_attr = flags;
|
ocfs2_inode->ip_attr = flags;
|
||||||
@@ -130,8 +130,8 @@ static int ocfs2_set_inode_attr(struct inode *inode, unsigned flags,
|
|||||||
if (status < 0)
|
if (status < 0)
|
||||||
mlog_errno(status);
|
mlog_errno(status);
|
||||||
|
|
||||||
bail_commit:
|
|
||||||
ocfs2_commit_trans(osb, handle);
|
ocfs2_commit_trans(osb, handle);
|
||||||
|
|
||||||
bail_unlock:
|
bail_unlock:
|
||||||
ocfs2_inode_unlock(inode, 1);
|
ocfs2_inode_unlock(inode, 1);
|
||||||
bail:
|
bail:
|
||||||
|
Reference in New Issue
Block a user