xfs_inode_item.c 23.5 KB
Newer Older
D
Dave Chinner 已提交
1
// SPDX-License-Identifier: GPL-2.0
L
Linus Torvalds 已提交
2
/*
3 4
 * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc.
 * All Rights Reserved.
L
Linus Torvalds 已提交
5 6
 */
#include "xfs.h"
7
#include "xfs_fs.h"
8
#include "xfs_shared.h"
9
#include "xfs_format.h"
10 11
#include "xfs_log_format.h"
#include "xfs_trans_resv.h"
L
Linus Torvalds 已提交
12 13
#include "xfs_mount.h"
#include "xfs_inode.h"
14
#include "xfs_trans.h"
15
#include "xfs_inode_item.h"
C
Christoph Hellwig 已提交
16
#include "xfs_trace.h"
17
#include "xfs_trans_priv.h"
18
#include "xfs_buf_item.h"
C
Christoph Hellwig 已提交
19
#include "xfs_log.h"
20
#include "xfs_error.h"
L
Linus Torvalds 已提交
21

J
Jeff Layton 已提交
22
#include <linux/iversion.h>
L
Linus Torvalds 已提交
23 24 25

kmem_zone_t	*xfs_ili_zone;		/* inode log item zone */

26 27 28 29 30
static inline struct xfs_inode_log_item *INODE_ITEM(struct xfs_log_item *lip)
{
	return container_of(lip, struct xfs_inode_log_item, ili_item);
}

31
STATIC void
32 33
xfs_inode_item_data_fork_size(
	struct xfs_inode_log_item *iip,
34 35
	int			*nvecs,
	int			*nbytes)
L
Linus Torvalds 已提交
36
{
37
	struct xfs_inode	*ip = iip->ili_inode;
38

39
	switch (ip->i_df.if_format) {
L
Linus Torvalds 已提交
40
	case XFS_DINODE_FMT_EXTENTS:
41
		if ((iip->ili_fields & XFS_ILOG_DEXT) &&
42
		    ip->i_df.if_nextents > 0 &&
43 44 45 46 47
		    ip->i_df.if_bytes > 0) {
			/* worst case, doesn't subtract delalloc extents */
			*nbytes += XFS_IFORK_DSIZE(ip);
			*nvecs += 1;
		}
L
Linus Torvalds 已提交
48 49
		break;
	case XFS_DINODE_FMT_BTREE:
50
		if ((iip->ili_fields & XFS_ILOG_DBROOT) &&
51 52 53 54
		    ip->i_df.if_broot_bytes > 0) {
			*nbytes += ip->i_df.if_broot_bytes;
			*nvecs += 1;
		}
L
Linus Torvalds 已提交
55 56
		break;
	case XFS_DINODE_FMT_LOCAL:
57
		if ((iip->ili_fields & XFS_ILOG_DDATA) &&
58 59 60 61
		    ip->i_df.if_bytes > 0) {
			*nbytes += roundup(ip->i_df.if_bytes, 4);
			*nvecs += 1;
		}
L
Linus Torvalds 已提交
62 63 64 65 66 67 68 69
		break;

	case XFS_DINODE_FMT_DEV:
		break;
	default:
		ASSERT(0);
		break;
	}
70
}
L
Linus Torvalds 已提交
71

72 73 74 75 76 77 78
STATIC void
xfs_inode_item_attr_fork_size(
	struct xfs_inode_log_item *iip,
	int			*nvecs,
	int			*nbytes)
{
	struct xfs_inode	*ip = iip->ili_inode;
L
Linus Torvalds 已提交
79

80
	switch (ip->i_afp->if_format) {
L
Linus Torvalds 已提交
81
	case XFS_DINODE_FMT_EXTENTS:
82
		if ((iip->ili_fields & XFS_ILOG_AEXT) &&
83
		    ip->i_afp->if_nextents > 0 &&
84 85 86 87 88
		    ip->i_afp->if_bytes > 0) {
			/* worst case, doesn't subtract unused space */
			*nbytes += XFS_IFORK_ASIZE(ip);
			*nvecs += 1;
		}
L
Linus Torvalds 已提交
89 90
		break;
	case XFS_DINODE_FMT_BTREE:
91
		if ((iip->ili_fields & XFS_ILOG_ABROOT) &&
92 93 94 95
		    ip->i_afp->if_broot_bytes > 0) {
			*nbytes += ip->i_afp->if_broot_bytes;
			*nvecs += 1;
		}
L
Linus Torvalds 已提交
96 97
		break;
	case XFS_DINODE_FMT_LOCAL:
98
		if ((iip->ili_fields & XFS_ILOG_ADATA) &&
99 100 101 102
		    ip->i_afp->if_bytes > 0) {
			*nbytes += roundup(ip->i_afp->if_bytes, 4);
			*nvecs += 1;
		}
L
Linus Torvalds 已提交
103 104 105 106 107 108 109
		break;
	default:
		ASSERT(0);
		break;
	}
}

110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
/*
 * This returns the number of iovecs needed to log the given inode item.
 *
 * We need one iovec for the inode log format structure, one for the
 * inode core, and possibly one for the inode data/extents/b-tree root
 * and one for the inode attribute data/extents/b-tree root.
 */
