1
2
3
4
5
6#include "xfs.h"
7#include "xfs_fs.h"
8#include "xfs_shared.h"
9#include "xfs_format.h"
10#include "xfs_log_format.h"
11#include "xfs_inode.h"
12#include "xfs_trans.h"
13#include "xfs_trans_priv.h"
14#include "xfs_inode_item.h"
15
16#include <linux/iversion.h>
17
18
19
20
21
22
23
24void
25xfs_trans_ijoin(
26 struct xfs_trans *tp,
27 struct xfs_inode *ip,
28 uint lock_flags)
29{
30 xfs_inode_log_item_t *iip;
31
32 ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
33 if (ip->i_itemp == NULL)
34 xfs_inode_item_init(ip, ip->i_mount);
35 iip = ip->i_itemp;
36
37 ASSERT(iip->ili_lock_flags == 0);
38 iip->ili_lock_flags = lock_flags;
39
40
41
42
43 xfs_trans_add_item(tp, &iip->ili_item);
44}
45
46
47
48
49
50
51void
52xfs_trans_ichgtime(
53 struct xfs_trans *tp,
54 struct xfs_inode *ip,
55 int flags)
56{
57 struct inode *inode = VFS_I(ip);
58 struct timespec64 tv;
59
60 ASSERT(tp);
61 ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
62
63 tv = current_time(inode);
64
65 if (flags & XFS_ICHGTIME_MOD)
66 inode->i_mtime = tv;
67 if (flags & XFS_ICHGTIME_CHG)
68 inode->i_ctime = tv;
69 if (flags & XFS_ICHGTIME_CREATE)
70 ip->i_d.di_crtime = tv;
71}
72
73
74
75
76
77
78
79
80
81
82void
83xfs_trans_log_inode(
84 xfs_trans_t *tp,
85 xfs_inode_t *ip,
86 uint flags)
87{
88 struct inode *inode = VFS_I(ip);
89
90 ASSERT(ip->i_itemp != NULL);
91 ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
92
93
94
95
96
97
98
99 if (inode->i_state & I_DIRTY_TIME) {
100 spin_lock(&inode->i_lock);
101 inode->i_state &= ~I_DIRTY_TIME;
102 spin_unlock(&inode->i_lock);
103 }
104
105
106
107
108
109
110
111
112 ip->i_itemp->ili_fsync_fields |= flags;
113
114
115
116
117
118
119
120
121
122
123 if (!test_and_set_bit(XFS_LI_DIRTY, &ip->i_itemp->ili_item.li_flags) &&
124 IS_I_VERSION(VFS_I(ip))) {
125 if (inode_maybe_inc_iversion(VFS_I(ip), flags & XFS_ILOG_CORE))
126 flags |= XFS_ILOG_CORE;
127 }
128
129 tp->t_flags |= XFS_TRANS_DIRTY;
130
131
132
133
134
135
136
137
138 flags |= ip->i_itemp->ili_last_fields;
139 ip->i_itemp->ili_fields |= flags;
140}
141
142int
143xfs_trans_roll_inode(
144 struct xfs_trans **tpp,
145 struct xfs_inode *ip)
146{
147 int error;
148
149 xfs_trans_log_inode(*tpp, ip, XFS_ILOG_CORE);
150 error = xfs_trans_roll(tpp);
151 if (!error)
152 xfs_trans_ijoin(*tpp, ip, 0);
153 return error;
154}
155