2 * Copyright (c) 2000-2001,2005-2006 Silicon Graphics, Inc.
3 * Copyright (C) 2010 Red Hat, Inc.
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation.
10 * This program is distributed in the hope that it would be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 #include "libxfs_priv.h"
22 #include "xfs_shared.h"
23 #include "xfs_format.h"
24 #include "xfs_log_format.h"
25 #include "xfs_trans_resv.h"
26 #include "xfs_mount.h"
27 #include "xfs_inode_buf.h"
28 #include "xfs_inode_fork.h"
29 #include "xfs_inode.h"
30 #include "xfs_trans.h"
33 static void xfs_trans_free_items(struct xfs_trans
*tp
);
36 * Simple transaction interface
39 kmem_zone_t
*xfs_trans_zone
;
40 kmem_zone_t
*xfs_log_item_desc_zone
;
43 * Initialize the precomputed transaction reservation values
44 * in the mount structure.
50 xfs_trans_resv_calc(mp
, &mp
->m_resv
);
54 * Add the given log item to the transaction's list of log items.
56 * The log item will now point to its new descriptor with its li_desc field.
59 libxfs_trans_add_item(
61 struct xfs_log_item
*lip
)
63 struct xfs_log_item_desc
*lidp
;
65 ASSERT(lip
->li_mountp
== tp
->t_mountp
);
66 ASSERT(lip
->li_ailp
== tp
->t_mountp
->m_ail
);
68 lidp
= kmem_zone_zalloc(xfs_log_item_desc_zone
, KM_SLEEP
| KM_NOFS
);
72 list_add_tail(&lidp
->lid_trans
, &tp
->t_items
);
78 libxfs_trans_free_item_desc(
79 struct xfs_log_item_desc
*lidp
)
81 list_del_init(&lidp
->lid_trans
);
82 kmem_zone_free(xfs_log_item_desc_zone
, lidp
);
86 * Unlink and free the given descriptor.
89 libxfs_trans_del_item(
90 struct xfs_log_item
*lip
)
92 libxfs_trans_free_item_desc(lip
->li_desc
);
97 * Roll from one trans in the sequence of PERMANENT transactions to
98 * the next: permanent transactions are only flushed out when
99 * committed with XFS_TRANS_RELEASE_LOG_RES, but we still want as soon
100 * as possible to let chunks of it go to the log. So we commit the
101 * chunk we've been working on and get a new transaction to continue.
105 struct xfs_trans
**tpp
)
107 struct xfs_mount
*mp
;
108 struct xfs_trans
*trans
= *tpp
;
109 struct xfs_trans_res tres
;
110 unsigned int old_blk_res
;
114 * Copy the critical parameters from one trans to the next.
116 mp
= trans
->t_mountp
;
117 tres
.tr_logres
= trans
->t_log_res
;
118 tres
.tr_logcount
= trans
->t_log_count
;
119 old_blk_res
= trans
->t_blk_res
;
122 * Commit the current transaction.
123 * If this commit failed, then it'd just unlock those items that
124 * are marked to be released. That also means that a filesystem shutdown
125 * is in progress. The caller takes the responsibility to cancel
126 * the duplicate transaction that gets returned.
128 error
= xfs_trans_commit(trans
);
133 * Reserve space in the log for the next transaction.
134 * This also pushes items in the "AIL", the list of logged items,
135 * out to disk if they are taking up space at the tail of the log
136 * that we want to use. This requires that either nothing be locked
137 * across this call, or that anything that is locked be logged in
138 * the prior and the next transactions.
140 tres
.tr_logflags
= XFS_TRANS_PERM_LOG_RES
;
141 error
= libxfs_trans_alloc(mp
, &tres
, 0, 0, 0, tpp
);
143 trans
->t_blk_res
= old_blk_res
;
149 * Free the transaction structure. If there is more clean up
150 * to do when the structure is freed, add it here.
154 struct xfs_trans
*tp
)
156 kmem_zone_free(xfs_trans_zone
, tp
);
161 struct xfs_mount
*mp
,
162 struct xfs_trans_res
*resp
,
164 unsigned int rtextents
,
166 struct xfs_trans
**tpp
)
169 struct xfs_sb
*sb
= &mp
->m_sb
;
170 struct xfs_trans
*ptr
;
173 * Attempt to reserve the needed disk blocks by decrementing
174 * the number needed from the number available. This will
175 * fail if the count would go below zero.
178 if (sb
->sb_fdblocks
< blocks
)
182 ptr
= kmem_zone_zalloc(xfs_trans_zone
,
183 (flags
& XFS_TRANS_NOFS
) ? KM_NOFS
: KM_SLEEP
);
185 ptr
->t_blk_res
= blocks
;
186 INIT_LIST_HEAD(&ptr
->t_items
);
188 fprintf(stderr
, "allocated new transaction %p\n", ptr
);
195 * Create an empty transaction with no reservation. This is a defensive
196 * mechanism for routines that query metadata without actually modifying
197 * them -- if the metadata being queried is somehow cross-linked (think a
198 * btree block pointer that points higher in the tree), we risk deadlock.
199 * However, blocks grabbed as part of a transaction can be re-grabbed.
200 * The verifiers will notice the corrupt block and the operation will fail
201 * back to userspace without deadlocking.
203 * Note the zero-length reservation; this transaction MUST be cancelled
204 * without any dirty data.
207 libxfs_trans_alloc_empty(
208 struct xfs_mount
*mp
,
209 struct xfs_trans
**tpp
)
211 struct xfs_trans_res resv
= {0};
213 return xfs_trans_alloc(mp
, &resv
, 0, 0, XFS_TRANS_NO_WRITECOUNT
, tpp
);
221 xfs_trans_t
*otp
= tp
;
224 xfs_trans_free_items(tp
);
228 fprintf(stderr
, "## cancelled transaction %p\n", otp
);
243 xfs_inode_log_item_t
*iip
;
246 return libxfs_iget(mp
, tp
, ino
, lock_flags
, ipp
,
247 &xfs_default_ifork_ops
);
249 error
= libxfs_iget(mp
, tp
, ino
, lock_flags
, &ip
,
250 &xfs_default_ifork_ops
);
255 if (ip
->i_itemp
== NULL
)
256 xfs_inode_item_init(ip
, mp
);
258 xfs_trans_add_item(tp
, (xfs_log_item_t
*)(iip
));
260 /* initialize i_transp so we can find it incore */
273 xfs_inode_log_item_t
*iip
;
275 ASSERT(ip
->i_transp
== NULL
);
276 if (ip
->i_itemp
== NULL
)
277 xfs_inode_item_init(ip
, ip
->i_mount
);
279 ASSERT(iip
->ili_flags
== 0);
280 ASSERT(iip
->ili_inode
!= NULL
);
282 xfs_trans_add_item(tp
, (xfs_log_item_t
*)(iip
));
286 fprintf(stderr
, "ijoin'd inode %llu, transaction %p\n", ip
->i_ino
, tp
);
291 libxfs_trans_ijoin_ref(
296 ASSERT(ip
->i_transp
== tp
);
297 ASSERT(ip
->i_itemp
!= NULL
);
299 xfs_trans_ijoin(tp
, ip
, lock_flags
);
302 fprintf(stderr
, "ijoin_ref'd inode %llu, transaction %p\n", ip
->i_ino
, tp
);
307 libxfs_trans_inode_alloc_buf(
311 xfs_buf_log_item_t
*bip
= bp
->b_log_item
;
313 ASSERT(bp
->bp_transp
== tp
);
315 bip
->bli_flags
|= XFS_BLI_INODE_ALLOC_BUF
;
316 xfs_trans_buf_set_type(tp
, bp
, XFS_BLFT_DINO_BUF
);
320 * This is called to mark the fields indicated in fieldmask as needing
321 * to be logged when the transaction is committed. The inode must
322 * already be associated with the given transaction.
324 * The values for fieldmask are defined in xfs_log_format.h. We always
325 * log all of the core inode if any of it has changed, and we always log
326 * all of the inline data/extents/b-tree root if any of them has changed.
334 ASSERT(ip
->i_transp
== tp
);
335 ASSERT(ip
->i_itemp
!= NULL
);
337 fprintf(stderr
, "dirtied inode %llu, transaction %p\n", ip
->i_ino
, tp
);
340 tp
->t_flags
|= XFS_TRANS_DIRTY
;
341 ip
->i_itemp
->ili_item
.li_desc
->lid_flags
|= XFS_LID_DIRTY
;
344 * Always OR in the bits from the ili_last_fields field.
345 * This is to coordinate with the xfs_iflush() and xfs_iflush_done()
346 * routines in the eventual clearing of the ilf_fields bits.
347 * See the big comment in xfs_iflush() for an explanation of
348 * this coordination mechanism.
350 flags
|= ip
->i_itemp
->ili_last_fields
;
351 ip
->i_itemp
->ili_fields
|= flags
;
355 libxfs_trans_roll_inode(
356 struct xfs_trans
**tpp
,
357 struct xfs_inode
*ip
)
361 xfs_trans_log_inode(*tpp
, ip
, XFS_ILOG_CORE
);
362 error
= xfs_trans_roll(tpp
);
364 xfs_trans_ijoin(*tpp
, ip
, 0);
370 * Mark a buffer dirty in the transaction.
373 libxfs_trans_dirty_buf(
374 struct xfs_trans
*tp
,
377 struct xfs_buf_log_item
*bip
= bp
->b_log_item
;
379 ASSERT(bp
->bp_transp
== tp
);
383 fprintf(stderr
, "dirtied buffer %p, transaction %p\n", bp
, tp
);
385 tp
->t_flags
|= XFS_TRANS_DIRTY
;
386 bip
->bli_item
.li_desc
->lid_flags
|= XFS_LID_DIRTY
;
390 * This is called to mark bytes first through last inclusive of the given
391 * buffer as needing to be logged when the transaction is committed.
392 * The buffer must already be associated with the given transaction.
394 * First and last are numbers relative to the beginning of this buffer,
395 * so the first byte in the buffer is numbered 0 regardless of the
399 libxfs_trans_log_buf(
400 struct xfs_trans
*tp
,
405 struct xfs_buf_log_item
*bip
= bp
->b_log_item
;
407 ASSERT((first
<= last
) && (last
< XFS_BUF_COUNT(bp
)));
409 xfs_trans_dirty_buf(tp
, bp
);
410 xfs_buf_item_log(bip
, first
, last
);
414 * For userspace, ordered buffers just need to be marked dirty so
415 * the transaction commit will write them and mark them up-to-date.
416 * In essence, they are just like any other logged buffer in userspace.
418 * If the buffer is already dirty, trigger the "already logged" return condition.
421 libxfs_trans_ordered_buf(
422 struct xfs_trans
*tp
,
425 struct xfs_buf_log_item
*bip
= bp
->b_log_item
;
428 ret
= (bip
->bli_item
.li_desc
->lid_flags
& XFS_LID_DIRTY
);
429 libxfs_trans_log_buf(tp
, bp
, 0, bp
->b_bcount
);
438 xfs_buf_log_item_t
*bip
;
440 fprintf(stderr
, "released buffer %p, transaction %p\n", bp
, tp
);
444 ASSERT(bp
->bp_transp
== NULL
);
448 ASSERT(bp
->bp_transp
== tp
);
449 bip
= bp
->b_log_item
;
450 ASSERT(bip
->bli_item
.li_type
== XFS_LI_BUF
);
451 if (bip
->bli_recur
> 0) {
455 /* If dirty/stale, can't release till transaction committed */
456 if (bip
->bli_flags
& XFS_BLI_STALE
)
458 if (bip
->bli_item
.li_desc
->lid_flags
& XFS_LID_DIRTY
)
460 xfs_trans_del_item(&bip
->bli_item
);
461 if (bip
->bli_flags
& XFS_BLI_HOLD
)
462 bip
->bli_flags
&= ~XFS_BLI_HOLD
;
472 xfs_buf_log_item_t
*bip
= bp
->b_log_item
;
474 fprintf(stderr
, "binval'd buffer %p, transaction %p\n", bp
, tp
);
477 ASSERT(bp
->bp_transp
== tp
);
480 if (bip
->bli_flags
& XFS_BLI_STALE
)
482 XFS_BUF_UNDELAYWRITE(bp
);
484 bip
->bli_flags
|= XFS_BLI_STALE
;
485 bip
->bli_flags
&= ~XFS_BLI_DIRTY
;
486 bip
->bli_format
.blf_flags
&= ~XFS_BLF_INODE_BUF
;
487 bip
->bli_format
.blf_flags
|= XFS_BLF_CANCEL
;
488 bip
->bli_item
.li_desc
->lid_flags
|= XFS_LID_DIRTY
;
489 tp
->t_flags
|= XFS_TRANS_DIRTY
;
497 xfs_buf_log_item_t
*bip
;
499 ASSERT(bp
->bp_transp
== NULL
);
501 fprintf(stderr
, "bjoin'd buffer %p, transaction %p\n", bp
, tp
);
504 xfs_buf_item_init(bp
, tp
->t_mountp
);
505 bip
= bp
->b_log_item
;
506 xfs_trans_add_item(tp
, (xfs_log_item_t
*)bip
);
515 xfs_buf_log_item_t
*bip
= bp
->b_log_item
;
517 ASSERT(bp
->bp_transp
== tp
);
520 fprintf(stderr
, "bhold'd buffer %p, transaction %p\n", bp
, tp
);
523 bip
->bli_flags
|= XFS_BLI_HOLD
;
527 libxfs_trans_get_buf_map(
529 struct xfs_buftarg
*btp
,
530 struct xfs_buf_map
*map
,
535 xfs_buf_log_item_t
*bip
;
538 return libxfs_getbuf_map(btp
, map
, nmaps
, 0);
540 bp
= xfs_trans_buf_item_match(tp
, btp
, map
, nmaps
);
542 ASSERT(bp
->bp_transp
== tp
);
543 bip
= bp
->b_log_item
;
549 bp
= libxfs_getbuf_map(btp
, map
, nmaps
, 0);
553 fprintf(stderr
, "trans_get_buf buffer %p, transaction %p\n", bp
, tp
);
556 xfs_buf_item_init(bp
, tp
->t_mountp
);
557 bip
= bp
->b_log_item
;
559 xfs_trans_add_item(tp
, (xfs_log_item_t
*)bip
);
561 /* initialize b_transp so we can find it incore */
573 xfs_buf_log_item_t
*bip
;
574 int len
= XFS_FSS_TO_BB(mp
, 1);
575 DEFINE_SINGLE_BUF_MAP(map
, XFS_SB_DADDR
, len
);
578 return libxfs_getsb(mp
, flags
);
580 bp
= xfs_trans_buf_item_match(tp
, mp
->m_dev
, &map
, 1);
582 ASSERT(bp
->bp_transp
== tp
);
583 bip
= bp
->b_log_item
;
589 bp
= libxfs_getsb(mp
, flags
);
591 fprintf(stderr
, "trans_get_sb buffer %p, transaction %p\n", bp
, tp
);
594 xfs_buf_item_init(bp
, mp
);
595 bip
= bp
->b_log_item
;
597 xfs_trans_add_item(tp
, (xfs_log_item_t
*)bip
);
599 /* initialize b_transp so we can find it incore */
605 libxfs_trans_read_buf_map(
608 struct xfs_buftarg
*btp
,
609 struct xfs_buf_map
*map
,
613 const struct xfs_buf_ops
*ops
)
616 xfs_buf_log_item_t
*bip
;
622 bp
= libxfs_readbuf_map(btp
, map
, nmaps
, flags
, ops
);
624 return (flags
& XBF_TRYLOCK
) ? -EAGAIN
: -ENOMEM
;
631 bp
= xfs_trans_buf_item_match(tp
, btp
, map
, nmaps
);
633 ASSERT(bp
->bp_transp
== tp
);
634 ASSERT(bp
->b_log_item
!= NULL
);
635 bip
= bp
->b_log_item
;
640 bp
= libxfs_readbuf_map(btp
, map
, nmaps
, flags
, ops
);
642 return (flags
& XBF_TRYLOCK
) ? -EAGAIN
: -ENOMEM
;
648 fprintf(stderr
, "trans_read_buf buffer %p, transaction %p\n", bp
, tp
);
651 xfs_buf_item_init(bp
, tp
->t_mountp
);
652 bip
= bp
->b_log_item
;
654 xfs_trans_add_item(tp
, (xfs_log_item_t
*)bip
);
656 /* initialise b_transp so we can find it incore */
668 * Record the indicated change to the given field for application
669 * to the file system's superblock when the transaction commits.
670 * For now, just store the change in the transaction structure.
671 * Mark the transaction structure to indicate that the superblock
672 * needs to be updated before committing.
674 * Originally derived from xfs_trans_mod_sb().
683 case XFS_TRANS_SB_RES_FDBLOCKS
:
685 case XFS_TRANS_SB_FDBLOCKS
:
686 tp
->t_fdblocks_delta
+= delta
;
688 case XFS_TRANS_SB_ICOUNT
:
690 tp
->t_icount_delta
+= delta
;
692 case XFS_TRANS_SB_IFREE
:
693 tp
->t_ifree_delta
+= delta
;
695 case XFS_TRANS_SB_FREXTENTS
:
696 tp
->t_frextents_delta
+= delta
;
702 tp
->t_flags
|= (XFS_TRANS_SB_DIRTY
| XFS_TRANS_DIRTY
);
707 * Transaction commital code follows (i.e. write to disk in libxfs)
712 xfs_inode_log_item_t
*iip
)
721 mp
= iip
->ili_item
.li_mountp
;
724 if (!(iip
->ili_fields
& XFS_ILOG_ALL
)) {
725 ip
->i_transp
= NULL
; /* disassociate from transaction */
726 iip
->ili_flags
= 0; /* reset all flags */
731 * Get the buffer containing the on-disk inode.
733 error
= xfs_imap_to_bp(mp
, NULL
, &ip
->i_imap
, &dip
, &bp
, 0, 0);
735 fprintf(stderr
, _("%s: warning - imap_to_bp failed (%d)\n"),
740 bp
->b_log_item
= iip
;
741 error
= libxfs_iflush_int(ip
, bp
);
743 fprintf(stderr
, _("%s: warning - iflush_int failed (%d)\n"),
748 ip
->i_transp
= NULL
; /* disassociate from transaction */
749 bp
->b_log_item
= NULL
; /* remove log item */
750 bp
->b_transp
= NULL
; /* remove xact ptr */
751 libxfs_writebuf(bp
, 0);
753 fprintf(stderr
, "flushing dirty inode %llu, buffer %p\n",
760 xfs_buf_log_item_t
*bip
)
764 extern kmem_zone_t
*xfs_buf_item_zone
;
768 bp
->b_log_item
= NULL
; /* remove log item */
769 bp
->b_transp
= NULL
; /* remove xact ptr */
771 hold
= (bip
->bli_flags
& XFS_BLI_HOLD
);
772 if (bip
->bli_flags
& XFS_BLI_DIRTY
) {
774 fprintf(stderr
, "flushing/staling buffer %p (hold=%d)\n",
777 libxfs_writebuf_int(bp
, 0);
780 bip
->bli_flags
&= ~XFS_BLI_HOLD
;
783 /* release the buf item */
784 kmem_zone_free(xfs_buf_item_zone
, bip
);
791 struct xfs_log_item_desc
*lidp
, *next
;
793 list_for_each_entry_safe(lidp
, next
, &tp
->t_items
, lid_trans
) {
794 struct xfs_log_item
*lip
= lidp
->lid_item
;
796 xfs_trans_del_item(lip
);
798 if (lip
->li_type
== XFS_LI_BUF
)
799 buf_item_done((xfs_buf_log_item_t
*)lip
);
800 else if (lip
->li_type
== XFS_LI_INODE
)
801 inode_item_done((xfs_inode_log_item_t
*)lip
);
803 fprintf(stderr
, _("%s: unrecognised log item type\n"),
812 xfs_buf_log_item_t
*bip
)
814 xfs_buf_t
*bp
= bip
->bli_buf
;
817 /* Clear the buffer's association with this transaction. */
818 bip
->bli_buf
->b_transp
= NULL
;
820 hold
= bip
->bli_flags
& XFS_BLI_HOLD
;
821 bip
->bli_flags
&= ~XFS_BLI_HOLD
;
828 xfs_inode_log_item_t
*iip
)
830 xfs_inode_t
*ip
= iip
->ili_inode
;
832 /* Clear the transaction pointer in the inode. */
839 * Unlock all of the items of a transaction and free all the descriptors
840 * of that transaction.
843 xfs_trans_free_items(
844 struct xfs_trans
*tp
)
846 struct xfs_log_item_desc
*lidp
, *next
;
848 list_for_each_entry_safe(lidp
, next
, &tp
->t_items
, lid_trans
) {
849 struct xfs_log_item
*lip
= lidp
->lid_item
;
851 xfs_trans_del_item(lip
);
852 if (lip
->li_type
== XFS_LI_BUF
)
853 buf_item_unlock((xfs_buf_log_item_t
*)lip
);
854 else if (lip
->li_type
== XFS_LI_INODE
)
855 inode_item_unlock((xfs_inode_log_item_t
*)lip
);
857 fprintf(stderr
, _("%s: unrecognised log item type\n"),
865 * Commit the changes represented by this transaction
876 if (!(tp
->t_flags
& XFS_TRANS_DIRTY
)) {
878 fprintf(stderr
, "committed clean transaction %p\n", tp
);
880 xfs_trans_free_items(tp
);
885 if (tp
->t_flags
& XFS_TRANS_SB_DIRTY
) {
886 sbp
= &(tp
->t_mountp
->m_sb
);
887 if (tp
->t_icount_delta
)
888 sbp
->sb_icount
+= tp
->t_icount_delta
;
889 if (tp
->t_ifree_delta
)
890 sbp
->sb_ifree
+= tp
->t_ifree_delta
;
891 if (tp
->t_fdblocks_delta
)
892 sbp
->sb_fdblocks
+= tp
->t_fdblocks_delta
;
893 if (tp
->t_frextents_delta
)
894 sbp
->sb_frextents
+= tp
->t_frextents_delta
;
899 fprintf(stderr
, "committing dirty transaction %p\n", tp
);
903 /* That's it for the transaction structure. Free it. */