STATIC void
xfs_inode_item_size(
	struct xfs_log_item	*lip,
	int			*nvecs,
	int			*nbytes)
{
	struct xfs_inode_log_item *iip = INODE_ITEM(lip);
	struct xfs_inode	*ip = iip->ili_inode;

	*nvecs += 2;
	*nbytes += sizeof(struct xfs_inode_log_format) +
128
		   xfs_log_dinode_size(ip->i_mount);
129 130 131 132 133 134

	xfs_inode_item_data_fork_size(iip, nvecs, nbytes);
	if (XFS_IFORK_Q(ip))
		xfs_inode_item_attr_fork_size(iip, nvecs, nbytes);
}

C
Christoph Hellwig 已提交
135
STATIC void
136 137
xfs_inode_item_format_data_fork(
	struct xfs_inode_log_item *iip,
138 139 140
	struct xfs_inode_log_format *ilf,
	struct xfs_log_vec	*lv,
	struct xfs_log_iovec	**vecp)
L
Linus Torvalds 已提交
141
{
142
	struct xfs_inode	*ip = iip->ili_inode;
L
Linus Torvalds 已提交
143 144
	size_t			data_bytes;

145
	switch (ip->i_df.if_format) {
L
Linus Torvalds 已提交
146
	case XFS_DINODE_FMT_EXTENTS:
147
		iip->ili_fields &=
148
			~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT | XFS_ILOG_DEV);
149

150
		if ((iip->ili_fields & XFS_ILOG_DEXT) &&
151
		    ip->i_df.if_nextents > 0 &&
152
		    ip->i_df.if_bytes > 0) {
153 154
			struct xfs_bmbt_rec *p;

155
			ASSERT(xfs_iext_count(&ip->i_df) > 0);
156 157 158 159 160 161 162 163

			p = xlog_prepare_iovec(lv, vecp, XLOG_REG_TYPE_IEXT);
			data_bytes = xfs_iextents_copy(ip, p, XFS_DATA_FORK);
			xlog_finish_iovec(lv, *vecp, data_bytes);

			ASSERT(data_bytes <= ip->i_df.if_bytes);

			ilf->ilf_dsize = data_bytes;
164
			ilf->ilf_size++;
165
		} else {
166
			iip->ili_fields &= ~XFS_ILOG_DEXT;
L
Linus Torvalds 已提交
167 168 169
		}
		break;
	case XFS_DINODE_FMT_BTREE:
170
		iip->ili_fields &=
171
			~(XFS_ILOG_DDATA | XFS_ILOG_DEXT | XFS_ILOG_DEV);
172

173
		if ((iip->ili_fields & XFS_ILOG_DBROOT) &&
174
		    ip->i_df.if_broot_bytes > 0) {
L
Linus Torvalds 已提交
175
			ASSERT(ip->i_df.if_broot != NULL);
176
			xlog_copy_iovec(lv, vecp, XLOG_REG_TYPE_IBROOT,
C
Christoph Hellwig 已提交
177 178
					ip->i_df.if_broot,
					ip->i_df.if_broot_bytes);
179 180
			ilf->ilf_dsize = ip->i_df.if_broot_bytes;
			ilf->ilf_size++;
181
		} else {
182
			ASSERT(!(iip->ili_fields &
183
				 XFS_ILOG_DBROOT));
184
			iip->ili_fields &= ~XFS_ILOG_DBROOT;
L
Linus Torvalds 已提交
185 186 187
		}
		break;
	case XFS_DINODE_FMT_LOCAL:
188
		iip->ili_fields &=
189
			~(XFS_ILOG_DEXT | XFS_ILOG_DBROOT | XFS_ILOG_DEV);
190
		if ((iip->ili_fields & XFS_ILOG_DDATA) &&
191
		    ip->i_df.if_bytes > 0) {
L
Linus Torvalds 已提交
192 193
			/*
			 * Round i_bytes up to a word boundary.
194
			 * The underlying memory is guaranteed
L
Linus Torvalds 已提交
195 196 197
			 * to be there by xfs_idata_realloc().
			 */
			data_bytes = roundup(ip->i_df.if_bytes, 4);
C
Christoph Hellwig 已提交
198
			ASSERT(ip->i_df.if_u1.if_data != NULL);
199
			ASSERT(ip->i_disk_size > 0);
200
			xlog_copy_iovec(lv, vecp, XLOG_REG_TYPE_ILOCAL,
C
Christoph Hellwig 已提交
201
					ip->i_df.if_u1.if_data, data_bytes);
202 203
			ilf->ilf_dsize = (unsigned)data_bytes;
			ilf->ilf_size++;
204
		} else {
205
			iip->ili_fields &= ~XFS_ILOG_DDATA;
L
Linus Torvalds 已提交
206 207 208
		}
		break;
	case XFS_DINODE_FMT_DEV:
209
		iip->ili_fields &=
210
			~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT | XFS_ILOG_DEXT);
211
		if (iip->ili_fields & XFS_ILOG_DEV)
C
Christoph Hellwig 已提交
212
			ilf->ilf_u.ilfu_rdev = sysv_encode_dev(VFS_I(ip)->i_rdev);
