diff options
author | Tao Ma <tao.ma@oracle.com> | 2008-12-04 17:20:55 -0500 |
---|---|---|
committer | Mark Fasheh <mfasheh@suse.com> | 2009-01-05 11:40:36 -0500 |
commit | 4b3f6209bf9eec46fe5ebb168718fef5c443c157 (patch) | |
tree | d8e7a430678736be6facd135b58a77cb7b07b3ab /fs/ocfs2 | |
parent | 71d548a6af36fe98c95fbd0522147f842bd5f054 (diff) |
ocfs2/xattr: Always updating ctime during xattr set.
In xattr set, we should always update ctime if the operation goes
sucessfully. The old one mistakenly put it in ocfs2_xattr_set_entry
which is only called when we set xattr in inode or xattr block. The
side benefit is that it resolve the bug 1052 since in that scenario,
ocfs2_calc_xattr_set_need only calc out the xattr set credits while
ocfs2_xattr_set_entry update the inode also which isn't concerned with
the process of xattr set.
Signed-off-by: Tao Ma <tao.ma@oracle.com>
Signed-off-by: Mark Fasheh <mfasheh@suse.com>
Diffstat (limited to 'fs/ocfs2')
-rw-r--r-- | fs/ocfs2/xattr.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/fs/ocfs2/xattr.c b/fs/ocfs2/xattr.c index 93a1ab4fe1da..3e2e92d70594 100644 --- a/fs/ocfs2/xattr.c +++ b/fs/ocfs2/xattr.c | |||
@@ -1651,10 +1651,6 @@ static int ocfs2_xattr_set_entry(struct inode *inode, | |||
1651 | oi->ip_dyn_features |= flag; | 1651 | oi->ip_dyn_features |= flag; |
1652 | di->i_dyn_features = cpu_to_le16(oi->ip_dyn_features); | 1652 | di->i_dyn_features = cpu_to_le16(oi->ip_dyn_features); |
1653 | spin_unlock(&oi->ip_lock); | 1653 | spin_unlock(&oi->ip_lock); |
1654 | /* Update inode ctime */ | ||
1655 | inode->i_ctime = CURRENT_TIME; | ||
1656 | di->i_ctime = cpu_to_le64(inode->i_ctime.tv_sec); | ||
1657 | di->i_ctime_nsec = cpu_to_le32(inode->i_ctime.tv_nsec); | ||
1658 | 1654 | ||
1659 | ret = ocfs2_journal_dirty(handle, xs->inode_bh); | 1655 | ret = ocfs2_journal_dirty(handle, xs->inode_bh); |
1660 | if (ret < 0) | 1656 | if (ret < 0) |
@@ -2574,6 +2570,20 @@ static int __ocfs2_xattr_set_handle(struct inode *inode, | |||
2574 | } | 2570 | } |
2575 | } | 2571 | } |
2576 | 2572 | ||
2573 | if (!ret) { | ||
2574 | /* Update inode ctime. */ | ||
2575 | ret = ocfs2_journal_access(ctxt->handle, inode, xis->inode_bh, | ||
2576 | OCFS2_JOURNAL_ACCESS_WRITE); | ||
2577 | if (ret) { | ||
2578 | mlog_errno(ret); | ||
2579 | goto out; | ||
2580 | } | ||
2581 | |||
2582 | inode->i_ctime = CURRENT_TIME; | ||
2583 | di->i_ctime = cpu_to_le64(inode->i_ctime.tv_sec); | ||
2584 | di->i_ctime_nsec = cpu_to_le32(inode->i_ctime.tv_nsec); | ||
2585 | ocfs2_journal_dirty(ctxt->handle, xis->inode_bh); | ||
2586 | } | ||
2577 | out: | 2587 | out: |
2578 | return ret; | 2588 | return ret; |
2579 | } | 2589 | } |
@@ -2750,6 +2760,8 @@ int ocfs2_xattr_set(struct inode *inode, | |||
2750 | goto cleanup; | 2760 | goto cleanup; |
2751 | } | 2761 | } |
2752 | 2762 | ||
2763 | /* we need to update inode's ctime field, so add credit for it. */ | ||
2764 | credits += OCFS2_INODE_UPDATE_CREDITS; | ||
2753 | ctxt.handle = ocfs2_start_trans(osb, credits); | 2765 | ctxt.handle = ocfs2_start_trans(osb, credits); |
2754 | if (IS_ERR(ctxt.handle)) { | 2766 | if (IS_ERR(ctxt.handle)) { |
2755 | ret = PTR_ERR(ctxt.handle); | 2767 | ret = PTR_ERR(ctxt.handle); |