blob: e15129647e00c97143dcfd5b40cf376e3fd8d20f [file] [log] [blame]
Dave Chinner0b61f8a2018-06-05 19:42:14 -07001// SPDX-License-Identifier: GPL-2.0
Linus Torvalds1da177e2005-04-16 15:20:36 -07002/*
Nathan Scott7b718762005-11-02 14:58:39 +11003 * Copyright (c) 2000,2005 Silicon Graphics, Inc.
4 * All Rights Reserved.
Linus Torvalds1da177e2005-04-16 15:20:36 -07005 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07006#include "xfs.h"
Nathan Scotta844f452005-11-02 14:38:42 +11007#include "xfs_fs.h"
Dave Chinner70a98832013-10-23 10:36:05 +11008#include "xfs_shared.h"
Dave Chinnera4fbe6a2013-10-23 10:51:50 +11009#include "xfs_format.h"
Dave Chinner239880e2013-10-23 10:50:10 +110010#include "xfs_log_format.h"
Dave Chinner298f7be2020-06-29 14:49:15 -070011#include "xfs_trans_resv.h"
12#include "xfs_mount.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070013#include "xfs_inode.h"
Dave Chinner239880e2013-10-23 10:50:10 +110014#include "xfs_trans.h"
Nathan Scotta844f452005-11-02 14:38:42 +110015#include "xfs_trans_priv.h"
16#include "xfs_inode_item.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070017
Jeff Laytonf0e28282017-12-11 06:35:19 -050018#include <linux/iversion.h>
19
Linus Torvalds1da177e2005-04-16 15:20:36 -070020/*
Christoph Hellwig898621d2010-06-24 11:36:58 +100021 * Add a locked inode to the transaction.
22 *
23 * The inode must be locked, and it cannot be associated with any transaction.
Christoph Hellwigddc34152011-09-19 15:00:54 +000024 * If lock_flags is non-zero the inode will be unlocked on transaction commit.
Linus Torvalds1da177e2005-04-16 15:20:36 -070025 */
26void
27xfs_trans_ijoin(
Christoph Hellwig898621d2010-06-24 11:36:58 +100028 struct xfs_trans *tp,
Christoph Hellwigddc34152011-09-19 15:00:54 +000029 struct xfs_inode *ip,
30 uint lock_flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -070031{
Christoph Hellwigfd9cbe52020-04-30 12:52:19 -070032 struct xfs_inode_log_item *iip;
Linus Torvalds1da177e2005-04-16 15:20:36 -070033
Christoph Hellwig579aa9c2008-04-22 17:34:00 +100034 ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
Linus Torvalds1da177e2005-04-16 15:20:36 -070035 if (ip->i_itemp == NULL)
36 xfs_inode_item_init(ip, ip->i_mount);
37 iip = ip->i_itemp;
Christoph Hellwigddc34152011-09-19 15:00:54 +000038
Christoph Hellwig898621d2010-06-24 11:36:58 +100039 ASSERT(iip->ili_lock_flags == 0);
Christoph Hellwigddc34152011-09-19 15:00:54 +000040 iip->ili_lock_flags = lock_flags;
Dave Chinner96355d5a2020-06-29 14:48:45 -070041 ASSERT(!xfs_iflags_test(ip, XFS_ISTALE));
Linus Torvalds1da177e2005-04-16 15:20:36 -070042
43 /*
44 * Get a log_item_desc to point at the new item.
45 */
Christoph Hellwige98c4142010-06-23 18:11:15 +100046 xfs_trans_add_item(tp, &iip->ili_item);
Linus Torvalds1da177e2005-04-16 15:20:36 -070047}
48
Linus Torvalds1da177e2005-04-16 15:20:36 -070049/*
Dave Chinnerdcd79a12010-09-28 12:27:25 +100050 * Transactional inode timestamp update. Requires the inode to be locked and
51 * joined to the transaction supplied. Relies on the transaction subsystem to
52 * track dirty state and update/writeback the inode accordingly.
53 */
54void
55xfs_trans_ichgtime(
56 struct xfs_trans *tp,
57 struct xfs_inode *ip,
58 int flags)
59{
60 struct inode *inode = VFS_I(ip);
Christoph Hellwig8d2d8782019-11-12 08:20:42 -080061 struct timespec64 tv;
Dave Chinnerdcd79a12010-09-28 12:27:25 +100062
63 ASSERT(tp);
64 ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
Dave Chinnerdcd79a12010-09-28 12:27:25 +100065
Deepa Dinamanic2050a42016-09-14 07:48:06 -070066 tv = current_time(inode);
Dave Chinnerdcd79a12010-09-28 12:27:25 +100067
Dave Chinner39878482016-02-09 16:54:58 +110068 if (flags & XFS_ICHGTIME_MOD)
Dave Chinnerdcd79a12010-09-28 12:27:25 +100069 inode->i_mtime = tv;
Dave Chinner39878482016-02-09 16:54:58 +110070 if (flags & XFS_ICHGTIME_CHG)
Dave Chinnerdcd79a12010-09-28 12:27:25 +100071 inode->i_ctime = tv;
Christoph Hellwig8d2d8782019-11-12 08:20:42 -080072 if (flags & XFS_ICHGTIME_CREATE)
73 ip->i_d.di_crtime = tv;
Dave Chinnerdcd79a12010-09-28 12:27:25 +100074}
75
76/*
Dave Chinner298f7be2020-06-29 14:49:15 -070077 * This is called to mark the fields indicated in fieldmask as needing to be
78 * logged when the transaction is committed. The inode must already be
79 * associated with the given transaction.
Linus Torvalds1da177e2005-04-16 15:20:36 -070080 *
Dave Chinner298f7be2020-06-29 14:49:15 -070081 * The values for fieldmask are defined in xfs_inode_item.h. We always log all
82 * of the core inode if any of it has changed, and we always log all of the
83 * inline data/extents/b-tree root if any of them has changed.
84 *
85 * Grab and pin the cluster buffer associated with this inode to avoid RMW
86 * cycles at inode writeback time. Avoid the need to add error handling to every
87 * xfs_trans_log_inode() call by shutting down on read error. This will cause
88 * transactions to fail and everything to error out, just like if we return a
89 * read error in a dirty transaction and cancel it.
Linus Torvalds1da177e2005-04-16 15:20:36 -070090 */
91void
92xfs_trans_log_inode(
Dave Chinner1319ebe2020-06-29 14:48:46 -070093 struct xfs_trans *tp,
94 struct xfs_inode *ip,
95 uint flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -070096{
Dave Chinner1319ebe2020-06-29 14:48:46 -070097 struct xfs_inode_log_item *iip = ip->i_itemp;
98 struct inode *inode = VFS_I(ip);
99 uint iversion_flags = 0;
Christoph Hellwigc3b1b132018-03-06 17:04:00 -0800100
Dave Chinner1319ebe2020-06-29 14:48:46 -0700101 ASSERT(iip);
Christoph Hellwig579aa9c2008-04-22 17:34:00 +1000102 ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
Dave Chinner96355d5a2020-06-29 14:48:45 -0700103 ASSERT(!xfs_iflags_test(ip, XFS_ISTALE));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700104
Dave Chinner1319ebe2020-06-29 14:48:46 -0700105 tp->t_flags |= XFS_TRANS_DIRTY;
106
Dave Chinnerdc037ad2013-06-27 16:04:59 +1000107 /*
Christoph Hellwigc3b1b132018-03-06 17:04:00 -0800108 * Don't bother with i_lock for the I_DIRTY_TIME check here, as races
109 * don't matter - we either will need an extra transaction in 24 hours
110 * to log the timestamps, or will clear already cleared fields in the
111 * worst case.
112 */
113 if (inode->i_state & (I_DIRTY_TIME | I_DIRTY_TIME_EXPIRED)) {
114 spin_lock(&inode->i_lock);
115 inode->i_state &= ~(I_DIRTY_TIME | I_DIRTY_TIME_EXPIRED);
116 spin_unlock(&inode->i_lock);
117 }
118
119 /*
Dave Chinnerdc037ad2013-06-27 16:04:59 +1000120 * First time we log the inode in a transaction, bump the inode change
Jeff Laytond17260f2017-12-11 06:35:23 -0500121 * counter if it is configured for this to occur. While we have the
122 * inode locked exclusively for metadata modification, we can usually
123 * avoid setting XFS_ILOG_CORE if no one has queried the value since
124 * the last time it was incremented. If we have XFS_ILOG_CORE already
125 * set however, then go ahead and bump the i_version counter
126 * unconditionally.
Dave Chinnerdc037ad2013-06-27 16:04:59 +1000127 */
Dave Chinner1319ebe2020-06-29 14:48:46 -0700128 if (!test_and_set_bit(XFS_LI_DIRTY, &iip->ili_item.li_flags)) {
129 if (IS_I_VERSION(inode) &&
130 inode_maybe_inc_iversion(inode, flags & XFS_ILOG_CORE))
131 iversion_flags = XFS_ILOG_CORE;
Dave Chinnerdc037ad2013-06-27 16:04:59 +1000132 }
133
Dave Chinner1319ebe2020-06-29 14:48:46 -0700134 /*
135 * Record the specific change for fdatasync optimisation. This allows
136 * fdatasync to skip log forces for inodes that are only timestamp
137 * dirty.
138 */
139 spin_lock(&iip->ili_lock);
140 iip->ili_fsync_fields |= flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700141
Dave Chinner298f7be2020-06-29 14:49:15 -0700142 if (!iip->ili_item.li_buf) {
143 struct xfs_buf *bp;
144 int error;
145
146 /*
147 * We hold the ILOCK here, so this inode is not going to be
148 * flushed while we are here. Further, because there is no
149 * buffer attached to the item, we know that there is no IO in
150 * progress, so nothing will clear the ili_fields while we read
151 * in the buffer. Hence we can safely drop the spin lock and
152 * read the buffer knowing that the state will not change from
153 * here.
154 */
155 spin_unlock(&iip->ili_lock);
156 error = xfs_imap_to_bp(ip->i_mount, tp, &ip->i_imap, NULL,
157 &bp, 0);
158 if (error) {
159 xfs_force_shutdown(ip->i_mount, SHUTDOWN_META_IO_ERROR);
160 return;
161 }
162
163 /*
164 * We need an explicit buffer reference for the log item but
165 * don't want the buffer to remain attached to the transaction.
Dave Chinner48d55e22020-06-29 14:49:18 -0700166 * Hold the buffer but release the transaction reference once
167 * we've attached the inode log item to the buffer log item
168 * list.
Dave Chinner298f7be2020-06-29 14:49:15 -0700169 */
170 xfs_buf_hold(bp);
Dave Chinner298f7be2020-06-29 14:49:15 -0700171 spin_lock(&iip->ili_lock);
172 iip->ili_item.li_buf = bp;
Dave Chinner48d55e22020-06-29 14:49:18 -0700173 bp->b_flags |= _XBF_INODES;
174 list_add_tail(&iip->ili_item.li_bio_list, &bp->b_li_list);
175 xfs_trans_brelse(tp, bp);
Dave Chinner298f7be2020-06-29 14:49:15 -0700176 }
177
Linus Torvalds1da177e2005-04-16 15:20:36 -0700178 /*
Dave Chinner1319ebe2020-06-29 14:48:46 -0700179 * Always OR in the bits from the ili_last_fields field. This is to
180 * coordinate with the xfs_iflush() and xfs_iflush_done() routines in
181 * the eventual clearing of the ili_fields bits. See the big comment in
182 * xfs_iflush() for an explanation of this coordination mechanism.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700183 */
Dave Chinner1319ebe2020-06-29 14:48:46 -0700184 iip->ili_fields |= (flags | iip->ili_last_fields | iversion_flags);
185 spin_unlock(&iip->ili_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700186}
Christoph Hellwig411350d2017-08-28 10:21:03 -0700187
188int
189xfs_trans_roll_inode(
190 struct xfs_trans **tpp,
191 struct xfs_inode *ip)
192{
193 int error;
194
195 xfs_trans_log_inode(*tpp, ip, XFS_ILOG_CORE);
196 error = xfs_trans_roll(tpp);
197 if (!error)
198 xfs_trans_ijoin(*tpp, ip, 0);
199 return error;
200}