L
Linus Torvalds 已提交
213 214 215 216 217
		break;
	default:
		ASSERT(0);
		break;
	}
218 219
}

C
Christoph Hellwig 已提交
220
STATIC void
221 222
xfs_inode_item_format_attr_fork(
	struct xfs_inode_log_item *iip,
223 224 225
	struct xfs_inode_log_format *ilf,
	struct xfs_log_vec	*lv,
	struct xfs_log_iovec	**vecp)
226 227 228
{
	struct xfs_inode	*ip = iip->ili_inode;
	size_t			data_bytes;
L
Linus Torvalds 已提交
229

230
	switch (ip->i_afp->if_format) {
L
Linus Torvalds 已提交
231
	case XFS_DINODE_FMT_EXTENTS:
232
		iip->ili_fields &=
233 234
			~(XFS_ILOG_ADATA | XFS_ILOG_ABROOT);

235
		if ((iip->ili_fields & XFS_ILOG_AEXT) &&
236
		    ip->i_afp->if_nextents > 0 &&
237
		    ip->i_afp->if_bytes > 0) {
238 239
			struct xfs_bmbt_rec *p;

240
			ASSERT(xfs_iext_count(ip->i_afp) ==
241
				ip->i_afp->if_nextents);
242 243 244 245 246 247

			p = xlog_prepare_iovec(lv, vecp, XLOG_REG_TYPE_IATTR_EXT);
			data_bytes = xfs_iextents_copy(ip, p, XFS_ATTR_FORK);
			xlog_finish_iovec(lv, *vecp, data_bytes);

			ilf->ilf_asize = data_bytes;
248
			ilf->ilf_size++;
249
		} else {
250
			iip->ili_fields &= ~XFS_ILOG_AEXT;
L
Linus Torvalds 已提交
251 252 253
		}
		break;
	case XFS_DINODE_FMT_BTREE:
254
		iip->ili_fields &=
255 256
			~(XFS_ILOG_ADATA | XFS_ILOG_AEXT);

257
		if ((iip->ili_fields & XFS_ILOG_ABROOT) &&
258
		    ip->i_afp->if_broot_bytes > 0) {
L
Linus Torvalds 已提交
259
			ASSERT(ip->i_afp->if_broot != NULL);
260

261
			xlog_copy_iovec(lv, vecp, XLOG_REG_TYPE_IATTR_BROOT,
C
Christoph Hellwig 已提交
262 263
					ip->i_afp->if_broot,
					ip->i_afp->if_broot_bytes);
264 265
			ilf->ilf_asize = ip->i_afp->if_broot_bytes;
			ilf->ilf_size++;
266
		} else {
267
			iip->ili_fields &= ~XFS_ILOG_ABROOT;
L
Linus Torvalds 已提交
268 269 270
		}
		break;
	case XFS_DINODE_FMT_LOCAL:
271
		iip->ili_fields &=
272 273
			~(XFS_ILOG_AEXT | XFS_ILOG_ABROOT);

274
		if ((iip->ili_fields & XFS_ILOG_ADATA) &&
275
		    ip->i_afp->if_bytes > 0) {
L
Linus Torvalds 已提交
276 277
			/*
			 * Round i_bytes up to a word boundary.
278
			 * The underlying memory is guaranteed
L
Linus Torvalds 已提交
279 280 281
			 * to be there by xfs_idata_realloc().
			 */
			data_bytes = roundup(ip->i_afp->if_bytes, 4);
C
Christoph Hellwig 已提交
282
			ASSERT(ip->i_afp->if_u1.if_data != NULL);
283
			xlog_copy_iovec(lv, vecp, XLOG_REG_TYPE_IATTR_LOCAL,
C
Christoph Hellwig 已提交
284 285
					ip->i_afp->if_u1.if_data,
					data_bytes);
286 287
			ilf->ilf_asize = (unsigned)data_bytes;
			ilf->ilf_size++;
288
		} else {
289
			iip->ili_fields &= ~XFS_ILOG_ADATA;
L
Linus Torvalds 已提交
290 291 292 293 294 295
		}
		break;
	default:
		ASSERT(0);
		break;
	}
296 297
}

298 299 300 301 302 303
/*
 * Convert an incore timestamp to a log timestamp.  Note that the log format
 * specifies host endian format!
 */
static inline xfs_ictimestamp_t
xfs_inode_to_log_dinode_ts(
304
	struct xfs_inode		*ip,
305 306 307 308 309
	const struct timespec64		tv)
{
	struct xfs_legacy_ictimestamp	*lits;
	xfs_ictimestamp_t		its;

310 311 312
	if (xfs_inode_has_bigtime(ip))
		return xfs_inode_encode_bigtime(tv);

313 314 315 316 317 318 319
	lits = (struct xfs_legacy_ictimestamp *)&its;
	lits->t_sec = tv.tv_sec;
	lits->t_nsec = tv.tv_nsec;

	return its;
}

320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346
/*
 * The legacy DMAPI fields are only present in the on-disk and in-log inodes,
 * but not in the in-memory one.  But we are guaranteed to have an inode buffer
 * in memory when logging an inode, so we can just copy it from the on-disk
 * inode to the in-log inode here so that recovery of file system with these
 * fields set to non-zero values doesn't lose them.  For all other cases we zero
 * the fields.
 */
