Lines Matching +full:ip +full:- +full:core
1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc.
37 return INODE_ITEM(lip)->ili_inode->i_ino; in xfs_inode_item_sort()
43 struct xfs_inode *ip) in xfs_inode_item_precommit_check() argument
45 struct xfs_mount *mp = ip->i_mount; in xfs_inode_item_precommit_check()
49 dip = kzalloc(mp->m_sb.sb_inodesize, GFP_KERNEL | GFP_NOFS); in xfs_inode_item_precommit_check()
55 xfs_inode_to_disk(ip, dip, 0); in xfs_inode_item_precommit_check()
57 fa = xfs_dinode_verify(mp, ip->i_ino, dip); in xfs_inode_item_precommit_check()
59 xfs_inode_verifier_error(ip, -EFSCORRUPTED, __func__, dip, in xfs_inode_item_precommit_check()
67 # define xfs_inode_item_precommit_check(ip) ((void)0) argument
72 * per-modification inode state changes are applied. This includes VFS inode
78 * require AGI -> inode cluster buffer lock order. The inode cluster buffer is
79 * not locked until ->precommit, so it happens after everything else has been
82 * Further, we have AGI -> AGF lock ordering, and with O_TMPFILE handling we
83 * have AGI -> AGF -> iunlink item -> inode cluster buffer lock order. Hence we
90 * move the pinning of the inode cluster buffer to a ->precommit operation. This
93 * transaction. i.e. we ensure the lock order is always AGI -> AGF -> inode
106 struct xfs_inode *ip = iip->ili_inode; in xfs_inode_item_precommit() local
107 struct inode *inode = VFS_I(ip); in xfs_inode_item_precommit()
108 unsigned int flags = iip->ili_dirty_flags; in xfs_inode_item_precommit()
112 * don't matter - we either will need an extra transaction in 24 hours in xfs_inode_item_precommit()
116 if (inode->i_state & I_DIRTY_TIME) { in xfs_inode_item_precommit()
117 spin_lock(&inode->i_lock); in xfs_inode_item_precommit()
118 inode->i_state &= ~I_DIRTY_TIME; in xfs_inode_item_precommit()
119 spin_unlock(&inode->i_lock); in xfs_inode_item_precommit()
123 * If we're updating the inode core or the timestamps and it's possible in xfs_inode_item_precommit()
127 xfs_has_bigtime(ip->i_mount) && in xfs_inode_item_precommit()
128 !xfs_inode_has_bigtime(ip)) { in xfs_inode_item_precommit()
129 ip->i_diflags2 |= XFS_DIFLAG2_BIGTIME; in xfs_inode_item_precommit()
139 if ((ip->i_diflags & XFS_DIFLAG_RTINHERIT) && in xfs_inode_item_precommit()
140 (ip->i_diflags & XFS_DIFLAG_EXTSZINHERIT) && in xfs_inode_item_precommit()
141 xfs_extlen_to_rtxmod(ip->i_mount, ip->i_extsize) > 0) { in xfs_inode_item_precommit()
142 ip->i_diflags &= ~(XFS_DIFLAG_EXTSIZE | in xfs_inode_item_precommit()
144 ip->i_extsize = 0; in xfs_inode_item_precommit()
152 * to XFS_ILOG_CORE so that the actual on-disk dirty tracking in xfs_inode_item_precommit()
155 spin_lock(&iip->ili_lock); in xfs_inode_item_precommit()
156 iip->ili_fsync_fields |= (flags & ~XFS_ILOG_IVERSION); in xfs_inode_item_precommit()
166 if ((ip->i_diflags & XFS_DIFLAG_RTINHERIT) && in xfs_inode_item_precommit()
167 (ip->i_diflags2 & XFS_DIFLAG2_COWEXTSIZE) && in xfs_inode_item_precommit()
168 xfs_extlen_to_rtxmod(ip->i_mount, ip->i_cowextsize) > 0) { in xfs_inode_item_precommit()
169 ip->i_diflags2 &= ~XFS_DIFLAG2_COWEXTSIZE; in xfs_inode_item_precommit()
170 ip->i_cowextsize = 0; in xfs_inode_item_precommit()
174 if (!iip->ili_item.li_buf) { in xfs_inode_item_precommit()
187 spin_unlock(&iip->ili_lock); in xfs_inode_item_precommit()
188 error = xfs_imap_to_bp(ip->i_mount, tp, &ip->i_imap, &bp); in xfs_inode_item_precommit()
200 spin_lock(&iip->ili_lock); in xfs_inode_item_precommit()
201 iip->ili_item.li_buf = bp; in xfs_inode_item_precommit()
202 bp->b_iodone = xfs_buf_inode_iodone; in xfs_inode_item_precommit()
203 list_add_tail(&iip->ili_item.li_bio_list, &bp->b_li_list); in xfs_inode_item_precommit()
213 iip->ili_fields |= (flags | iip->ili_last_fields); in xfs_inode_item_precommit()
214 spin_unlock(&iip->ili_lock); in xfs_inode_item_precommit()
216 xfs_inode_item_precommit_check(ip); in xfs_inode_item_precommit()
222 iip->ili_dirty_flags = 0; in xfs_inode_item_precommit()
236 * inode gets -smaller- rather than stays the same size as the previously logged
246 struct xfs_inode *ip = iip->ili_inode; in xfs_inode_item_data_fork_size() local
248 switch (ip->i_df.if_format) { in xfs_inode_item_data_fork_size()
250 if ((iip->ili_fields & XFS_ILOG_DEXT) && in xfs_inode_item_data_fork_size()
251 ip->i_df.if_nextents > 0 && in xfs_inode_item_data_fork_size()
252 ip->i_df.if_bytes > 0) { in xfs_inode_item_data_fork_size()
254 *nbytes += xfs_inode_data_fork_size(ip); in xfs_inode_item_data_fork_size()
260 if ((iip->ili_fields & XFS_ILOG_DBROOT) && in xfs_inode_item_data_fork_size()
261 ip->i_df.if_broot_bytes > 0) { in xfs_inode_item_data_fork_size()
262 *nbytes += ip->i_df.if_broot_bytes; in xfs_inode_item_data_fork_size()
267 if ((iip->ili_fields & XFS_ILOG_DDATA) && in xfs_inode_item_data_fork_size()
268 ip->i_df.if_bytes > 0) { in xfs_inode_item_data_fork_size()
269 *nbytes += xlog_calc_iovec_len(ip->i_df.if_bytes); in xfs_inode_item_data_fork_size()
288 struct xfs_inode *ip = iip->ili_inode; in xfs_inode_item_attr_fork_size() local
290 switch (ip->i_af.if_format) { in xfs_inode_item_attr_fork_size()
292 if ((iip->ili_fields & XFS_ILOG_AEXT) && in xfs_inode_item_attr_fork_size()
293 ip->i_af.if_nextents > 0 && in xfs_inode_item_attr_fork_size()
294 ip->i_af.if_bytes > 0) { in xfs_inode_item_attr_fork_size()
296 *nbytes += xfs_inode_attr_fork_size(ip); in xfs_inode_item_attr_fork_size()
301 if ((iip->ili_fields & XFS_ILOG_ABROOT) && in xfs_inode_item_attr_fork_size()
302 ip->i_af.if_broot_bytes > 0) { in xfs_inode_item_attr_fork_size()
303 *nbytes += ip->i_af.if_broot_bytes; in xfs_inode_item_attr_fork_size()
308 if ((iip->ili_fields & XFS_ILOG_ADATA) && in xfs_inode_item_attr_fork_size()
309 ip->i_af.if_bytes > 0) { in xfs_inode_item_attr_fork_size()
310 *nbytes += xlog_calc_iovec_len(ip->i_af.if_bytes); in xfs_inode_item_attr_fork_size()
324 * inode core, and possibly one for the inode data/extents/b-tree root
325 * and one for the inode attribute data/extents/b-tree root.
334 struct xfs_inode *ip = iip->ili_inode; in xfs_inode_item_size() local
338 xfs_log_dinode_size(ip->i_mount); in xfs_inode_item_size()
341 if (xfs_inode_has_attr_fork(ip)) in xfs_inode_item_size()
352 struct xfs_inode *ip = iip->ili_inode; in xfs_inode_item_format_data_fork() local
355 switch (ip->i_df.if_format) { in xfs_inode_item_format_data_fork()
357 iip->ili_fields &= in xfs_inode_item_format_data_fork()
360 if ((iip->ili_fields & XFS_ILOG_DEXT) && in xfs_inode_item_format_data_fork()
361 ip->i_df.if_nextents > 0 && in xfs_inode_item_format_data_fork()
362 ip->i_df.if_bytes > 0) { in xfs_inode_item_format_data_fork()
365 ASSERT(xfs_iext_count(&ip->i_df) > 0); in xfs_inode_item_format_data_fork()
368 data_bytes = xfs_iextents_copy(ip, p, XFS_DATA_FORK); in xfs_inode_item_format_data_fork()
371 ASSERT(data_bytes <= ip->i_df.if_bytes); in xfs_inode_item_format_data_fork()
373 ilf->ilf_dsize = data_bytes; in xfs_inode_item_format_data_fork()
374 ilf->ilf_size++; in xfs_inode_item_format_data_fork()
376 iip->ili_fields &= ~XFS_ILOG_DEXT; in xfs_inode_item_format_data_fork()
381 iip->ili_fields &= in xfs_inode_item_format_data_fork()
384 if ((iip->ili_fields & XFS_ILOG_DBROOT) && in xfs_inode_item_format_data_fork()
385 ip->i_df.if_broot_bytes > 0) { in xfs_inode_item_format_data_fork()
386 ASSERT(ip->i_df.if_broot != NULL); in xfs_inode_item_format_data_fork()
388 ip->i_df.if_broot, in xfs_inode_item_format_data_fork()
389 ip->i_df.if_broot_bytes); in xfs_inode_item_format_data_fork()
390 ilf->ilf_dsize = ip->i_df.if_broot_bytes; in xfs_inode_item_format_data_fork()
391 ilf->ilf_size++; in xfs_inode_item_format_data_fork()
393 ASSERT(!(iip->ili_fields & in xfs_inode_item_format_data_fork()
395 iip->ili_fields &= ~XFS_ILOG_DBROOT; in xfs_inode_item_format_data_fork()
399 iip->ili_fields &= in xfs_inode_item_format_data_fork()
401 if ((iip->ili_fields & XFS_ILOG_DDATA) && in xfs_inode_item_format_data_fork()
402 ip->i_df.if_bytes > 0) { in xfs_inode_item_format_data_fork()
403 ASSERT(ip->i_df.if_data != NULL); in xfs_inode_item_format_data_fork()
404 ASSERT(ip->i_disk_size > 0); in xfs_inode_item_format_data_fork()
406 ip->i_df.if_data, ip->i_df.if_bytes); in xfs_inode_item_format_data_fork()
407 ilf->ilf_dsize = (unsigned)ip->i_df.if_bytes; in xfs_inode_item_format_data_fork()
408 ilf->ilf_size++; in xfs_inode_item_format_data_fork()
410 iip->ili_fields &= ~XFS_ILOG_DDATA; in xfs_inode_item_format_data_fork()
414 iip->ili_fields &= in xfs_inode_item_format_data_fork()
416 if (iip->ili_fields & XFS_ILOG_DEV) in xfs_inode_item_format_data_fork()
417 ilf->ilf_u.ilfu_rdev = sysv_encode_dev(VFS_I(ip)->i_rdev); in xfs_inode_item_format_data_fork()
432 struct xfs_inode *ip = iip->ili_inode; in xfs_inode_item_format_attr_fork() local
435 switch (ip->i_af.if_format) { in xfs_inode_item_format_attr_fork()
437 iip->ili_fields &= in xfs_inode_item_format_attr_fork()
440 if ((iip->ili_fields & XFS_ILOG_AEXT) && in xfs_inode_item_format_attr_fork()
441 ip->i_af.if_nextents > 0 && in xfs_inode_item_format_attr_fork()
442 ip->i_af.if_bytes > 0) { in xfs_inode_item_format_attr_fork()
445 ASSERT(xfs_iext_count(&ip->i_af) == in xfs_inode_item_format_attr_fork()
446 ip->i_af.if_nextents); in xfs_inode_item_format_attr_fork()
449 data_bytes = xfs_iextents_copy(ip, p, XFS_ATTR_FORK); in xfs_inode_item_format_attr_fork()
452 ilf->ilf_asize = data_bytes; in xfs_inode_item_format_attr_fork()
453 ilf->ilf_size++; in xfs_inode_item_format_attr_fork()
455 iip->ili_fields &= ~XFS_ILOG_AEXT; in xfs_inode_item_format_attr_fork()
459 iip->ili_fields &= in xfs_inode_item_format_attr_fork()
462 if ((iip->ili_fields & XFS_ILOG_ABROOT) && in xfs_inode_item_format_attr_fork()
463 ip->i_af.if_broot_bytes > 0) { in xfs_inode_item_format_attr_fork()
464 ASSERT(ip->i_af.if_broot != NULL); in xfs_inode_item_format_attr_fork()
467 ip->i_af.if_broot, in xfs_inode_item_format_attr_fork()
468 ip->i_af.if_broot_bytes); in xfs_inode_item_format_attr_fork()
469 ilf->ilf_asize = ip->i_af.if_broot_bytes; in xfs_inode_item_format_attr_fork()
470 ilf->ilf_size++; in xfs_inode_item_format_attr_fork()
472 iip->ili_fields &= ~XFS_ILOG_ABROOT; in xfs_inode_item_format_attr_fork()
476 iip->ili_fields &= in xfs_inode_item_format_attr_fork()
479 if ((iip->ili_fields & XFS_ILOG_ADATA) && in xfs_inode_item_format_attr_fork()
480 ip->i_af.if_bytes > 0) { in xfs_inode_item_format_attr_fork()
481 ASSERT(ip->i_af.if_data != NULL); in xfs_inode_item_format_attr_fork()
483 ip->i_af.if_data, ip->i_af.if_bytes); in xfs_inode_item_format_attr_fork()
484 ilf->ilf_asize = (unsigned)ip->i_af.if_bytes; in xfs_inode_item_format_attr_fork()
485 ilf->ilf_size++; in xfs_inode_item_format_attr_fork()
487 iip->ili_fields &= ~XFS_ILOG_ADATA; in xfs_inode_item_format_attr_fork()
502 struct xfs_inode *ip, in xfs_inode_to_log_dinode_ts() argument
508 if (xfs_inode_has_bigtime(ip)) in xfs_inode_to_log_dinode_ts()
512 lits->t_sec = tv.tv_sec; in xfs_inode_to_log_dinode_ts()
513 lits->t_nsec = tv.tv_nsec; in xfs_inode_to_log_dinode_ts()
519 * The legacy DMAPI fields are only present in the on-disk and in-log inodes,
520 * but not in the in-memory one. But we are guaranteed to have an inode buffer
521 * in memory when logging an inode, so we can just copy it from the on-disk
522 * inode to the in-log inode here so that recovery of file system with these
523 * fields set to non-zero values doesn't lose them. For all other cases we zero
528 struct xfs_inode *ip, in xfs_copy_dm_fields_to_log_dinode() argument
533 dip = xfs_buf_offset(ip->i_itemp->ili_item.li_buf, in xfs_copy_dm_fields_to_log_dinode()
534 ip->i_imap.im_boffset); in xfs_copy_dm_fields_to_log_dinode()
536 if (xfs_iflags_test(ip, XFS_IPRESERVE_DM_FIELDS)) { in xfs_copy_dm_fields_to_log_dinode()
537 to->di_dmevmask = be32_to_cpu(dip->di_dmevmask); in xfs_copy_dm_fields_to_log_dinode()
538 to->di_dmstate = be16_to_cpu(dip->di_dmstate); in xfs_copy_dm_fields_to_log_dinode()
540 to->di_dmevmask = 0; in xfs_copy_dm_fields_to_log_dinode()
541 to->di_dmstate = 0; in xfs_copy_dm_fields_to_log_dinode()
547 struct xfs_inode *ip, in xfs_inode_to_log_dinode_iext_counters() argument
550 if (xfs_inode_has_large_extent_counts(ip)) { in xfs_inode_to_log_dinode_iext_counters()
551 to->di_big_nextents = xfs_ifork_nextents(&ip->i_df); in xfs_inode_to_log_dinode_iext_counters()
552 to->di_big_anextents = xfs_ifork_nextents(&ip->i_af); in xfs_inode_to_log_dinode_iext_counters()
553 to->di_nrext64_pad = 0; in xfs_inode_to_log_dinode_iext_counters()
555 to->di_nextents = xfs_ifork_nextents(&ip->i_df); in xfs_inode_to_log_dinode_iext_counters()
556 to->di_anextents = xfs_ifork_nextents(&ip->i_af); in xfs_inode_to_log_dinode_iext_counters()
562 struct xfs_inode *ip, in xfs_inode_to_log_dinode() argument
566 struct inode *inode = VFS_I(ip); in xfs_inode_to_log_dinode()
568 to->di_magic = XFS_DINODE_MAGIC; in xfs_inode_to_log_dinode()
569 to->di_format = xfs_ifork_format(&ip->i_df); in xfs_inode_to_log_dinode()
570 to->di_uid = i_uid_read(inode); in xfs_inode_to_log_dinode()
571 to->di_gid = i_gid_read(inode); in xfs_inode_to_log_dinode()
572 to->di_projid_lo = ip->i_projid & 0xffff; in xfs_inode_to_log_dinode()
573 to->di_projid_hi = ip->i_projid >> 16; in xfs_inode_to_log_dinode()
575 to->di_atime = xfs_inode_to_log_dinode_ts(ip, inode_get_atime(inode)); in xfs_inode_to_log_dinode()
576 to->di_mtime = xfs_inode_to_log_dinode_ts(ip, inode_get_mtime(inode)); in xfs_inode_to_log_dinode()
577 to->di_ctime = xfs_inode_to_log_dinode_ts(ip, inode_get_ctime(inode)); in xfs_inode_to_log_dinode()
578 to->di_nlink = inode->i_nlink; in xfs_inode_to_log_dinode()
579 to->di_gen = inode->i_generation; in xfs_inode_to_log_dinode()
580 to->di_mode = inode->i_mode; in xfs_inode_to_log_dinode()
582 to->di_size = ip->i_disk_size; in xfs_inode_to_log_dinode()
583 to->di_nblocks = ip->i_nblocks; in xfs_inode_to_log_dinode()
584 to->di_extsize = ip->i_extsize; in xfs_inode_to_log_dinode()
585 to->di_forkoff = ip->i_forkoff; in xfs_inode_to_log_dinode()
586 to->di_aformat = xfs_ifork_format(&ip->i_af); in xfs_inode_to_log_dinode()
587 to->di_flags = ip->i_diflags; in xfs_inode_to_log_dinode()
589 xfs_copy_dm_fields_to_log_dinode(ip, to); in xfs_inode_to_log_dinode()
592 to->di_next_unlinked = NULLAGINO; in xfs_inode_to_log_dinode()
594 if (xfs_has_v3inodes(ip->i_mount)) { in xfs_inode_to_log_dinode()
595 to->di_version = 3; in xfs_inode_to_log_dinode()
596 to->di_changecount = inode_peek_iversion(inode); in xfs_inode_to_log_dinode()
597 to->di_crtime = xfs_inode_to_log_dinode_ts(ip, ip->i_crtime); in xfs_inode_to_log_dinode()
598 to->di_flags2 = ip->i_diflags2; in xfs_inode_to_log_dinode()
599 to->di_cowextsize = ip->i_cowextsize; in xfs_inode_to_log_dinode()
600 to->di_ino = ip->i_ino; in xfs_inode_to_log_dinode()
601 to->di_lsn = lsn; in xfs_inode_to_log_dinode()
602 memset(to->di_pad2, 0, sizeof(to->di_pad2)); in xfs_inode_to_log_dinode()
603 uuid_copy(&to->di_uuid, &ip->i_mount->m_sb.sb_meta_uuid); in xfs_inode_to_log_dinode()
604 to->di_v3_pad = 0; in xfs_inode_to_log_dinode()
607 to->di_crc = 0; in xfs_inode_to_log_dinode()
609 if (xfs_is_metadir_inode(ip)) in xfs_inode_to_log_dinode()
610 to->di_metatype = ip->i_metatype; in xfs_inode_to_log_dinode()
612 to->di_metatype = 0; in xfs_inode_to_log_dinode()
614 to->di_version = 2; in xfs_inode_to_log_dinode()
615 to->di_flushiter = ip->i_flushiter; in xfs_inode_to_log_dinode()
616 memset(to->di_v2_pad, 0, sizeof(to->di_v2_pad)); in xfs_inode_to_log_dinode()
617 to->di_metatype = 0; in xfs_inode_to_log_dinode()
620 xfs_inode_to_log_dinode_iext_counters(ip, to); in xfs_inode_to_log_dinode()
624 * Format the inode core. Current timestamp data is only in the VFS inode
626 * the XFS inode core structure, format the fields directly into the iovec.
630 struct xfs_inode *ip, in xfs_inode_item_format_core() argument
637 xfs_inode_to_log_dinode(ip, dic, ip->i_itemp->ili_item.li_lsn); in xfs_inode_item_format_core()
638 xlog_finish_iovec(lv, *vecp, xfs_log_dinode_size(ip->i_mount)); in xfs_inode_item_format_core()
644 * the second with the on-disk inode structure, and a possible third and/or
645 * fourth with the inode data/extents/b-tree root and inode attributes
646 * data/extents/b-tree root.
659 struct xfs_inode *ip = iip->ili_inode; in xfs_inode_item_format() local
664 ilf->ilf_type = XFS_LI_INODE; in xfs_inode_item_format()
665 ilf->ilf_ino = ip->i_ino; in xfs_inode_item_format()
666 ilf->ilf_blkno = ip->i_imap.im_blkno; in xfs_inode_item_format()
667 ilf->ilf_len = ip->i_imap.im_len; in xfs_inode_item_format()
668 ilf->ilf_boffset = ip->i_imap.im_boffset; in xfs_inode_item_format()
669 ilf->ilf_fields = XFS_ILOG_CORE; in xfs_inode_item_format()
670 ilf->ilf_size = 2; /* format + core */ in xfs_inode_item_format()
676 ilf->ilf_dsize = 0; in xfs_inode_item_format()
677 ilf->ilf_asize = 0; in xfs_inode_item_format()
678 ilf->ilf_pad = 0; in xfs_inode_item_format()
679 memset(&ilf->ilf_u, 0, sizeof(ilf->ilf_u)); in xfs_inode_item_format()
683 xfs_inode_item_format_core(ip, lv, &vecp); in xfs_inode_item_format()
685 if (xfs_inode_has_attr_fork(ip)) { in xfs_inode_item_format()
688 iip->ili_fields &= in xfs_inode_item_format()
693 ilf->ilf_fields |= (iip->ili_fields & ~XFS_ILOG_TIMESTAMP); in xfs_inode_item_format()
704 struct xfs_inode *ip = INODE_ITEM(lip)->ili_inode; in xfs_inode_item_pin() local
706 xfs_assert_ilocked(ip, XFS_ILOCK_EXCL); in xfs_inode_item_pin()
707 ASSERT(lip->li_buf); in xfs_inode_item_pin()
709 trace_xfs_inode_pin(ip, _RET_IP_); in xfs_inode_item_pin()
710 atomic_inc(&ip->i_pincount); in xfs_inode_item_pin()
731 struct xfs_inode *ip = INODE_ITEM(lip)->ili_inode; in xfs_inode_item_unpin() local
733 trace_xfs_inode_unpin(ip, _RET_IP_); in xfs_inode_item_unpin()
734 ASSERT(lip->li_buf || xfs_iflags_test(ip, XFS_ISTALE)); in xfs_inode_item_unpin()
735 ASSERT(atomic_read(&ip->i_pincount) > 0); in xfs_inode_item_unpin()
736 if (atomic_dec_and_test(&ip->i_pincount)) in xfs_inode_item_unpin()
737 wake_up_bit(&ip->i_flags, __XFS_IPINNED_BIT); in xfs_inode_item_unpin()
744 __releases(&lip->li_ailp->ail_lock) in xfs_inode_item_push()
745 __acquires(&lip->li_ailp->ail_lock) in xfs_inode_item_push()
748 struct xfs_inode *ip = iip->ili_inode; in xfs_inode_item_push() local
749 struct xfs_buf *bp = lip->li_buf; in xfs_inode_item_push()
753 if (!bp || (ip->i_flags & XFS_ISTALE)) { in xfs_inode_item_push()
763 if (xfs_ipincount(ip) > 0 || xfs_buf_ispinned(bp)) in xfs_inode_item_push()
766 if (xfs_iflags_test(ip, XFS_IFLUSHING)) in xfs_inode_item_push()
772 spin_unlock(&lip->li_ailp->ail_lock); in xfs_inode_item_push()
791 if (error == -EAGAIN) in xfs_inode_item_push()
796 spin_lock(&lip->li_ailp->ail_lock); in xfs_inode_item_push()
808 struct xfs_inode *ip = iip->ili_inode; in xfs_inode_item_release() local
811 ASSERT(ip->i_itemp != NULL); in xfs_inode_item_release()
812 xfs_assert_ilocked(ip, XFS_ILOCK_EXCL); in xfs_inode_item_release()
814 lock_flags = iip->ili_lock_flags; in xfs_inode_item_release()
815 iip->ili_lock_flags = 0; in xfs_inode_item_release()
817 xfs_iunlock(ip, lock_flags); in xfs_inode_item_release()
823 * at the given lsn. Since we always re-log all dirty data in an inode, the
828 * don't want to (re-)insert this inode into the AIL. There is a race condition
838 * To avoid this, just unpin the inode directly and return a LSN of -1 so the
848 struct xfs_inode *ip = iip->ili_inode; in xfs_inode_item_committed() local
850 if (xfs_iflags_test(ip, XFS_ISTALE)) { in xfs_inode_item_committed()
852 return -1; in xfs_inode_item_committed()
862 INODE_ITEM(lip)->ili_commit_seq = seq; in xfs_inode_item_committing()
881 * Initialize the inode log item for a newly allocated (in-core) inode.
885 struct xfs_inode *ip, in xfs_inode_item_init() argument
890 ASSERT(ip->i_itemp == NULL); in xfs_inode_item_init()
891 iip = ip->i_itemp = kmem_cache_zalloc(xfs_ili_cache, in xfs_inode_item_init()
894 iip->ili_inode = ip; in xfs_inode_item_init()
895 spin_lock_init(&iip->ili_lock); in xfs_inode_item_init()
896 xfs_log_item_init(mp, &iip->ili_item, XFS_LI_INODE, in xfs_inode_item_init()
905 struct xfs_inode *ip) in xfs_inode_item_destroy() argument
907 struct xfs_inode_log_item *iip = ip->i_itemp; in xfs_inode_item_destroy()
909 ASSERT(iip->ili_item.li_buf == NULL); in xfs_inode_item_destroy()
911 ip->i_itemp = NULL; in xfs_inode_item_destroy()
912 kvfree(iip->ili_item.li_lv_shadow); in xfs_inode_item_destroy()
931 spin_lock(&ailp->ail_lock); in xfs_iflush_ail_updates()
935 clear_bit(XFS_LI_FAILED, &lip->li_flags); in xfs_iflush_ail_updates()
936 if (INODE_ITEM(lip)->ili_flush_lsn != lip->li_lsn) in xfs_iflush_ail_updates()
945 if (!test_bit(XFS_LI_IN_AIL, &lip->li_flags)) { in xfs_iflush_ail_updates()
946 ASSERT(xlog_is_shutdown(lip->li_log)); in xfs_iflush_ail_updates()
974 spin_lock(&iip->ili_lock); in xfs_iflush_finish()
981 ASSERT(iip->ili_item.li_buf == bp); in xfs_iflush_finish()
982 if (!iip->ili_fields) { in xfs_iflush_finish()
983 iip->ili_item.li_buf = NULL; in xfs_iflush_finish()
984 list_del_init(&lip->li_bio_list); in xfs_iflush_finish()
987 iip->ili_last_fields = 0; in xfs_iflush_finish()
988 iip->ili_flush_lsn = 0; in xfs_iflush_finish()
989 clear_bit(XFS_LI_FLUSHING, &lip->li_flags); in xfs_iflush_finish()
990 spin_unlock(&iip->ili_lock); in xfs_iflush_finish()
991 xfs_iflags_clear(iip->ili_inode, XFS_IFLUSHING); in xfs_iflush_finish()
999 * attached to the buffer from the AIL if they have not been re-logged and
1014 list_for_each_entry_safe(lip, n, &bp->b_li_list, li_bio_list) { in xfs_buf_inode_iodone()
1017 if (xfs_iflags_test(iip->ili_inode, XFS_ISTALE)) { in xfs_buf_inode_iodone()
1018 xfs_iflush_abort(iip->ili_inode); in xfs_buf_inode_iodone()
1021 if (!iip->ili_last_fields) in xfs_buf_inode_iodone()
1025 if (iip->ili_flush_lsn == lip->li_lsn || in xfs_buf_inode_iodone()
1026 test_bit(XFS_LI_FAILED, &lip->li_flags)) in xfs_buf_inode_iodone()
1027 list_move_tail(&lip->li_bio_list, &ail_updates); in xfs_buf_inode_iodone()
1029 list_move_tail(&lip->li_bio_list, &flushed_inodes); in xfs_buf_inode_iodone()
1033 xfs_iflush_ail_updates(bp->b_mount->m_ail, &ail_updates); in xfs_buf_inode_iodone()
1039 list_splice_tail(&flushed_inodes, &bp->b_li_list); in xfs_buf_inode_iodone()
1052 iip->ili_last_fields = 0; in xfs_iflush_abort_clean()
1053 iip->ili_fields = 0; in xfs_iflush_abort_clean()
1054 iip->ili_fsync_fields = 0; in xfs_iflush_abort_clean()
1055 iip->ili_flush_lsn = 0; in xfs_iflush_abort_clean()
1056 iip->ili_item.li_buf = NULL; in xfs_iflush_abort_clean()
1057 list_del_init(&iip->ili_item.li_bio_list); in xfs_iflush_abort_clean()
1058 clear_bit(XFS_LI_FLUSHING, &iip->ili_item.li_flags); in xfs_iflush_abort_clean()
1075 struct xfs_inode *ip) in xfs_iflush_abort() argument
1077 struct xfs_inode_log_item *iip = ip->i_itemp; in xfs_iflush_abort()
1082 xfs_iflags_clear(ip, XFS_IFLUSHING); in xfs_iflush_abort()
1089 * pointer for push operations to access - it is only safe to remove the in xfs_iflush_abort()
1093 * as xfs_trans_ail_delete()->xfs_clear_li_failed() will release buffer in xfs_iflush_abort()
1097 clear_bit(XFS_LI_FAILED, &iip->ili_item.li_flags); in xfs_iflush_abort()
1098 xfs_trans_ail_delete(&iip->ili_item, 0); in xfs_iflush_abort()
1104 spin_lock(&iip->ili_lock); in xfs_iflush_abort()
1105 bp = iip->ili_item.li_buf; in xfs_iflush_abort()
1107 spin_unlock(&iip->ili_lock); in xfs_iflush_abort()
1109 xfs_iflags_clear(ip, XFS_IFLUSHING); in xfs_iflush_abort()
1122 struct xfs_inode *ip) in xfs_iflush_shutdown_abort() argument
1124 struct xfs_inode_log_item *iip = ip->i_itemp; in xfs_iflush_shutdown_abort()
1129 xfs_iflags_clear(ip, XFS_IFLUSHING); in xfs_iflush_shutdown_abort()
1133 spin_lock(&iip->ili_lock); in xfs_iflush_shutdown_abort()
1134 bp = iip->ili_item.li_buf; in xfs_iflush_shutdown_abort()
1136 spin_unlock(&iip->ili_lock); in xfs_iflush_shutdown_abort()
1137 xfs_iflush_abort(ip); in xfs_iflush_shutdown_abort()
1148 spin_unlock(&iip->ili_lock); in xfs_iflush_shutdown_abort()
1151 spin_lock(&iip->ili_lock); in xfs_iflush_shutdown_abort()
1152 if (!iip->ili_item.li_buf) { in xfs_iflush_shutdown_abort()
1158 ASSERT(list_empty(&iip->ili_item.li_bio_list)); in xfs_iflush_shutdown_abort()
1159 ASSERT(!test_bit(XFS_LI_IN_AIL, &iip->ili_item.li_flags)); in xfs_iflush_shutdown_abort()
1161 spin_unlock(&iip->ili_lock); in xfs_iflush_shutdown_abort()
1162 xfs_iflags_clear(ip, XFS_IFLUSHING); in xfs_iflush_shutdown_abort()
1174 ASSERT(iip->ili_item.li_buf == bp); in xfs_iflush_shutdown_abort()
1175 spin_unlock(&iip->ili_lock); in xfs_iflush_shutdown_abort()
1176 xfs_iflush_abort(ip); in xfs_iflush_shutdown_abort()
1190 struct xfs_inode_log_format_32 *in_f32 = buf->i_addr; in xfs_inode_item_format_convert()
1192 if (buf->i_len != sizeof(*in_f32)) { in xfs_inode_item_format_convert()
1194 return -EFSCORRUPTED; in xfs_inode_item_format_convert()
1197 in_f->ilf_type = in_f32->ilf_type; in xfs_inode_item_format_convert()
1198 in_f->ilf_size = in_f32->ilf_size; in xfs_inode_item_format_convert()
1199 in_f->ilf_fields = in_f32->ilf_fields; in xfs_inode_item_format_convert()
1200 in_f->ilf_asize = in_f32->ilf_asize; in xfs_inode_item_format_convert()
1201 in_f->ilf_dsize = in_f32->ilf_dsize; in xfs_inode_item_format_convert()
1202 in_f->ilf_ino = in_f32->ilf_ino; in xfs_inode_item_format_convert()
1203 memcpy(&in_f->ilf_u, &in_f32->ilf_u, sizeof(in_f->ilf_u)); in xfs_inode_item_format_convert()
1204 in_f->ilf_blkno = in_f32->ilf_blkno; in xfs_inode_item_format_convert()
1205 in_f->ilf_len = in_f32->ilf_len; in xfs_inode_item_format_convert()
1206 in_f->ilf_boffset = in_f32->ilf_boffset; in xfs_inode_item_format_convert()