This source file includes following definitions.
- xfs_trans_ijoin
- xfs_trans_ichgtime
- xfs_trans_log_inode
- xfs_trans_roll_inode
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
24 void
25 xfs_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
51 void
52 xfs_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.t_sec = (int32_t)tv.tv_sec;
71 ip->i_d.di_crtime.t_nsec = (int32_t)tv.tv_nsec;
72 }
73 }
74
75
76
77
78
79
80
81
82
83
84 void
85 xfs_trans_log_inode(
86 xfs_trans_t *tp,
87 xfs_inode_t *ip,
88 uint flags)
89 {
90 struct inode *inode = VFS_I(ip);
91
92 ASSERT(ip->i_itemp != NULL);
93 ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
94
95
96
97
98
99
100
101 if (inode->i_state & (I_DIRTY_TIME | I_DIRTY_TIME_EXPIRED)) {
102 spin_lock(&inode->i_lock);
103 inode->i_state &= ~(I_DIRTY_TIME | I_DIRTY_TIME_EXPIRED);
104 spin_unlock(&inode->i_lock);
105 }
106
107
108
109
110
111
112
113
114 ip->i_itemp->ili_fsync_fields |= flags;
115
116
117
118
119
120
121
122
123
124
125 if (!test_and_set_bit(XFS_LI_DIRTY, &ip->i_itemp->ili_item.li_flags) &&
126 IS_I_VERSION(VFS_I(ip))) {
127 if (inode_maybe_inc_iversion(VFS_I(ip), flags & XFS_ILOG_CORE))
128 flags |= XFS_ILOG_CORE;
129 }
130
131 tp->t_flags |= XFS_TRANS_DIRTY;
132
133
134
135
136
137
138
139
140 flags |= ip->i_itemp->ili_last_fields;
141 ip->i_itemp->ili_fields |= flags;
142 }
143
144 int
145 xfs_trans_roll_inode(
146 struct xfs_trans **tpp,
147 struct xfs_inode *ip)
148 {
149 int error;
150
151 xfs_trans_log_inode(*tpp, ip, XFS_ILOG_CORE);
152 error = xfs_trans_roll(tpp);
153 if (!error)
154 xfs_trans_ijoin(*tpp, ip, 0);
155 return error;
156 }