static void
xfs_copy_dm_fields_to_log_dinode(
	struct xfs_inode	*ip,
	struct xfs_log_dinode	*to)
{
	struct xfs_dinode	*dip;

	dip = xfs_buf_offset(ip->i_itemp->ili_item.li_buf,
			     ip->i_imap.im_boffset);

	if (xfs_iflags_test(ip, XFS_IPRESERVE_DM_FIELDS)) {
		to->di_dmevmask = be32_to_cpu(dip->di_dmevmask);
		to->di_dmstate = be16_to_cpu(dip->di_dmstate);
	} else {
		to->di_dmevmask = 0;
		to->di_dmstate = 0;
	}
}

347
static void
348 349
xfs_inode_to_log_dinode(
	struct xfs_inode	*ip,
350 351
	struct xfs_log_dinode	*to,
	xfs_lsn_t		lsn)
352
{
353 354 355
	struct xfs_icdinode	*from = &ip->i_d;
	struct inode		*inode = VFS_I(ip);

356
	to->di_magic = XFS_DINODE_MAGIC;
357
	to->di_format = xfs_ifork_format(&ip->i_df);
358 359
	to->di_uid = i_uid_read(inode);
	to->di_gid = i_gid_read(inode);
360 361
	to->di_projid_lo = ip->i_projid & 0xffff;
	to->di_projid_hi = ip->i_projid >> 16;
362

363
	memset(to->di_pad, 0, sizeof(to->di_pad));
364
	memset(to->di_pad3, 0, sizeof(to->di_pad3));
365 366 367
	to->di_atime = xfs_inode_to_log_dinode_ts(ip, inode->i_atime);
	to->di_mtime = xfs_inode_to_log_dinode_ts(ip, inode->i_mtime);
	to->di_ctime = xfs_inode_to_log_dinode_ts(ip, inode->i_ctime);
368
	to->di_nlink = inode->i_nlink;
369
	to->di_gen = inode->i_generation;
D
Dave Chinner 已提交
370
	to->di_mode = inode->i_mode;
371

372
	to->di_size = ip->i_disk_size;
373
	to->di_nblocks = ip->i_nblocks;
374
	to->di_extsize = ip->i_extsize;
375 376
	to->di_nextents = xfs_ifork_nextents(&ip->i_df);
	to->di_anextents = xfs_ifork_nextents(ip->i_afp);
377
	to->di_forkoff = from->di_forkoff;
378
	to->di_aformat = xfs_ifork_format(ip->i_afp);
379 380
	to->di_flags = from->di_flags;

381 382
	xfs_copy_dm_fields_to_log_dinode(ip, to);

383 384 385
	/* log a dummy value to ensure log structure is fully initialised */
	to->di_next_unlinked = NULLAGINO;

386 387
	if (xfs_sb_version_has_v3inode(&ip->i_mount->m_sb)) {
		to->di_version = 3;
J
Jeff Layton 已提交
388
		to->di_changecount = inode_peek_iversion(inode);
389
		to->di_crtime = xfs_inode_to_log_dinode_ts(ip, from->di_crtime);
390
		to->di_flags2 = from->di_flags2;
391
		to->di_cowextsize = ip->i_cowextsize;
392 393 394 395
		to->di_ino = ip->i_ino;
		to->di_lsn = lsn;
		memset(to->di_pad2, 0, sizeof(to->di_pad2));
		uuid_copy(&to->di_uuid, &ip->i_mount->m_sb.sb_meta_uuid);
396 397
		to->di_flushiter = 0;
	} else {
398
		to->di_version = 2;
399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416
		to->di_flushiter = from->di_flushiter;
	}
}

/*
 * Format the inode core. Current timestamp data is only in the VFS inode
 * fields, so we need to grab them from there. Hence rather than just copying
 * the XFS inode core structure, format the fields directly into the iovec.
 */
static void
xfs_inode_item_format_core(
	struct xfs_inode	*ip,
	struct xfs_log_vec	*lv,
	struct xfs_log_iovec	**vecp)
{
	struct xfs_log_dinode	*dic;

	dic = xlog_prepare_iovec(lv, vecp, XLOG_REG_TYPE_ICORE);
417
	xfs_inode_to_log_dinode(ip, dic, ip->i_itemp->ili_item.li_lsn);
418
	xlog_finish_iovec(lv, *vecp, xfs_log_dinode_size(ip->i_mount));
419 420
}

421 422 423 424 425 426
/*
 * This is called to fill in the vector of log iovecs for the given inode
 * log item.  It fills the first item with an inode log format structure,
 * the second with the on-disk inode structure, and a possible third and/or
 * fourth with the inode data/extents/b-tree root and inode attributes
 * data/extents/b-tree root.
427 428 429 430 431
 *
 * Note: Always use the 64 bit inode log format structure so we don't
 * leave an uninitialised hole in the format item on 64 bit systems. Log
 * recovery on 32 bit systems handles this just fine, so there's no reason
 * for not using an initialising the properly padded structure all the time.
432 433 434 435
 */
