xref: /openbmc/linux/fs/xfs/xfs_inode_item.c (revision 04a7279f)
1 /*
2  * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc.
3  * All Rights Reserved.
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it would be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write the Free Software Foundation,
16  * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17  */
18 #include "xfs.h"
19 #include "xfs_fs.h"
20 #include "xfs_format.h"
21 #include "xfs_log_format.h"
22 #include "xfs_trans_resv.h"
23 #include "xfs_mount.h"
24 #include "xfs_inode.h"
25 #include "xfs_trans.h"
26 #include "xfs_inode_item.h"
27 #include "xfs_error.h"
28 #include "xfs_trace.h"
29 #include "xfs_trans_priv.h"
30 #include "xfs_buf_item.h"
31 #include "xfs_log.h"
32 
33 
34 kmem_zone_t	*xfs_ili_zone;		/* inode log item zone */
35 
36 static inline struct xfs_inode_log_item *INODE_ITEM(struct xfs_log_item *lip)
37 {
38 	return container_of(lip, struct xfs_inode_log_item, ili_item);
39 }
40 
41 STATIC void
42 xfs_inode_item_data_fork_size(
43 	struct xfs_inode_log_item *iip,
44 	int			*nvecs,
45 	int			*nbytes)
46 {
47 	struct xfs_inode	*ip = iip->ili_inode;
48 
49 	switch (ip->i_d.di_format) {
50 	case XFS_DINODE_FMT_EXTENTS:
51 		if ((iip->ili_fields & XFS_ILOG_DEXT) &&
52 		    ip->i_d.di_nextents > 0 &&
53 		    ip->i_df.if_bytes > 0) {
54 			/* worst case, doesn't subtract delalloc extents */
55 			*nbytes += XFS_IFORK_DSIZE(ip);
56 			*nvecs += 1;
57 		}
58 		break;
59 	case XFS_DINODE_FMT_BTREE:
60 		if ((iip->ili_fields & XFS_ILOG_DBROOT) &&
61 		    ip->i_df.if_broot_bytes > 0) {
62 			*nbytes += ip->i_df.if_broot_bytes;
63 			*nvecs += 1;
64 		}
65 		break;
66 	case XFS_DINODE_FMT_LOCAL:
67 		if ((iip->ili_fields & XFS_ILOG_DDATA) &&
68 		    ip->i_df.if_bytes > 0) {
69 			*nbytes += roundup(ip->i_df.if_bytes, 4);
70 			*nvecs += 1;
71 		}
72 		break;
73 
74 	case XFS_DINODE_FMT_DEV:
75 		break;
76 	default:
77 		ASSERT(0);
78 		break;
79 	}
80 }
81 
82 STATIC void
83 xfs_inode_item_attr_fork_size(
84 	struct xfs_inode_log_item *iip,
85 	int			*nvecs,
86 	int			*nbytes)
87 {
88 	struct xfs_inode	*ip = iip->ili_inode;
89 
90 	switch (ip->i_d.di_aformat) {
91 	case XFS_DINODE_FMT_EXTENTS:
92 		if ((iip->ili_fields & XFS_ILOG_AEXT) &&
93 		    ip->i_d.di_anextents > 0 &&
94 		    ip->i_afp->if_bytes > 0) {
95 			/* worst case, doesn't subtract unused space */
96 			*nbytes += XFS_IFORK_ASIZE(ip);
97 			*nvecs += 1;
98 		}
99 		break;
100 	case XFS_DINODE_FMT_BTREE:
101 		if ((iip->ili_fields & XFS_ILOG_ABROOT) &&
102 		    ip->i_afp->if_broot_bytes > 0) {
103 			*nbytes += ip->i_afp->if_broot_bytes;
104 			*nvecs += 1;
105 		}
106 		break;
107 	case XFS_DINODE_FMT_LOCAL:
108 		if ((iip->ili_fields & XFS_ILOG_ADATA) &&
109 		    ip->i_afp->if_bytes > 0) {
110 			*nbytes += roundup(ip->i_afp->if_bytes, 4);
111 			*nvecs += 1;
112 		}
113 		break;
114 	default:
115 		ASSERT(0);
116 		break;
117 	}
118 }
119 
120 /*
121  * This returns the number of iovecs needed to log the given inode item.
122  *
123  * We need one iovec for the inode log format structure, one for the
124  * inode core, and possibly one for the inode data/extents/b-tree root
125  * and one for the inode attribute data/extents/b-tree root.
126  */
127 STATIC void
128 xfs_inode_item_size(
129 	struct xfs_log_item	*lip,
130 	int			*nvecs,
131 	int			*nbytes)
132 {
133 	struct xfs_inode_log_item *iip = INODE_ITEM(lip);
134 	struct xfs_inode	*ip = iip->ili_inode;
135 
136 	*nvecs += 2;
137 	*nbytes += sizeof(struct xfs_inode_log_format) +
138 		   xfs_log_dinode_size(ip->i_d.di_version);
139 
140 	xfs_inode_item_data_fork_size(iip, nvecs, nbytes);
141 	if (XFS_IFORK_Q(ip))
142 		xfs_inode_item_attr_fork_size(iip, nvecs, nbytes);
143 }
144 
145 STATIC void
146 xfs_inode_item_format_data_fork(
147 	struct xfs_inode_log_item *iip,
148 	struct xfs_inode_log_format *ilf,
149 	struct xfs_log_vec	*lv,
150 	struct xfs_log_iovec	**vecp)
151 {
152 	struct xfs_inode	*ip = iip->ili_inode;
153 	size_t			data_bytes;
154 
155 	switch (ip->i_d.di_format) {
156 	case XFS_DINODE_FMT_EXTENTS:
157 		iip->ili_fields &=
158 			~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT | XFS_ILOG_DEV);
159 
160 		if ((iip->ili_fields & XFS_ILOG_DEXT) &&
161 		    ip->i_d.di_nextents > 0 &&
162 		    ip->i_df.if_bytes > 0) {
163 			struct xfs_bmbt_rec *p;
164 
165 			ASSERT(xfs_iext_count(&ip->i_df) > 0);
166 
167 			p = xlog_prepare_iovec(lv, vecp, XLOG_REG_TYPE_IEXT);
168 			data_bytes = xfs_iextents_copy(ip, p, XFS_DATA_FORK);
169 			xlog_finish_iovec(lv, *vecp, data_bytes);
170 
171 			ASSERT(data_bytes <= ip->i_df.if_bytes);
172 
173 			ilf->ilf_dsize = data_bytes;
174 			ilf->ilf_size++;
175 		} else {
176 			iip->ili_fields &= ~XFS_ILOG_DEXT;
177 		}
178 		break;
179 	case XFS_DINODE_FMT_BTREE:
180 		iip->ili_fields &=
181 			~(XFS_ILOG_DDATA | XFS_ILOG_DEXT | XFS_ILOG_DEV);
182 
183 		if ((iip->ili_fields & XFS_ILOG_DBROOT) &&
184 		    ip->i_df.if_broot_bytes > 0) {
185 			ASSERT(ip->i_df.if_broot != NULL);
186 			xlog_copy_iovec(lv, vecp, XLOG_REG_TYPE_IBROOT,
187 					ip->i_df.if_broot,
188 					ip->i_df.if_broot_bytes);
189 			ilf->ilf_dsize = ip->i_df.if_broot_bytes;
190 			ilf->ilf_size++;
191 		} else {
192 			ASSERT(!(iip->ili_fields &
193 				 XFS_ILOG_DBROOT));
194 			iip->ili_fields &= ~XFS_ILOG_DBROOT;
195 		}
196 		break;
197 	case XFS_DINODE_FMT_LOCAL:
198 		iip->ili_fields &=
199 			~(XFS_ILOG_DEXT | XFS_ILOG_DBROOT | XFS_ILOG_DEV);
200 		if ((iip->ili_fields & XFS_ILOG_DDATA) &&
201 		    ip->i_df.if_bytes > 0) {
202 			/*
203 			 * Round i_bytes up to a word boundary.
204 			 * The underlying memory is guaranteed to
205 			 * to be there by xfs_idata_realloc().
206 			 */
207 			data_bytes = roundup(ip->i_df.if_bytes, 4);
208 			ASSERT(ip->i_df.if_real_bytes == 0 ||
209 			       ip->i_df.if_real_bytes >= data_bytes);
210 			ASSERT(ip->i_df.if_u1.if_data != NULL);
211 			ASSERT(ip->i_d.di_size > 0);
212 			xlog_copy_iovec(lv, vecp, XLOG_REG_TYPE_ILOCAL,
213 					ip->i_df.if_u1.if_data, data_bytes);
214 			ilf->ilf_dsize = (unsigned)data_bytes;
215 			ilf->ilf_size++;
216 		} else {
217 			iip->ili_fields &= ~XFS_ILOG_DDATA;
218 		}
219 		break;
220 	case XFS_DINODE_FMT_DEV:
221 		iip->ili_fields &=
222 			~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT | XFS_ILOG_DEXT);
223 		if (iip->ili_fields & XFS_ILOG_DEV)
224 			ilf->ilf_u.ilfu_rdev = sysv_encode_dev(VFS_I(ip)->i_rdev);
225 		break;
226 	default:
227 		ASSERT(0);
228 		break;
229 	}
230 }
231 
232 STATIC void
233 xfs_inode_item_format_attr_fork(
234 	struct xfs_inode_log_item *iip,
235 	struct xfs_inode_log_format *ilf,
236 	struct xfs_log_vec	*lv,
237 	struct xfs_log_iovec	**vecp)
238 {
239 	struct xfs_inode	*ip = iip->ili_inode;
240 	size_t			data_bytes;
241 
242 	switch (ip->i_d.di_aformat) {
243 	case XFS_DINODE_FMT_EXTENTS:
244 		iip->ili_fields &=
245 			~(XFS_ILOG_ADATA | XFS_ILOG_ABROOT);
246 
247 		if ((iip->ili_fields & XFS_ILOG_AEXT) &&
248 		    ip->i_d.di_anextents > 0 &&
249 		    ip->i_afp->if_bytes > 0) {
250 			struct xfs_bmbt_rec *p;
251 
252 			ASSERT(xfs_iext_count(ip->i_afp) ==
253 				ip->i_d.di_anextents);
254 
255 			p = xlog_prepare_iovec(lv, vecp, XLOG_REG_TYPE_IATTR_EXT);
256 			data_bytes = xfs_iextents_copy(ip, p, XFS_ATTR_FORK);
257 			xlog_finish_iovec(lv, *vecp, data_bytes);
258 
259 			ilf->ilf_asize = data_bytes;
260 			ilf->ilf_size++;
261 		} else {
262 			iip->ili_fields &= ~XFS_ILOG_AEXT;
263 		}
264 		break;
265 	case XFS_DINODE_FMT_BTREE:
266 		iip->ili_fields &=
267 			~(XFS_ILOG_ADATA | XFS_ILOG_AEXT);
268 
269 		if ((iip->ili_fields & XFS_ILOG_ABROOT) &&
270 		    ip->i_afp->if_broot_bytes > 0) {
271 			ASSERT(ip->i_afp->if_broot != NULL);
272 
273 			xlog_copy_iovec(lv, vecp, XLOG_REG_TYPE_IATTR_BROOT,
274 					ip->i_afp->if_broot,
275 					ip->i_afp->if_broot_bytes);
276 			ilf->ilf_asize = ip->i_afp->if_broot_bytes;
277 			ilf->ilf_size++;
278 		} else {
279 			iip->ili_fields &= ~XFS_ILOG_ABROOT;
280 		}
281 		break;
282 	case XFS_DINODE_FMT_LOCAL:
283 		iip->ili_fields &=
284 			~(XFS_ILOG_AEXT | XFS_ILOG_ABROOT);
285 
286 		if ((iip->ili_fields & XFS_ILOG_ADATA) &&
287 		    ip->i_afp->if_bytes > 0) {
288 			/*
289 			 * Round i_bytes up to a word boundary.
290 			 * The underlying memory is guaranteed to
291 			 * to be there by xfs_idata_realloc().
292 			 */
293 			data_bytes = roundup(ip->i_afp->if_bytes, 4);
294 			ASSERT(ip->i_afp->if_real_bytes == 0 ||
295 			       ip->i_afp->if_real_bytes >= data_bytes);
296 			ASSERT(ip->i_afp->if_u1.if_data != NULL);
297 			xlog_copy_iovec(lv, vecp, XLOG_REG_TYPE_IATTR_LOCAL,
298 					ip->i_afp->if_u1.if_data,
299 					data_bytes);
300 			ilf->ilf_asize = (unsigned)data_bytes;
301 			ilf->ilf_size++;
302 		} else {
303 			iip->ili_fields &= ~XFS_ILOG_ADATA;
304 		}
305 		break;
306 	default:
307 		ASSERT(0);
308 		break;
309 	}
310 }
311 
312 static void
313 xfs_inode_to_log_dinode(
314 	struct xfs_inode	*ip,
315 	struct xfs_log_dinode	*to,
316 	xfs_lsn_t		lsn)
317 {
318 	struct xfs_icdinode	*from = &ip->i_d;
319 	struct inode		*inode = VFS_I(ip);
320 
321 	to->di_magic = XFS_DINODE_MAGIC;
322 
323 	to->di_version = from->di_version;
324 	to->di_format = from->di_format;
325 	to->di_uid = from->di_uid;
326 	to->di_gid = from->di_gid;
327 	to->di_projid_lo = from->di_projid_lo;
328 	to->di_projid_hi = from->di_projid_hi;
329 
330 	memset(to->di_pad, 0, sizeof(to->di_pad));
331 	memset(to->di_pad3, 0, sizeof(to->di_pad3));
332 	to->di_atime.t_sec = inode->i_atime.tv_sec;
333 	to->di_atime.t_nsec = inode->i_atime.tv_nsec;
334 	to->di_mtime.t_sec = inode->i_mtime.tv_sec;
335 	to->di_mtime.t_nsec = inode->i_mtime.tv_nsec;
336 	to->di_ctime.t_sec = inode->i_ctime.tv_sec;
337 	to->di_ctime.t_nsec = inode->i_ctime.tv_nsec;
338 	to->di_nlink = inode->i_nlink;
339 	to->di_gen = inode->i_generation;
340 	to->di_mode = inode->i_mode;
341 
342 	to->di_size = from->di_size;
343 	to->di_nblocks = from->di_nblocks;
344 	to->di_extsize = from->di_extsize;
345 	to->di_nextents = from->di_nextents;
346 	to->di_anextents = from->di_anextents;
347 	to->di_forkoff = from->di_forkoff;
348 	to->di_aformat = from->di_aformat;
349 	to->di_dmevmask = from->di_dmevmask;
350 	to->di_dmstate = from->di_dmstate;
351 	to->di_flags = from->di_flags;
352 
353 	/* log a dummy value to ensure log structure is fully initialised */
354 	to->di_next_unlinked = NULLAGINO;
355 
356 	if (from->di_version == 3) {
357 		to->di_changecount = inode->i_version;
358 		to->di_crtime.t_sec = from->di_crtime.t_sec;
359 		to->di_crtime.t_nsec = from->di_crtime.t_nsec;
360 		to->di_flags2 = from->di_flags2;
361 		to->di_cowextsize = from->di_cowextsize;
362 		to->di_ino = ip->i_ino;
363 		to->di_lsn = lsn;
364 		memset(to->di_pad2, 0, sizeof(to->di_pad2));
365 		uuid_copy(&to->di_uuid, &ip->i_mount->m_sb.sb_meta_uuid);
366 		to->di_flushiter = 0;
367 	} else {
368 		to->di_flushiter = from->di_flushiter;
369 	}
370 }
371 
372 /*
373  * Format the inode core. Current timestamp data is only in the VFS inode
374  * fields, so we need to grab them from there. Hence rather than just copying
375  * the XFS inode core structure, format the fields directly into the iovec.
376  */
377 static void
378 xfs_inode_item_format_core(
379 	struct xfs_inode	*ip,
380 	struct xfs_log_vec	*lv,
381 	struct xfs_log_iovec	**vecp)
382 {
383 	struct xfs_log_dinode	*dic;
384 
385 	dic = xlog_prepare_iovec(lv, vecp, XLOG_REG_TYPE_ICORE);
386 	xfs_inode_to_log_dinode(ip, dic, ip->i_itemp->ili_item.li_lsn);
387 	xlog_finish_iovec(lv, *vecp, xfs_log_dinode_size(ip->i_d.di_version));
388 }
389 
390 /*
391  * This is called to fill in the vector of log iovecs for the given inode
392  * log item.  It fills the first item with an inode log format structure,
393  * the second with the on-disk inode structure, and a possible third and/or
394  * fourth with the inode data/extents/b-tree root and inode attributes
395  * data/extents/b-tree root.
396  *
397  * Note: Always use the 64 bit inode log format structure so we don't
398  * leave an uninitialised hole in the format item on 64 bit systems. Log
399  * recovery on 32 bit systems handles this just fine, so there's no reason
400  * for not using an initialising the properly padded structure all the time.
401  */
402 STATIC void
403 xfs_inode_item_format(
404 	struct xfs_log_item	*lip,
405 	struct xfs_log_vec	*lv)
406 {
407 	struct xfs_inode_log_item *iip = INODE_ITEM(lip);
408 	struct xfs_inode	*ip = iip->ili_inode;
409 	struct xfs_log_iovec	*vecp = NULL;
410 	struct xfs_inode_log_format *ilf;
411 
412 	ASSERT(ip->i_d.di_version > 1);
413 
414 	ilf = xlog_prepare_iovec(lv, &vecp, XLOG_REG_TYPE_IFORMAT);
415 	ilf->ilf_type = XFS_LI_INODE;
416 	ilf->ilf_ino = ip->i_ino;
417 	ilf->ilf_blkno = ip->i_imap.im_blkno;
418 	ilf->ilf_len = ip->i_imap.im_len;
419 	ilf->ilf_boffset = ip->i_imap.im_boffset;
420 	ilf->ilf_fields = XFS_ILOG_CORE;
421 	ilf->ilf_size = 2; /* format + core */
422 
423 	/*
424 	 * make sure we don't leak uninitialised data into the log in the case
425 	 * when we don't log every field in the inode.
426 	 */
427 	ilf->ilf_dsize = 0;
428 	ilf->ilf_asize = 0;
429 	ilf->ilf_pad = 0;
430 	memset(&ilf->ilf_u, 0, sizeof(ilf->ilf_u));
431 
432 	xlog_finish_iovec(lv, vecp, sizeof(*ilf));
433 
434 	xfs_inode_item_format_core(ip, lv, &vecp);
435 	xfs_inode_item_format_data_fork(iip, ilf, lv, &vecp);
436 	if (XFS_IFORK_Q(ip)) {
437 		xfs_inode_item_format_attr_fork(iip, ilf, lv, &vecp);
438 	} else {
439 		iip->ili_fields &=
440 			~(XFS_ILOG_ADATA | XFS_ILOG_ABROOT | XFS_ILOG_AEXT);
441 	}
442 
443 	/* update the format with the exact fields we actually logged */
444 	ilf->ilf_fields |= (iip->ili_fields & ~XFS_ILOG_TIMESTAMP);
445 }
446 
447 /*
448  * This is called to pin the inode associated with the inode log
449  * item in memory so it cannot be written out.
450  */
451 STATIC void
452 xfs_inode_item_pin(
453 	struct xfs_log_item	*lip)
454 {
455 	struct xfs_inode	*ip = INODE_ITEM(lip)->ili_inode;
456 
457 	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
458 
459 	trace_xfs_inode_pin(ip, _RET_IP_);
460 	atomic_inc(&ip->i_pincount);
461 }
462 
463 
464 /*
465  * This is called to unpin the inode associated with the inode log
466  * item which was previously pinned with a call to xfs_inode_item_pin().
467  *
468  * Also wake up anyone in xfs_iunpin_wait() if the count goes to 0.
469  */
470 STATIC void
471 xfs_inode_item_unpin(
472 	struct xfs_log_item	*lip,
473 	int			remove)
474 {
475 	struct xfs_inode	*ip = INODE_ITEM(lip)->ili_inode;
476 
477 	trace_xfs_inode_unpin(ip, _RET_IP_);
478 	ASSERT(atomic_read(&ip->i_pincount) > 0);
479 	if (atomic_dec_and_test(&ip->i_pincount))
480 		wake_up_bit(&ip->i_flags, __XFS_IPINNED_BIT);
481 }
482 
483 /*
484  * Callback used to mark a buffer with XFS_LI_FAILED when items in the buffer
485  * have been failed during writeback
486  *
487  * This informs the AIL that the inode is already flush locked on the next push,
488  * and acquires a hold on the buffer to ensure that it isn't reclaimed before
489  * dirty data makes it to disk.
490  */
491 STATIC void
492 xfs_inode_item_error(
493 	struct xfs_log_item	*lip,
494 	struct xfs_buf		*bp)
495 {
496 	ASSERT(xfs_isiflocked(INODE_ITEM(lip)->ili_inode));
497 	xfs_set_li_failed(lip, bp);
498 }
499 
500 STATIC uint
501 xfs_inode_item_push(
502 	struct xfs_log_item	*lip,
503 	struct list_head	*buffer_list)
504 		__releases(&lip->li_ailp->xa_lock)
505 		__acquires(&lip->li_ailp->xa_lock)
506 {
507 	struct xfs_inode_log_item *iip = INODE_ITEM(lip);
508 	struct xfs_inode	*ip = iip->ili_inode;
509 	struct xfs_buf		*bp = lip->li_buf;
510 	uint			rval = XFS_ITEM_SUCCESS;
511 	int			error;
512 
513 	if (xfs_ipincount(ip) > 0)
514 		return XFS_ITEM_PINNED;
515 
516 	/*
517 	 * The buffer containing this item failed to be written back
518 	 * previously. Resubmit the buffer for IO.
519 	 */
520 	if (lip->li_flags & XFS_LI_FAILED) {
521 		if (!xfs_buf_trylock(bp))
522 			return XFS_ITEM_LOCKED;
523 
524 		if (!xfs_buf_resubmit_failed_buffers(bp, lip, buffer_list))
525 			rval = XFS_ITEM_FLUSHING;
526 
527 		xfs_buf_unlock(bp);
528 		return rval;
529 	}
530 
531 	if (!xfs_ilock_nowait(ip, XFS_ILOCK_SHARED))
532 		return XFS_ITEM_LOCKED;
533 
534 	/*
535 	 * Re-check the pincount now that we stabilized the value by
536 	 * taking the ilock.
537 	 */
538 	if (xfs_ipincount(ip) > 0) {
539 		rval = XFS_ITEM_PINNED;
540 		goto out_unlock;
541 	}
542 
543 	/*
544 	 * Stale inode items should force out the iclog.
545 	 */
546 	if (ip->i_flags & XFS_ISTALE) {
547 		rval = XFS_ITEM_PINNED;
548 		goto out_unlock;
549 	}
550 
551 	/*
552 	 * Someone else is already flushing the inode.  Nothing we can do
553 	 * here but wait for the flush to finish and remove the item from
554 	 * the AIL.
555 	 */
556 	if (!xfs_iflock_nowait(ip)) {
557 		rval = XFS_ITEM_FLUSHING;
558 		goto out_unlock;
559 	}
560 
561 	ASSERT(iip->ili_fields != 0 || XFS_FORCED_SHUTDOWN(ip->i_mount));
562 	ASSERT(iip->ili_logged == 0 || XFS_FORCED_SHUTDOWN(ip->i_mount));
563 
564 	spin_unlock(&lip->li_ailp->xa_lock);
565 
566 	error = xfs_iflush(ip, &bp);
567 	if (!error) {
568 		if (!xfs_buf_delwri_queue(bp, buffer_list))
569 			rval = XFS_ITEM_FLUSHING;
570 		xfs_buf_relse(bp);
571 	}
572 
573 	spin_lock(&lip->li_ailp->xa_lock);
574 out_unlock:
575 	xfs_iunlock(ip, XFS_ILOCK_SHARED);
576 	return rval;
577 }
578 
579 /*
580  * Unlock the inode associated with the inode log item.
581  * Clear the fields of the inode and inode log item that
582  * are specific to the current transaction.  If the
583  * hold flags is set, do not unlock the inode.
584  */
585 STATIC void
586 xfs_inode_item_unlock(
587 	struct xfs_log_item	*lip)
588 {
589 	struct xfs_inode_log_item *iip = INODE_ITEM(lip);
590 	struct xfs_inode	*ip = iip->ili_inode;
591 	unsigned short		lock_flags;
592 
593 	ASSERT(ip->i_itemp != NULL);
594 	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
595 
596 	lock_flags = iip->ili_lock_flags;
597 	iip->ili_lock_flags = 0;
598 	if (lock_flags)
599 		xfs_iunlock(ip, lock_flags);
600 }
601 
602 /*
603  * This is called to find out where the oldest active copy of the inode log
604  * item in the on disk log resides now that the last log write of it completed
605  * at the given lsn.  Since we always re-log all dirty data in an inode, the
606  * latest copy in the on disk log is the only one that matters.  Therefore,
607  * simply return the given lsn.
608  *
609  * If the inode has been marked stale because the cluster is being freed, we
610  * don't want to (re-)insert this inode into the AIL. There is a race condition
611  * where the cluster buffer may be unpinned before the inode is inserted into
612  * the AIL during transaction committed processing. If the buffer is unpinned
613  * before the inode item has been committed and inserted, then it is possible
614  * for the buffer to be written and IO completes before the inode is inserted
615  * into the AIL. In that case, we'd be inserting a clean, stale inode into the
616  * AIL which will never get removed. It will, however, get reclaimed which
617  * triggers an assert in xfs_inode_free() complaining about freein an inode
618  * still in the AIL.
619  *
620  * To avoid this, just unpin the inode directly and return a LSN of -1 so the
621  * transaction committed code knows that it does not need to do any further
622  * processing on the item.
623  */
624 STATIC xfs_lsn_t
625 xfs_inode_item_committed(
626 	struct xfs_log_item	*lip,
627 	xfs_lsn_t		lsn)
628 {
629 	struct xfs_inode_log_item *iip = INODE_ITEM(lip);
630 	struct xfs_inode	*ip = iip->ili_inode;
631 
632 	if (xfs_iflags_test(ip, XFS_ISTALE)) {
633 		xfs_inode_item_unpin(lip, 0);
634 		return -1;
635 	}
636 	return lsn;
637 }
638 
639 /*
640  * XXX rcc - this one really has to do something.  Probably needs
641  * to stamp in a new field in the incore inode.
642  */
643 STATIC void
644 xfs_inode_item_committing(
645 	struct xfs_log_item	*lip,
646 	xfs_lsn_t		lsn)
647 {
648 	INODE_ITEM(lip)->ili_last_lsn = lsn;
649 }
650 
651 /*
652  * This is the ops vector shared by all buf log items.
653  */
654 static const struct xfs_item_ops xfs_inode_item_ops = {
655 	.iop_size	= xfs_inode_item_size,
656 	.iop_format	= xfs_inode_item_format,
657 	.iop_pin	= xfs_inode_item_pin,
658 	.iop_unpin	= xfs_inode_item_unpin,
659 	.iop_unlock	= xfs_inode_item_unlock,
660 	.iop_committed	= xfs_inode_item_committed,
661 	.iop_push	= xfs_inode_item_push,
662 	.iop_committing = xfs_inode_item_committing,
663 	.iop_error	= xfs_inode_item_error
664 };
665 
666 
667 /*
668  * Initialize the inode log item for a newly allocated (in-core) inode.
669  */
670 void
671 xfs_inode_item_init(
672 	struct xfs_inode	*ip,
673 	struct xfs_mount	*mp)
674 {
675 	struct xfs_inode_log_item *iip;
676 
677 	ASSERT(ip->i_itemp == NULL);
678 	iip = ip->i_itemp = kmem_zone_zalloc(xfs_ili_zone, KM_SLEEP);
679 
680 	iip->ili_inode = ip;
681 	xfs_log_item_init(mp, &iip->ili_item, XFS_LI_INODE,
682 						&xfs_inode_item_ops);
683 }
684 
685 /*
686  * Free the inode log item and any memory hanging off of it.
687  */
688 void
689 xfs_inode_item_destroy(
690 	xfs_inode_t	*ip)
691 {
692 	kmem_free(ip->i_itemp->ili_item.li_lv_shadow);
693 	kmem_zone_free(xfs_ili_zone, ip->i_itemp);
694 }
695 
696 
697 /*
698  * This is the inode flushing I/O completion routine.  It is called
699  * from interrupt level when the buffer containing the inode is
700  * flushed to disk.  It is responsible for removing the inode item
701  * from the AIL if it has not been re-logged, and unlocking the inode's
702  * flush lock.
703  *
704  * To reduce AIL lock traffic as much as possible, we scan the buffer log item
705  * list for other inodes that will run this function. We remove them from the
706  * buffer list so we can process all the inode IO completions in one AIL lock
707  * traversal.
708  */
709 void
710 xfs_iflush_done(
711 	struct xfs_buf		*bp,
712 	struct xfs_log_item	*lip)
713 {
714 	struct xfs_inode_log_item *iip;
715 	struct xfs_log_item	*blip;
716 	struct xfs_log_item	*next;
717 	struct xfs_log_item	*prev;
718 	struct xfs_ail		*ailp = lip->li_ailp;
719 	int			need_ail = 0;
720 
721 	/*
722 	 * Scan the buffer IO completions for other inodes being completed and
723 	 * attach them to the current inode log item.
724 	 */
725 	blip = bp->b_fspriv;
726 	prev = NULL;
727 	while (blip != NULL) {
728 		if (blip->li_cb != xfs_iflush_done) {
729 			prev = blip;
730 			blip = blip->li_bio_list;
731 			continue;
732 		}
733 
734 		/* remove from list */
735 		next = blip->li_bio_list;
736 		if (!prev) {
737 			bp->b_fspriv = next;
738 		} else {
739 			prev->li_bio_list = next;
740 		}
741 
742 		/* add to current list */
743 		blip->li_bio_list = lip->li_bio_list;
744 		lip->li_bio_list = blip;
745 
746 		/*
747 		 * while we have the item, do the unlocked check for needing
748 		 * the AIL lock.
749 		 */
750 		iip = INODE_ITEM(blip);
751 		if ((iip->ili_logged && blip->li_lsn == iip->ili_flush_lsn) ||
752 		    (blip->li_flags & XFS_LI_FAILED))
753 			need_ail++;
754 
755 		blip = next;
756 	}
757 
758 	/* make sure we capture the state of the initial inode. */
759 	iip = INODE_ITEM(lip);
760 	if ((iip->ili_logged && lip->li_lsn == iip->ili_flush_lsn) ||
761 	    lip->li_flags & XFS_LI_FAILED)
762 		need_ail++;
763 
764 	/*
765 	 * We only want to pull the item from the AIL if it is
766 	 * actually there and its location in the log has not
767 	 * changed since we started the flush.  Thus, we only bother
768 	 * if the ili_logged flag is set and the inode's lsn has not
769 	 * changed.  First we check the lsn outside
770 	 * the lock since it's cheaper, and then we recheck while
771 	 * holding the lock before removing the inode from the AIL.
772 	 */
773 	if (need_ail) {
774 		bool			mlip_changed = false;
775 
776 		/* this is an opencoded batch version of xfs_trans_ail_delete */
777 		spin_lock(&ailp->xa_lock);
778 		for (blip = lip; blip; blip = blip->li_bio_list) {
779 			if (INODE_ITEM(blip)->ili_logged &&
780 			    blip->li_lsn == INODE_ITEM(blip)->ili_flush_lsn)
781 				mlip_changed |= xfs_ail_delete_one(ailp, blip);
782 			else {
783 				xfs_clear_li_failed(blip);
784 			}
785 		}
786 
787 		if (mlip_changed) {
788 			if (!XFS_FORCED_SHUTDOWN(ailp->xa_mount))
789 				xlog_assign_tail_lsn_locked(ailp->xa_mount);
790 			if (list_empty(&ailp->xa_ail))
791 				wake_up_all(&ailp->xa_empty);
792 		}
793 		spin_unlock(&ailp->xa_lock);
794 
795 		if (mlip_changed)
796 			xfs_log_space_wake(ailp->xa_mount);
797 	}
798 
799 	/*
800 	 * clean up and unlock the flush lock now we are done. We can clear the
801 	 * ili_last_fields bits now that we know that the data corresponding to
802 	 * them is safely on disk.
803 	 */
804 	for (blip = lip; blip; blip = next) {
805 		next = blip->li_bio_list;
806 		blip->li_bio_list = NULL;
807 
808 		iip = INODE_ITEM(blip);
809 		iip->ili_logged = 0;
810 		iip->ili_last_fields = 0;
811 		xfs_ifunlock(iip->ili_inode);
812 	}
813 }
814 
815 /*
816  * This is the inode flushing abort routine.  It is called from xfs_iflush when
817  * the filesystem is shutting down to clean up the inode state.  It is
818  * responsible for removing the inode item from the AIL if it has not been
819  * re-logged, and unlocking the inode's flush lock.
820  */
821 void
822 xfs_iflush_abort(
823 	xfs_inode_t		*ip,
824 	bool			stale)
825 {
826 	xfs_inode_log_item_t	*iip = ip->i_itemp;
827 
828 	if (iip) {
829 		if (iip->ili_item.li_flags & XFS_LI_IN_AIL) {
830 			xfs_trans_ail_remove(&iip->ili_item,
831 					     stale ? SHUTDOWN_LOG_IO_ERROR :
832 						     SHUTDOWN_CORRUPT_INCORE);
833 		}
834 		iip->ili_logged = 0;
835 		/*
836 		 * Clear the ili_last_fields bits now that we know that the
837 		 * data corresponding to them is safely on disk.
838 		 */
839 		iip->ili_last_fields = 0;
840 		/*
841 		 * Clear the inode logging fields so no more flushes are
842 		 * attempted.
843 		 */
844 		iip->ili_fields = 0;
845 		iip->ili_fsync_fields = 0;
846 	}
847 	/*
848 	 * Release the inode's flush lock since we're done with it.
849 	 */
850 	xfs_ifunlock(ip);
851 }
852 
853 void
854 xfs_istale_done(
855 	struct xfs_buf		*bp,
856 	struct xfs_log_item	*lip)
857 {
858 	xfs_iflush_abort(INODE_ITEM(lip)->ili_inode, true);
859 }
860 
861 /*
862  * convert an xfs_inode_log_format struct from the old 32 bit version
863  * (which can have different field alignments) to the native 64 bit version
864  */
865 int
866 xfs_inode_item_format_convert(
867 	struct xfs_log_iovec		*buf,
868 	struct xfs_inode_log_format	*in_f)
869 {
870 	struct xfs_inode_log_format_32	*in_f32 = buf->i_addr;
871 
872 	if (buf->i_len != sizeof(*in_f32))
873 		return -EFSCORRUPTED;
874 
875 	in_f->ilf_type = in_f32->ilf_type;
876 	in_f->ilf_size = in_f32->ilf_size;
877 	in_f->ilf_fields = in_f32->ilf_fields;
878 	in_f->ilf_asize = in_f32->ilf_asize;
879 	in_f->ilf_dsize = in_f32->ilf_dsize;
880 	in_f->ilf_ino = in_f32->ilf_ino;
881 	memcpy(&in_f->ilf_u, &in_f32->ilf_u, sizeof(in_f->ilf_u));
882 	in_f->ilf_blkno = in_f32->ilf_blkno;
883 	in_f->ilf_len = in_f32->ilf_len;
884 	in_f->ilf_boffset = in_f32->ilf_boffset;
885 	return 0;
886 }
887