STATIC void
xfs_inode_item_format(
	struct xfs_log_item	*lip,
436
	struct xfs_log_vec	*lv)
437 438 439
{
	struct xfs_inode_log_item *iip = INODE_ITEM(lip);
	struct xfs_inode	*ip = iip->ili_inode;
440
	struct xfs_log_iovec	*vecp = NULL;
441
	struct xfs_inode_log_format *ilf;
442

443 444 445 446 447 448 449 450
	ilf = xlog_prepare_iovec(lv, &vecp, XLOG_REG_TYPE_IFORMAT);
	ilf->ilf_type = XFS_LI_INODE;
	ilf->ilf_ino = ip->i_ino;
	ilf->ilf_blkno = ip->i_imap.im_blkno;
	ilf->ilf_len = ip->i_imap.im_len;
	ilf->ilf_boffset = ip->i_imap.im_boffset;
	ilf->ilf_fields = XFS_ILOG_CORE;
	ilf->ilf_size = 2; /* format + core */
451 452 453 454 455 456 457 458

	/*
	 * make sure we don't leak uninitialised data into the log in the case
	 * when we don't log every field in the inode.
	 */
	ilf->ilf_dsize = 0;
	ilf->ilf_asize = 0;
	ilf->ilf_pad = 0;
459
	memset(&ilf->ilf_u, 0, sizeof(ilf->ilf_u));
460 461

	xlog_finish_iovec(lv, vecp, sizeof(*ilf));
462

463
	xfs_inode_item_format_core(ip, lv, &vecp);
464
	xfs_inode_item_format_data_fork(iip, ilf, lv, &vecp);
465
	if (XFS_IFORK_Q(ip)) {
466
		xfs_inode_item_format_attr_fork(iip, ilf, lv, &vecp);
467 468 469 470 471
	} else {
		iip->ili_fields &=
			~(XFS_ILOG_ADATA | XFS_ILOG_ABROOT | XFS_ILOG_AEXT);
	}

472 473
	/* update the format with the exact fields we actually logged */
	ilf->ilf_fields |= (iip->ili_fields & ~XFS_ILOG_TIMESTAMP);
L
Linus Torvalds 已提交
474 475 476 477
}

/*
 * This is called to pin the inode associated with the inode log
478
 * item in memory so it cannot be written out.
L
Linus Torvalds 已提交
479 480 481
 */
STATIC void
xfs_inode_item_pin(
482
	struct xfs_log_item	*lip)
L
Linus Torvalds 已提交
483
{
484
	struct xfs_inode	*ip = INODE_ITEM(lip)->ili_inode;
485

486
	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
487
	ASSERT(lip->li_buf);
488 489 490

	trace_xfs_inode_pin(ip, _RET_IP_);
	atomic_inc(&ip->i_pincount);
L
Linus Torvalds 已提交
491 492 493 494 495 496
}


/*
 * This is called to unpin the inode associated with the inode log
 * item which was previously pinned with a call to xfs_inode_item_pin().
497 498
 *
 * Also wake up anyone in xfs_iunpin_wait() if the count goes to 0.
499 500 501 502 503 504
 *
 * Note that unpin can race with inode cluster buffer freeing marking the buffer
 * stale. In that case, flush completions are run from the buffer unpin call,
 * which may happen before the inode is unpinned. If we lose the race, there
 * will be no buffer attached to the log item, but the inode will be marked
 * XFS_ISTALE.
L
Linus Torvalds 已提交
505 506 507
 */
STATIC void
xfs_inode_item_unpin(
508
	struct xfs_log_item	*lip,
509
	int			remove)
L
Linus Torvalds 已提交
510
{
511
	struct xfs_inode	*ip = INODE_ITEM(lip)->ili_inode;
512

513
	trace_xfs_inode_unpin(ip, _RET_IP_);
514
	ASSERT(lip->li_buf || xfs_iflags_test(ip, XFS_ISTALE));
515 516
	ASSERT(atomic_read(&ip->i_pincount) > 0);
	if (atomic_dec_and_test(&ip->i_pincount))
517
		wake_up_bit(&ip->i_flags, __XFS_IPINNED_BIT);
L
Linus Torvalds 已提交
518 519 520
}

STATIC uint
521 522 523
xfs_inode_item_push(
	struct xfs_log_item	*lip,
	struct list_head	*buffer_list)
524 525
		__releases(&lip->li_ailp->ail_lock)
		__acquires(&lip->li_ailp->ail_lock)
L
Linus Torvalds 已提交
526
{
527 528
	struct xfs_inode_log_item *iip = INODE_ITEM(lip);
	struct xfs_inode	*ip = iip->ili_inode;
529
	struct xfs_buf		*bp = lip->li_buf;
530 531
	uint			rval = XFS_ITEM_SUCCESS;
	int			error;
L
Linus Torvalds 已提交
532

533 534 535 536
	ASSERT(iip->ili_item.li_buf);

	if (xfs_ipincount(ip) > 0 || xfs_buf_ispinned(bp) ||
	    (ip->i_flags & XFS_ISTALE))
L
Linus Torvalds 已提交
537 538
		return XFS_ITEM_PINNED;

539
	if (xfs_iflags_test(ip, XFS_IFLUSHING))
540
		return XFS_ITEM_FLUSHING;
L
Linus Torvalds 已提交
541

542 543
	if (!xfs_buf_trylock(bp))
		return XFS_ITEM_LOCKED;
544

545
	spin_unlock(&lip->li_ailp->ail_lock);
546

547
	/*
548 549 550 551
	 * We need to hold a reference for flushing the cluster buffer as it may
	 * fail the buffer without IO submission. In which case, we better get a
	 * reference for that completion because otherwise we don't get a
	 * reference for IO until we queue the buffer for delwri submission.
552
	 */
553
	xfs_buf_hold(bp);
554
	error = xfs_iflush_cluster(bp);
555 556 557 558
	if (!error) {
		if (!xfs_buf_delwri_queue(bp, buffer_list))
			rval = XFS_ITEM_FLUSHING;
		xfs_buf_relse(bp);
559
	} else {
560 561 562 563 564 565
		/*
		 * Release the buffer if we were unable to flush anything. On
		 * any other error, the buffer has already been released.
		 */
		if (error == -EAGAIN)
			xfs_buf_relse(bp);
566
		rval = XFS_ITEM_LOCKED;
567
	}
568

569
	spin_lock(&lip->li_ailp->ail_lock);
570
	return rval;
L
Linus Torvalds 已提交
571 572 573 574 575 576
}

/*
 * Unlock the inode associated with the inode log item.
 */
STATIC void
C
Christoph Hellwig 已提交
577
xfs_inode_item_release(
578
	struct xfs_log_item	*lip)
L
Linus Torvalds 已提交
579
{
580 581
	struct xfs_inode_log_item *iip = INODE_ITEM(lip);
	struct xfs_inode	*ip = iip->ili_inode;
582
	unsigned short		lock_flags;
L
Linus Torvalds 已提交
583

C
Christoph Hellwig 已提交
584 585
	ASSERT(ip->i_itemp != NULL);
	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
L
Linus Torvalds 已提交
586

587 588
	lock_flags = iip->ili_lock_flags;
	iip->ili_lock_flags = 0;
589
	if (lock_flags)
C
Christoph Hellwig 已提交
590
		xfs_iunlock(ip, lock_flags);
L
Linus Torvalds 已提交
591 592 593
}

/*
594 595 596 597 598 599 600 601 602 603 604
 * This is called to find out where the oldest active copy of the inode log
 * item in the on disk log resides now that the last log write of it completed
 * at the given lsn.  Since we always re-log all dirty data in an inode, the
 * latest copy in the on disk log is the only one that matters.  Therefore,
 * simply return the given lsn.
 *
 * If the inode has been marked stale because the cluster is being freed, we
 * don't want to (re-)insert this inode into the AIL. There is a race condition
 * where the cluster buffer may be unpinned before the inode is inserted into
 * the AIL during transaction committed processing. If the buffer is unpinned
 * before the inode item has been committed and inserted, then it is possible
605
 * for the buffer to be written and IO completes before the inode is inserted
606 607 608 609 610
 * into the AIL. In that case, we'd be inserting a clean, stale inode into the
 * AIL which will never get removed. It will, however, get reclaimed which
 * triggers an assert in xfs_inode_free() complaining about freein an inode
 * still in the AIL.
 *
611 612 613
 * To avoid this, just unpin the inode directly and return a LSN of -1 so the
 * transaction committed code knows that it does not need to do any further
 * processing on the item.
L
Linus Torvalds 已提交
614 615 616
 */
STATIC xfs_lsn_t
xfs_inode_item_committed(
617
	struct xfs_log_item	*lip,
L
Linus Torvalds 已提交
618 619
	xfs_lsn_t		lsn)
{
620 621 622
	struct xfs_inode_log_item *iip = INODE_ITEM(lip);
	struct xfs_inode	*ip = iip->ili_inode;

623 624 625 626
	if (xfs_iflags_test(ip, XFS_ISTALE)) {
		xfs_inode_item_unpin(lip, 0);
		return -1;
	}
627
	return lsn;
L
Linus Torvalds 已提交
628 629 630 631
}

STATIC void
xfs_inode_item_committing(
632
	struct xfs_log_item	*lip,
C
Christoph Hellwig 已提交
633
	xfs_lsn_t		commit_lsn)
L
Linus Torvalds 已提交
634
{
C
Christoph Hellwig 已提交
635 636
	INODE_ITEM(lip)->ili_last_lsn = commit_lsn;
	return xfs_inode_item_release(lip);
L
Linus Torvalds 已提交
637 638
}

C
Christoph Hellwig 已提交
639
static const struct xfs_item_ops xfs_inode_item_ops = {
640 641 642 643
	.iop_size	= xfs_inode_item_size,
	.iop_format	= xfs_inode_item_format,
	.iop_pin	= xfs_inode_item_pin,
	.iop_unpin	= xfs_inode_item_unpin,
C
Christoph Hellwig 已提交
644
	.iop_release	= xfs_inode_item_release,
645 646
	.iop_committed	= xfs_inode_item_committed,
	.iop_push	= xfs_inode_item_push,
C
Christoph Hellwig 已提交
647
	.iop_committing	= xfs_inode_item_committing,
L
Linus Torvalds 已提交
648 649 650 651 652 653 654 655
};


/*
 * Initialize the inode log item for a newly allocated (in-core) inode.
 */
void
xfs_inode_item_init(
656 657
	struct xfs_inode	*ip,
	struct xfs_mount	*mp)
L
Linus Torvalds 已提交
658
{
659
	struct xfs_inode_log_item *iip;
L
Linus Torvalds 已提交
660 661

	ASSERT(ip->i_itemp == NULL);
662 663
	iip = ip->i_itemp = kmem_cache_zalloc(xfs_ili_zone,
					      GFP_KERNEL | __GFP_NOFAIL);
L
Linus Torvalds 已提交
664 665

	iip->ili_inode = ip;
D
Dave Chinner 已提交
666
	spin_lock_init(&iip->ili_lock);
667 668
	xfs_log_item_init(mp, &iip->ili_item, XFS_LI_INODE,
						&xfs_inode_item_ops);
L
Linus Torvalds 已提交
669 670 671 672 673 674 675
}

/*
 * Free the inode log item and any memory hanging off of it.
 */
void
xfs_inode_item_destroy(
676
	struct xfs_inode	*ip)
L
Linus Torvalds 已提交
677
{
678 679 680 681 682 683 684
	struct xfs_inode_log_item *iip = ip->i_itemp;

	ASSERT(iip->ili_item.li_buf == NULL);

	ip->i_itemp = NULL;
	kmem_free(iip->ili_item.li_lv_shadow);
	kmem_cache_free(xfs_ili_zone, iip);
L
Linus Torvalds 已提交
685 686 687 688
}


/*
D
Dave Chinner 已提交
689 690 691
 * We only want to pull the item from the AIL if it is actually there
 * and its location in the log has not changed since we started the
 * flush.  Thus, we only bother if the inode's lsn has not changed.
L
Linus Torvalds 已提交
692
 */
D
Dave Chinner 已提交
693 694 695 696
static void
xfs_iflush_ail_updates(
	struct xfs_ail		*ailp,
	struct list_head	*list)
L
Linus Torvalds 已提交
697
{
D
Dave Chinner 已提交
698 699
	struct xfs_log_item	*lip;
	xfs_lsn_t		tail_lsn = 0;
700

D
Dave Chinner 已提交
701 702 703 704
	/* this is an opencoded batch version of xfs_trans_ail_delete */
	spin_lock(&ailp->ail_lock);
	list_for_each_entry(lip, list, li_bio_list) {
		xfs_lsn_t	lsn;
705

D
Dave Chinner 已提交
706 707
		clear_bit(XFS_LI_FAILED, &lip->li_flags);
		if (INODE_ITEM(lip)->ili_flush_lsn != lip->li_lsn)
708 709
			continue;

D
Dave Chinner 已提交
710 711 712
		lsn = xfs_ail_delete_one(ailp, lip);
		if (!tail_lsn && lsn)
			tail_lsn = lsn;
713
	}
D
Dave Chinner 已提交
714 715
	xfs_ail_update_finish(ailp, tail_lsn);
}
L
Linus Torvalds 已提交
716

D
Dave Chinner 已提交
717 718 719 720 721 722 723 724 725 726 727 728
/*
 * Walk the list of inodes that have completed their IOs. If they are clean
 * remove them from the list and dissociate them from the buffer. Buffers that
 * are still dirty remain linked to the buffer and on the list. Caller must
 * handle them appropriately.
 */
static void
xfs_iflush_finish(
	struct xfs_buf		*bp,
	struct list_head	*list)
{
	struct xfs_log_item	*lip, *n;
L
Linus Torvalds 已提交
729

D
Dave Chinner 已提交
730 731
	list_for_each_entry_safe(lip, n, list, li_bio_list) {
		struct xfs_inode_log_item *iip = INODE_ITEM(lip);
732 733
		bool	drop_buffer = false;

D
Dave Chinner 已提交
734
		spin_lock(&iip->ili_lock);
735 736 737

		/*
		 * Remove the reference to the cluster buffer if the inode is
D
Dave Chinner 已提交
738 739
		 * clean in memory and drop the buffer reference once we've
		 * dropped the locks we hold.
740 741 742 743
		 */
		ASSERT(iip->ili_item.li_buf == bp);
		if (!iip->ili_fields) {
			iip->ili_item.li_buf = NULL;
D
Dave Chinner 已提交
744
			list_del_init(&lip->li_bio_list);
745 746
			drop_buffer = true;
		}
747
		iip->ili_last_fields = 0;
748
		iip->ili_flush_lsn = 0;
D
Dave Chinner 已提交
749
		spin_unlock(&iip->ili_lock);
750
		xfs_iflags_clear(iip->ili_inode, XFS_IFLUSHING);
751 752
		if (drop_buffer)
			xfs_buf_rele(bp);
753
	}
L
Linus Torvalds 已提交
754 755
}

D
Dave Chinner 已提交
756 757
/*
 * Inode buffer IO completion routine.  It is responsible for removing inodes
758 759
 * attached to the buffer from the AIL if they have not been re-logged and
 * completing the inode flush.
D
Dave Chinner 已提交
760 761
 */
void
762
xfs_buf_inode_iodone(
D
Dave Chinner 已提交
763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800
	struct xfs_buf		*bp)
{
	struct xfs_log_item	*lip, *n;
	LIST_HEAD(flushed_inodes);
	LIST_HEAD(ail_updates);

	/*
	 * Pull the attached inodes from the buffer one at a time and take the
	 * appropriate action on them.
	 */
	list_for_each_entry_safe(lip, n, &bp->b_li_list, li_bio_list) {
		struct xfs_inode_log_item *iip = INODE_ITEM(lip);

		if (xfs_iflags_test(iip->ili_inode, XFS_ISTALE)) {
			xfs_iflush_abort(iip->ili_inode);
			continue;
		}
		if (!iip->ili_last_fields)
			continue;

		/* Do an unlocked check for needing the AIL lock. */
		if (iip->ili_flush_lsn == lip->li_lsn ||
		    test_bit(XFS_LI_FAILED, &lip->li_flags))
			list_move_tail(&lip->li_bio_list, &ail_updates);
		else
			list_move_tail(&lip->li_bio_list, &flushed_inodes);
	}

	if (!list_empty(&ail_updates)) {
		xfs_iflush_ail_updates(bp->b_mount->m_ail, &ail_updates);
		list_splice_tail(&ail_updates, &flushed_inodes);
	}

	xfs_iflush_finish(bp, &flushed_inodes);
	if (!list_empty(&flushed_inodes))
		list_splice_tail(&flushed_inodes, &bp->b_li_list);
}

801 802 803 804 805 806 807 808 809 810
void
xfs_buf_inode_io_fail(
	struct xfs_buf		*bp)
{
	struct xfs_log_item	*lip;

	list_for_each_entry(lip, &bp->b_li_list, li_bio_list)
		set_bit(XFS_LI_FAILED, &lip->li_flags);
}

L
Linus Torvalds 已提交
811
/*
812
 * This is the inode flushing abort routine.  It is called when
813 814
 * the filesystem is shutting down to clean up the inode state.  It is
 * responsible for removing the inode item from the AIL if it has not been
815
 * re-logged and clearing the inode's flush state.
L
Linus Torvalds 已提交
816 817 818
 */
void
xfs_iflush_abort(
819
	struct xfs_inode	*ip)
L
Linus Torvalds 已提交
820
{
821 822
	struct xfs_inode_log_item *iip = ip->i_itemp;
	struct xfs_buf		*bp = NULL;
L
Linus Torvalds 已提交
823 824

	if (iip) {
825 826 827 828 829 830
		/*
		 * Clear the failed bit before removing the item from the AIL so
		 * xfs_trans_ail_delete() doesn't try to clear and release the
		 * buffer attached to the log item before we are done with it.
		 */
		clear_bit(XFS_LI_FAILED, &iip->ili_item.li_flags);
831
		xfs_trans_ail_delete(&iip->ili_item, 0);
832

L
Linus Torvalds 已提交
833 834 835 836
		/*
		 * Clear the inode logging fields so no more flushes are
		 * attempted.
		 */
D
Dave Chinner 已提交
837
		spin_lock(&iip->ili_lock);
838
		iip->ili_last_fields = 0;
839
		iip->ili_fields = 0;
840
		iip->ili_fsync_fields = 0;
841 842 843
		iip->ili_flush_lsn = 0;
		bp = iip->ili_item.li_buf;
		iip->ili_item.li_buf = NULL;
844
		list_del_init(&iip->ili_item.li_bio_list);
D
Dave Chinner 已提交
845
		spin_unlock(&iip->ili_lock);
L
Linus Torvalds 已提交
846
	}
847
	xfs_iflags_clear(ip, XFS_IFLUSHING);
848 849
	if (bp)
		xfs_buf_rele(bp);
L
Linus Torvalds 已提交
850 851
}

852
/*
853 854
 * convert an xfs_inode_log_format struct from the old 32 bit version
 * (which can have different field alignments) to the native 64 bit version
855 856 857
 */
int
xfs_inode_item_format_convert(
858 859
	struct xfs_log_iovec		*buf,
	struct xfs_inode_log_format	*in_f)
860
{
861 862
	struct xfs_inode_log_format_32	*in_f32 = buf->i_addr;

863 864
	if (buf->i_len != sizeof(*in_f32)) {
		XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, NULL);
865
		return -EFSCORRUPTED;
866
	}
867 868 869 870 871 872 873

	in_f->ilf_type = in_f32->ilf_type;
	in_f->ilf_size = in_f32->ilf_size;
	in_f->ilf_fields = in_f32->ilf_fields;
	in_f->ilf_asize = in_f32->ilf_asize;
	in_f->ilf_dsize = in_f32->ilf_dsize;
	in_f->ilf_ino = in_f32->ilf_ino;
874
	memcpy(&in_f->ilf_u, &in_f32->ilf_u, sizeof(in_f->ilf_u));
875 876 877 878
	in_f->ilf_blkno = in_f32->ilf_blkno;
	in_f->ilf_len = in_f32->ilf_len;
	in_f->ilf_boffset = in_f32->ilf_boffset;
	return 0;
879
}