2 * Copyright (c) 2011-2013 The DragonFly Project. All rights reserved.
4 * This code is derived from software contributed to The DragonFly Project
5 * by Matthew Dillon <dillon@dragonflybsd.org>
6 * by Venkatesh Srinivas <vsrinivas@dragonflybsd.org>
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in
16 * the documentation and/or other materials provided with the
18 * 3. Neither the name of The DragonFly Project nor the names of its
19 * contributors may be used to endorse or promote products derived
20 * from this software without specific, prior written permission.
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27 * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
28 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
30 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
31 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
32 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 #include <sys/cdefs.h>
37 #include <sys/param.h>
38 #include <sys/systm.h>
39 #include <sys/types.h>
46 * Recursively flush the specified chain. The chain is locked and
47 * referenced by the caller and will remain so on return. The chain
48 * will remain referenced throughout but can temporarily lose its
49 * lock during the recursion to avoid unnecessarily stalling user
52 struct hammer2_flush_info {
54 hammer2_chain_t *parent;
55 hammer2_trans_t *trans;
58 struct flush_deferral_list flush_list;
59 hammer2_tid_t sync_tid; /* flush synchronization point */
60 hammer2_tid_t mirror_tid; /* collect mirror TID updates */
63 typedef struct hammer2_flush_info hammer2_flush_info_t;
65 static void hammer2_chain_flush_core(hammer2_flush_info_t *info,
66 hammer2_chain_t *chain);
67 static int hammer2_chain_flush_scan1(hammer2_chain_t *child, void *data);
68 static int hammer2_chain_flush_scan2(hammer2_chain_t *child, void *data);
71 * Transaction support functions for writing to the filesystem.
73 * Initializing a new transaction allocates a transaction ID. We
74 * don't bother marking the volume header MODIFIED. Instead, the volume
75 * will be synchronized at a later time as part of a larger flush sequence.
77 * Non-flush transactions can typically run concurrently. However if
78 * there are non-flush transaction both before AND after a flush trans,
79 * the transactions after stall until the ones before finish.
81 * Non-flush transactions occuring after a flush pointer can run concurrently
82 * with that flush. They only have to wait for transactions prior to the
83 * flush trans to complete before they unstall.
85 * WARNING! Modifications to the root volume cannot dup the root volume
86 * header to handle synchronization points, so alloc_tid can
87 * wind up (harmlessly) more advanced on flush.
89 * WARNING! Operations which might call inode_duplicate()/chain_duplicate()
90 * depend heavily on having a unique sync_tid to avoid duplication
91 * collisions (which key off of delete_tid).
94 hammer2_trans_init(hammer2_trans_t *trans, hammer2_mount_t *hmp,
95 hammer2_inode_t *ip, int flags)
97 hammer2_trans_t *scan;
99 bzero(trans, sizeof(*trans));
102 hammer2_voldata_lock(hmp);
103 trans->sync_tid = hmp->voldata.alloc_tid++;
104 trans->flags = flags;
105 trans->td = curthread;
107 trans->tmp_bpref = 0;
108 TAILQ_INSERT_TAIL(&hmp->transq, trans, entry);
110 if (flags & HAMMER2_TRANS_ISFLUSH) {
112 * If we are a flush we have to wait for all transactions
113 * prior to our flush synchronization point to complete
114 * before we can start our flush.
117 if (hmp->curflush == NULL) {
118 hmp->curflush = trans;
119 hmp->topo_flush_tid = trans->sync_tid;
121 while (TAILQ_FIRST(&hmp->transq) != trans) {
122 lksleep(&trans->sync_tid, &hmp->voldatalk,
127 * Once we become the running flush we can wakeup anyone
131 while ((scan = TAILQ_NEXT(scan, entry)) != NULL) {
132 if (scan->flags & HAMMER2_TRANS_ISFLUSH)
134 if (scan->blocked == 0)
137 wakeup(&scan->blocked);
141 * If we are not a flush but our sync_tid is after a
142 * stalled flush, we have to wait until that flush unstalls
143 * (that is, all transactions prior to that flush complete),
144 * but then we can run concurrently with that flush.
146 * (flushcnt check only good as pre-condition, otherwise it
147 * may represent elements queued after us after we block).
149 if (hmp->flushcnt > 1 ||
151 TAILQ_FIRST(&hmp->transq) != hmp->curflush)) {
153 while (trans->blocked) {
154 lksleep(&trans->blocked, &hmp->voldatalk,
159 hammer2_voldata_unlock(hmp, 0);
163 hammer2_trans_done(hammer2_trans_t *trans)
165 hammer2_mount_t *hmp = trans->hmp;
166 hammer2_trans_t *scan;
168 hammer2_voldata_lock(hmp);
169 TAILQ_REMOVE(&hmp->transq, trans, entry);
170 if (trans->flags & HAMMER2_TRANS_ISFLUSH) {
172 * If we were a flush we have to adjust curflush to the
175 * flush_tid is used to partition copy-on-write operations
176 * (mostly duplicate-on-modify ops), which is what allows
177 * us to execute a flush concurrent with modifying operations
182 TAILQ_FOREACH(scan, &hmp->transq, entry) {
183 if (scan->flags & HAMMER2_TRANS_ISFLUSH)
187 hmp->curflush = scan;
188 hmp->topo_flush_tid = scan->sync_tid;
191 * Theoretically we don't have to clear flush_tid
192 * here since the flush will have synchronized
193 * all operations <= flush_tid already. But for
196 hmp->curflush = NULL;
197 hmp->topo_flush_tid = 0;
201 * If we are not a flush but a flush is now at the head
202 * of the queue and we were previously blocking it,
203 * we can now unblock it.
206 (scan = TAILQ_FIRST(&hmp->transq)) != NULL &&
207 trans->sync_tid < scan->sync_tid &&
208 (scan->flags & HAMMER2_TRANS_ISFLUSH)) {
209 wakeup(&scan->sync_tid);
212 hammer2_voldata_unlock(hmp, 0);
218 * Flush the chain and all modified sub-chains through the specified
219 * synchronization point (sync_tid), propagating parent chain modifications
220 * and mirror_tid updates back up as needed. Since we are recursing downward
221 * we do not have to deal with the complexities of multi-homed chains (chains
222 * with multiple parents).
224 * Caller must have interlocked against any non-flush-related modifying
225 * operations in progress whos modify_tid values are less than or equal
226 * to the passed sync_tid.
228 * Caller must have already vetted synchronization points to ensure they
229 * are properly flushed. Only snapshots and cluster flushes can create
230 * these sorts of synchronization points.
232 * This routine can be called from several places but the most important
233 * is from the hammer2_vop_reclaim() function. We want to try to completely
234 * clean out the inode structure to prevent disconnected inodes from
235 * building up and blowing out the kmalloc pool. However, it is not actually
236 * necessary to flush reclaimed inodes to maintain HAMMER2's crash recovery
239 * chain is locked on call and will remain locked on return. If a flush
240 * occured, the chain's MOVED bit will be set indicating that its parent
241 * (which is not part of the flush) should be updated.
244 hammer2_chain_flush(hammer2_trans_t *trans, hammer2_chain_t *chain)
246 hammer2_chain_t *scan;
247 hammer2_chain_core_t *core;
248 hammer2_flush_info_t info;
251 * Execute the recursive flush and handle deferrals.
253 * Chains can be ridiculously long (thousands deep), so to
254 * avoid blowing out the kernel stack the recursive flush has a
255 * depth limit. Elements at the limit are placed on a list
256 * for re-execution after the stack has been popped.
258 bzero(&info, sizeof(info));
259 TAILQ_INIT(&info.flush_list);
260 info.hmp = trans->hmp;
262 info.sync_tid = trans->sync_tid;
269 * Unwind deep recursions which had been deferred. This
270 * can leave MOVED set for these chains, which will be
271 * handled when we [re]flush chain after the unwind.
273 while ((scan = TAILQ_FIRST(&info.flush_list)) != NULL) {
274 KKASSERT(scan->flags & HAMMER2_CHAIN_DEFERRED);
275 TAILQ_REMOVE(&info.flush_list, scan, flush_node);
276 atomic_clear_int(&scan->flags, HAMMER2_CHAIN_DEFERRED);
279 * Now that we've popped back up we can do a secondary
280 * recursion on the deferred elements.
282 if (hammer2_debug & 0x0040)
283 kprintf("defered flush %p\n", scan);
284 hammer2_chain_lock(scan, HAMMER2_RESOLVE_MAYBE);
285 hammer2_chain_flush(trans, scan);
286 hammer2_chain_unlock(scan);
287 hammer2_chain_drop(scan); /* ref from deferral */
291 * Flush pass1 on root.
293 info.diddeferral = 0;
294 hammer2_chain_flush_core(&info, chain);
296 kprintf("flush_core_done parent=<base> chain=%p.%d %08x\n",
297 chain, chain->bref.type, chain->flags);
301 * Only loop if deep recursions have been deferred.
303 if (TAILQ_EMPTY(&info.flush_list))
309 * This is the core of the chain flushing code. The chain is locked by the
310 * caller and remains locked on return. This function is keyed off of
311 * the SUBMODIFIED bit but must make fine-grained choices based on the
312 * synchronization point we are flushing to.
314 * If the flush accomplished any work chain will be flagged MOVED
315 * indicating a copy-on-write propagation back up is required.
316 * Deep sub-nodes may also have been entered onto the deferral list.
317 * MOVED is never set on the volume root.
319 * NOTE: modify_tid is different from MODIFIED. modify_tid is updated
320 * only when a chain is specifically modified, and not updated
321 * for copy-on-write propagations. MODIFIED is set on any modification
322 * including copy-on-write propagations.
325 hammer2_chain_flush_core(hammer2_flush_info_t *info, hammer2_chain_t *chain)
327 hammer2_mount_t *hmp;
328 hammer2_blockref_t *bref;
330 hammer2_tid_t saved_sync;
331 hammer2_trans_t *trans = info->trans;
332 hammer2_chain_core_t *core;
345 kprintf("flush_core %p->%p.%d %08x (%s)\n",
346 info->parent, chain, chain->bref.type,
348 ((chain->bref.type == HAMMER2_BREF_TYPE_INODE) ?
349 chain->data->ipdata.filename : "?"));
351 kprintf("flush_core NULL->%p.%d %08x (%s)\n",
352 chain, chain->bref.type,
354 ((chain->bref.type == HAMMER2_BREF_TYPE_INODE) ?
355 chain->data->ipdata.filename : "?"));
358 * Ignore chains modified beyond the current flush point. These
359 * will be treated as if they did not exist.
361 if (chain->modify_tid > info->sync_tid)
365 * Deleted chains which have not been destroyed must be retained,
366 * and we probably have to recurse to clean-up any sub-trees.
367 * However, restricted flushes can stop processing here because
368 * the chain cleanup will be handled by a later normal flush.
370 * The MODIFIED bit can likely be cleared in this situation and we
371 * will do so later on in this procedure.
373 if (chain->delete_tid <= info->sync_tid) {
374 if (trans->flags & HAMMER2_TRANS_RESTRICTED)
378 saved_sync = info->sync_tid;
382 * If SUBMODIFIED is set we recurse the flush and adjust the
383 * blockrefs accordingly.
385 * NOTE: Looping on SUBMODIFIED can prevent a flush from ever
386 * finishing in the face of filesystem activity.
388 if (chain->flags & HAMMER2_CHAIN_SUBMODIFIED) {
389 hammer2_chain_t *saved_parent;
390 hammer2_tid_t saved_mirror;
393 * Clear SUBMODIFIED to catch races. Note that any child
394 * with MODIFIED, DELETED, or MOVED set during Scan2, after
395 * it processes the child, will cause SUBMODIFIED to be
397 * child has to be flushed SUBMODIFIED will wind up being
398 * set again (for next time), but this does not stop us from
399 * synchronizing block updates which occurred.
401 * We don't want to set our chain to MODIFIED gratuitously.
403 * We need an extra ref on chain because we are going to
404 * release its lock temporarily in our child loop.
406 atomic_clear_int(&chain->flags, HAMMER2_CHAIN_SUBMODIFIED);
407 hammer2_chain_ref(chain);
410 * Run two passes. The first pass handles MODIFIED and
411 * SUBMODIFIED chains and recurses while the second pass
412 * handles MOVED chains on the way back up.
414 * If the stack gets too deep we defer scan1, but must
415 * be sure to still run scan2 if on the next loop the
416 * deferred chain has been flushed and now needs MOVED
417 * handling on the way back up.
419 * Scan1 is recursive.
421 * NOTE: The act of handling a modified/submodified chain can
422 * cause the MOVED Flag to be set. It can also be set
423 * via hammer2_chain_delete() and in other situations.
425 * NOTE: RB_SCAN() must be used instead of RB_FOREACH()
426 * because children can be physically removed during
429 saved_parent = info->parent;
430 saved_mirror = info->mirror_tid;
431 info->parent = chain;
432 info->mirror_tid = chain->bref.mirror_tid;
434 if (info->depth == HAMMER2_FLUSH_DEPTH_LIMIT) {
435 if ((chain->flags & HAMMER2_CHAIN_DEFERRED) == 0) {
436 hammer2_chain_ref(chain);
437 TAILQ_INSERT_TAIL(&info->flush_list,
439 atomic_set_int(&chain->flags,
440 HAMMER2_CHAIN_DEFERRED);
444 info->diddeferral = 0;
445 spin_lock(&core->cst.spin);
446 RB_SCAN(hammer2_chain_tree, &chain->core->rbtree,
447 NULL, hammer2_chain_flush_scan1, info);
448 spin_unlock(&core->cst.spin);
449 diddeferral += info->diddeferral;
453 * Handle successfully flushed children who are in the MOVED
454 * state on the way back up the recursion. This can have
455 * the side-effect of clearing MOVED.
457 * We execute this even if there were deferrals to try to
458 * keep the chain topology cleaner.
460 * Scan2 is non-recursive.
463 atomic_set_int(&chain->flags,
464 HAMMER2_CHAIN_SUBMODIFIED);
467 kprintf("scan2_start parent %p %08x\n",
468 chain, chain->flags);
470 spin_lock(&core->cst.spin);
471 RB_SCAN(hammer2_chain_tree, &core->rbtree,
472 NULL, hammer2_chain_flush_scan2, info);
473 spin_unlock(&core->cst.spin);
475 kprintf("scan2_stop parent %p %08x\n",
476 chain, chain->flags);
479 chain->bref.mirror_tid = info->mirror_tid;
480 info->mirror_tid = saved_mirror;
481 info->parent = saved_parent;
482 hammer2_chain_drop(chain);
486 * Restore sync_tid in case it was restricted by a delete/duplicate.
488 info->sync_tid = saved_sync;
491 * Rollup diddeferral for caller. Note direct assignment, not +=.
493 info->diddeferral = diddeferral;
496 * Do not flush chain if there were any deferrals. It will be
497 * retried later after the deferrals are independently handled.
500 if (hammer2_debug & 0x0008) {
501 kprintf("%*.*s} %p/%d %04x (deferred)",
502 info->depth, info->depth, "",
503 chain, chain->refs, chain->flags);
509 * If we encounter a deleted chain within our flush we can clear
510 * the MODIFIED bit and avoid flushing it whether it has been
513 if (chain->delete_tid <= info->sync_tid) {
514 if (chain->flags & HAMMER2_CHAIN_MODIFIED) {
516 if (chain->bytes == chain->bp->b_bufsize)
517 chain->bp->b_flags |= B_INVAL|B_RELBUF;
519 atomic_clear_int(&chain->flags, HAMMER2_CHAIN_MODIFIED);
520 hammer2_chain_drop(chain);
525 if ((chain->flags & HAMMER2_CHAIN_DESTROYED) &&
526 (chain->flags & HAMMER2_CHAIN_DELETED) &&
527 (trans->flags & HAMMER2_TRANS_RESTRICTED) == 0) {
529 * Throw-away the MODIFIED flag
531 if (chain->flags & HAMMER2_CHAIN_MODIFIED) {
533 if (chain->bytes == chain->bp->b_bufsize)
534 chain->bp->b_flags |= B_INVAL|B_RELBUF;
536 atomic_clear_int(&chain->flags, HAMMER2_CHAIN_MODIFIED);
537 hammer2_chain_drop(chain);
544 * A degenerate flush might not have flushed anything and thus not
545 * processed modified blocks on the way back up. Detect the case.
547 * Note that MOVED can be set without MODIFIED being set due to
548 * a deletion, in which case it is handled by Scan2 later on.
550 * Both bits can be set along with DELETED due to a deletion if
551 * modified data within the synchronization zone and the chain
552 * was then deleted beyond the zone, in which case we still have
553 * to flush for synchronization point consistency. Otherwise though
554 * DELETED and MODIFIED are treated as separate flags.
556 if ((chain->flags & HAMMER2_CHAIN_MODIFIED) == 0)
562 * A DESTROYED node that reaches this point must be flushed for
563 * synchronization point consistency.
567 * Update mirror_tid, clear MODIFIED, and set MOVED.
569 * The caller will update the parent's reference to this chain
570 * by testing MOVED as long as the modification was in-bounds.
572 * MOVED is never set on the volume root as there is no parent
575 if (chain->bref.mirror_tid < info->sync_tid)
576 chain->bref.mirror_tid = info->sync_tid;
577 wasmodified = (chain->flags & HAMMER2_CHAIN_MODIFIED) != 0;
578 atomic_clear_int(&chain->flags, HAMMER2_CHAIN_MODIFIED);
579 if (chain == &hmp->vchain)
580 kprintf("(FLUSHED VOLUME HEADER)\n");
581 if (chain == &hmp->fchain)
582 kprintf("(FLUSHED FREEMAP HEADER)\n");
584 if ((chain->flags & HAMMER2_CHAIN_MOVED) ||
585 chain == &hmp->vchain ||
586 chain == &hmp->fchain) {
588 * Drop the ref from the MODIFIED bit we cleared.
591 hammer2_chain_drop(chain);
594 * If we were MODIFIED we inherit the ref from clearing
595 * that bit, otherwise we need another ref.
597 if (wasmodified == 0)
598 hammer2_chain_ref(chain);
599 atomic_set_int(&chain->flags, HAMMER2_CHAIN_MOVED);
603 * If this is part of a recursive flush we can go ahead and write
604 * out the buffer cache buffer and pass a new bref back up the chain
607 * Volume headers are NOT flushed here as they require special
610 switch(chain->bref.type) {
611 case HAMMER2_BREF_TYPE_FREEMAP:
612 hammer2_modify_volume(hmp);
614 case HAMMER2_BREF_TYPE_VOLUME:
616 * We should flush the free block table before we calculate
617 * CRCs and copy voldata -> volsync.
619 hammer2_chain_lock(&hmp->fchain, HAMMER2_RESOLVE_ALWAYS);
620 if (hmp->fchain.flags & (HAMMER2_CHAIN_MODIFIED |
621 HAMMER2_CHAIN_SUBMODIFIED)) {
622 /* this will modify vchain as a side effect */
623 hammer2_chain_flush(info->trans, &hmp->fchain);
625 hammer2_chain_unlock(&hmp->fchain);
628 * The volume header is flushed manually by the syncer, not
629 * here. All we do is adjust the crc's.
631 KKASSERT(chain->data != NULL);
632 KKASSERT(chain->bp == NULL);
633 kprintf("volume header mirror_tid %jd\n",
634 hmp->voldata.mirror_tid);
636 hmp->voldata.icrc_sects[HAMMER2_VOL_ICRC_SECT1]=
638 (char *)&hmp->voldata +
639 HAMMER2_VOLUME_ICRC1_OFF,
640 HAMMER2_VOLUME_ICRC1_SIZE);
641 hmp->voldata.icrc_sects[HAMMER2_VOL_ICRC_SECT0]=
643 (char *)&hmp->voldata +
644 HAMMER2_VOLUME_ICRC0_OFF,
645 HAMMER2_VOLUME_ICRC0_SIZE);
646 hmp->voldata.icrc_volheader =
648 (char *)&hmp->voldata +
649 HAMMER2_VOLUME_ICRCVH_OFF,
650 HAMMER2_VOLUME_ICRCVH_SIZE);
651 hmp->volsync = hmp->voldata;
652 atomic_set_int(&chain->flags, HAMMER2_CHAIN_VOLUMESYNC);
654 case HAMMER2_BREF_TYPE_DATA:
656 * Data elements have already been flushed via the logical
657 * file buffer cache. Their hash was set in the bref by
658 * the vop_write code.
660 * Make sure any device buffer(s) have been flushed out here.
661 * (there aren't usually any to flush).
663 bbytes = chain->bytes;
664 pbase = chain->bref.data_off & ~(hammer2_off_t)(bbytes - 1);
665 boff = chain->bref.data_off & HAMMER2_OFF_MASK & (bbytes - 1);
667 bp = getblk(hmp->devvp, pbase, bbytes, GETBLK_NOWAIT, 0);
669 if ((bp->b_flags & (B_CACHE | B_DIRTY)) ==
670 (B_CACHE | B_DIRTY)) {
673 bp->b_flags |= B_RELBUF;
678 case HAMMER2_BREF_TYPE_INDIRECT:
680 * Indirect blocks may be in an INITIAL state. Use the
681 * chain_lock() call to ensure that the buffer has been
682 * instantiated (even though it is already locked the buffer
683 * might not have been instantiated).
685 * Only write the buffer out if it is dirty, it is possible
686 * the operating system had already written out the buffer.
688 hammer2_chain_lock(chain, HAMMER2_RESOLVE_ALWAYS);
689 KKASSERT(chain->bp != NULL);
692 if ((chain->flags & HAMMER2_CHAIN_DIRTYBP) ||
693 (bp->b_flags & B_DIRTY)) {
700 hammer2_chain_unlock(chain);
702 case HAMMER2_BREF_TYPE_FREEMAP_NODE:
703 case HAMMER2_BREF_TYPE_FREEMAP_LEAF:
705 * Device-backed. Buffer will be flushed by the sync
711 * Embedded elements have to be flushed out.
712 * (Basically just BREF_TYPE_INODE).
714 KKASSERT(chain->data != NULL);
715 KKASSERT(chain->bp == NULL);
718 KKASSERT((bref->data_off & HAMMER2_OFF_MASK) != 0);
719 KKASSERT(HAMMER2_DEC_CHECK(chain->bref.methods) ==
720 HAMMER2_CHECK_ISCSI32);
722 if (chain->bp == NULL) {
724 * The data is embedded, we have to acquire the
725 * buffer cache buffer and copy the data into it.
727 if ((bbytes = chain->bytes) < HAMMER2_MINIOSIZE)
728 bbytes = HAMMER2_MINIOSIZE;
729 pbase = bref->data_off & ~(hammer2_off_t)(bbytes - 1);
730 boff = bref->data_off & HAMMER2_OFF_MASK & (bbytes - 1);
733 * The getblk() optimization can only be used if the
734 * physical block size matches the request.
736 if (chain->bytes == bbytes) {
737 bp = getblk(hmp->devvp, pbase, bbytes, 0, 0);
740 error = bread(hmp->devvp, pbase, bbytes, &bp);
741 KKASSERT(error == 0);
743 bdata = (char *)bp->b_data + boff;
746 * Copy the data to the buffer, mark the buffer
747 * dirty, and convert the chain to unmodified.
749 bcopy(chain->data, bdata, chain->bytes);
750 bp->b_flags |= B_CLUSTEROK;
753 chain->bref.check.iscsi32.value =
754 hammer2_icrc32(chain->data, chain->bytes);
755 if (chain->bref.type == HAMMER2_BREF_TYPE_INODE)
756 ++hammer2_iod_meta_write;
758 ++hammer2_iod_indr_write;
760 chain->bref.check.iscsi32.value =
761 hammer2_icrc32(chain->data, chain->bytes);
767 * Flush helper scan1 (recursive)
769 * Flushes the children of the caller's chain (parent) and updates
770 * the blockref, restricted by sync_tid.
772 * Ripouts during the loop should not cause any problems. Because we are
773 * flushing to a synchronization point, modification races will occur after
774 * sync_tid and do not have to be flushed anyway.
776 * It is also ok if the parent is chain_duplicate()'d while unlocked because
777 * the delete/duplication will install a delete_tid that is still larger than
778 * our current sync_tid.
781 hammer2_chain_flush_scan1(hammer2_chain_t *child, void *data)
783 hammer2_flush_info_t *info = data;
784 hammer2_trans_t *trans = info->trans;
785 hammer2_chain_t *parent = info->parent;
786 /*hammer2_mount_t *hmp = info->hmp;*/
790 * We should only need to recurse if SUBMODIFIED is set, but as
791 * a safety also recurse if MODIFIED is also set.
793 * Return early if neither bit is set. We must re-assert the
794 * SUBMODIFIED flag in the parent if any child covered by the
795 * parent (via delete_tid) is skipped.
797 if ((child->flags & (HAMMER2_CHAIN_MODIFIED |
798 HAMMER2_CHAIN_SUBMODIFIED)) == 0) {
801 if (child->modify_tid > trans->sync_tid) {
802 if (parent->delete_tid > trans->sync_tid) {
803 atomic_set_int(&parent->flags,
804 HAMMER2_CHAIN_SUBMODIFIED);
809 hammer2_chain_ref(child);
810 spin_unlock(&parent->core->cst.spin);
813 * The caller has added a ref to the parent so we can temporarily
814 * unlock it in order to lock the child. Re-check the flags before
817 hammer2_chain_unlock(parent);
818 hammer2_chain_lock(child, HAMMER2_RESOLVE_MAYBE);
820 if ((child->flags & (HAMMER2_CHAIN_MODIFIED |
821 HAMMER2_CHAIN_SUBMODIFIED)) == 0) {
822 hammer2_chain_unlock(child);
823 hammer2_chain_drop(child);
824 hammer2_chain_lock(parent, HAMMER2_RESOLVE_MAYBE);
825 spin_lock(&parent->core->cst.spin);
828 if (child->modify_tid > trans->sync_tid) {
829 hammer2_chain_unlock(child);
830 hammer2_chain_drop(child);
831 hammer2_chain_lock(parent, HAMMER2_RESOLVE_MAYBE);
832 spin_lock(&parent->core->cst.spin);
833 if (parent->delete_tid > trans->sync_tid) {
834 atomic_set_int(&parent->flags,
835 HAMMER2_CHAIN_SUBMODIFIED);
841 * The DESTROYED flag can only be initially set on an unreferenced
842 * deleted inode and will propagate downward via the mechanic below.
843 * Such inode chains have been deleted for good and should no longer
844 * be subject to delete/duplication.
846 * This optimization allows the inode reclaim (destroy unlinked file
847 * on vnode reclamation after last close) to be flagged by just
848 * setting HAMMER2_CHAIN_DESTROYED at the top level and then will
849 * cause the chains to be terminated and related buffers to be
850 * invalidated and not flushed out.
852 * We have to be careful not to propagate the DESTROYED flag if
853 * the destruction occurred after our flush sync_tid.
855 if ((parent->flags & HAMMER2_CHAIN_DESTROYED) &&
856 (child->flags & HAMMER2_CHAIN_DELETED) &&
857 (child->flags & HAMMER2_CHAIN_DESTROYED) == 0) {
858 atomic_set_int(&child->flags, HAMMER2_CHAIN_DESTROYED |
859 HAMMER2_CHAIN_SUBMODIFIED);
863 * Recurse and collect deferral data.
865 diddeferral = info->diddeferral;
867 hammer2_chain_flush_core(info, child);
869 kprintf("flush_core_done parent=%p flags=%08x child=%p.%d %08x\n",
870 parent, parent->flags, child, child->bref.type, child->flags);
873 info->diddeferral += diddeferral;
875 if (child->flags & HAMMER2_CHAIN_SUBMODIFIED)
876 atomic_set_int(&parent->flags, HAMMER2_CHAIN_SUBMODIFIED);
878 hammer2_chain_unlock(child);
879 hammer2_chain_drop(child);
881 hammer2_chain_lock(parent, HAMMER2_RESOLVE_MAYBE);
883 spin_lock(&parent->core->cst.spin);
888 * Flush helper scan2 (non-recursive)
890 * This pass on a chain's children propagates any MOVED or DELETED
891 * elements back up the chain towards the root after those elements have
892 * been fully flushed. Unlike scan1, this function is NOT recursive and
893 * the parent remains locked across the entire scan.
895 * NOTE! We must re-set SUBMODIFIED on the parent(s) as appropriate, and
896 * due to the above conditions it is possible to do this and still
897 * have some children flagged MOVED depending on the synchronization.
899 * NOTE! A deletion is a visbility issue, there can still be referenced to
900 * deleted elements (for example, to an unlinked file which is still
901 * open), and there can also be multiple chains pointing to the same
902 * bref where some are deleted and some are not (for example due to
903 * a rename). So a chain marked for deletion is basically considered
904 * to be live until it is explicitly destroyed or until its ref-count
905 * reaches zero (also implying that MOVED and MODIFIED are clear).
908 hammer2_chain_flush_scan2(hammer2_chain_t *child, void *data)
910 hammer2_flush_info_t *info = data;
911 hammer2_chain_t *parent = info->parent;
912 hammer2_chain_core_t *above = child->above;
913 hammer2_mount_t *hmp = info->hmp;
914 hammer2_trans_t *trans = info->trans;
915 hammer2_blockref_t *base;
919 * Inodes with stale children that have been converted to DIRECTDATA
920 * mode (file extension or hardlink conversion typically) need to
921 * skipped right now before we start messing with a non-existant
925 if (parent->bref.type == HAMMER2_BREF_TYPE_INODE &&
926 (parent->data->ipdata.op_flags & HAMMER2_OPFLAG_DIRECTDATA)) {
935 * Ignore children created after our flush point, treating them as
936 * if they did not exist). These children will not cause the parent
939 * When we encounter such children and the parent chain has not been
940 * deleted, delete/duplicated, or delete/duplicated-for-move, then
941 * the parent may be used to funnel through several flush points.
942 * We must re-set the SUBMODIFIED flag in the parent to ensure that
943 * those flushes have visbility. A simple test of delete_tid suffices
944 * to determine if the parent spans beyond our current flush.
946 if (child->modify_tid > trans->sync_tid) {
954 * Ignore children which have not changed. The parent's block table
955 * is already correct.
957 if ((child->flags & HAMMER2_CHAIN_MOVED) == 0) {
965 hammer2_chain_ref(child);
966 spin_unlock(&above->cst.spin);
969 * The MOVED bit implies an additional reference which prevents
970 * the child from being destroyed out from under our operation
971 * so we can lock the child safely without worrying about it
972 * getting ripped up (?).
974 * We can only update parents where child->parent matches. The
975 * child->parent link will migrate along the chain but the flush
976 * order must be enforced absolutely. Parent reflushed after the
977 * child has passed them by should skip due to the modify_tid test.
979 hammer2_chain_lock(child, HAMMER2_RESOLVE_NEVER);
982 * The parent's blockref to the child must be deleted or updated.
984 * This point is not reached on successful DESTROYED optimizations
985 * but can be reached on recursive deletions and restricted flushes.
987 * Because flushes are ordered we do not have to make a
988 * modify/duplicate of indirect blocks. That is, the flush
989 * code does not have to kmalloc or duplicate anything. We
990 * can adjust the indirect block table in-place and reuse the
991 * chain. It IS possible that the chain has already been duplicated
992 * or may wind up being duplicated on-the-fly by modifying code
993 * on the frontend. We simply use the original and ignore such
994 * chains. However, it does mean we can't clear the MOVED bit.
996 * XXX recursive deletions not optimized.
998 hammer2_chain_modify(trans, &parent,
999 HAMMER2_MODIFY_NO_MODIFY_TID |
1000 HAMMER2_MODIFY_ASSERTNOCOPY);
1002 switch(parent->bref.type) {
1003 case HAMMER2_BREF_TYPE_INODE:
1005 * XXX Should assert that OPFLAG_DIRECTDATA is 0 once we
1006 * properly duplicate the inode headers and do proper flush
1007 * range checks (all the children should be beyond the flush
1008 * point). For now just don't sync the non-applicable
1011 * XXX Can also occur due to hardlink consolidation. We
1012 * set OPFLAG_DIRECTDATA to prevent the indirect and data
1013 * blocks from syncing ot the hardlink pointer.
1016 KKASSERT((parent->data->ipdata.op_flags &
1017 HAMMER2_OPFLAG_DIRECTDATA) == 0);
1020 if (parent->data->ipdata.op_flags &
1021 HAMMER2_OPFLAG_DIRECTDATA) {
1026 base = &parent->data->ipdata.u.blockset.blockref[0];
1027 count = HAMMER2_SET_COUNT;
1030 case HAMMER2_BREF_TYPE_INDIRECT:
1031 case HAMMER2_BREF_TYPE_FREEMAP_NODE:
1033 base = &parent->data->npdata.blockref[0];
1036 KKASSERT(child->flags & HAMMER2_CHAIN_DELETED);
1038 count = parent->bytes / sizeof(hammer2_blockref_t);
1040 case HAMMER2_BREF_TYPE_VOLUME:
1041 base = &hmp->voldata.sroot_blockset.blockref[0];
1042 count = HAMMER2_SET_COUNT;
1044 case HAMMER2_BREF_TYPE_FREEMAP:
1045 base = &parent->data->npdata.blockref[0];
1046 count = HAMMER2_SET_COUNT;
1051 panic("hammer2_chain_get: "
1052 "unrecognized blockref type: %d",
1057 * Update the parent's blockref table and propagate mirror_tid.
1059 * NOTE! Children with modify_tid's beyond our flush point are
1060 * considered to not exist for the purposes of updating the
1061 * parent's blockref array.
1063 * NOTE! Updates to a parent's blockref table do not adjust the
1064 * parent's bref.modify_tid, only its bref.mirror_tid.
1066 KKASSERT(child->index >= 0);
1067 if (child->delete_tid <= trans->sync_tid) {
1069 KKASSERT(child->index < count);
1070 bzero(&base[child->index], sizeof(child->bref));
1071 if (info->mirror_tid < child->delete_tid)
1072 info->mirror_tid = child->delete_tid;
1076 KKASSERT(child->index < count);
1077 base[child->index] = child->bref;
1078 if (info->mirror_tid < child->modify_tid)
1079 info->mirror_tid = child->modify_tid;
1083 if (info->mirror_tid < child->bref.mirror_tid) {
1084 info->mirror_tid = child->bref.mirror_tid;
1086 if ((parent->bref.type == HAMMER2_BREF_TYPE_VOLUME ||
1087 parent->bref.type == HAMMER2_BREF_TYPE_FREEMAP) &&
1088 hmp->voldata.mirror_tid < child->bref.mirror_tid) {
1089 hmp->voldata.mirror_tid = child->bref.mirror_tid;
1093 * When can we safely clear the MOVED flag? Flushes down duplicate
1094 * paths can occur out of order, for example if an inode is moved
1095 * as part of a hardlink consolidation or if an inode is moved into
1096 * an indirect block indexed before the inode.
1098 * Only clear MOVED once all possible parents have been flushed.
1100 if (child->flags & HAMMER2_CHAIN_MOVED) {
1101 hammer2_chain_t *scan;
1104 spin_lock(&above->cst.spin);
1105 for (scan = above->first_parent;
1107 scan = scan->next_parent) {
1109 * XXX weird code also checked at the top of scan2,
1110 * I would like to fix this by detaching the core
1111 * on initial hardlink consolidation (1->2 nlinks).
1114 if (scan->bref.type == HAMMER2_BREF_TYPE_INODE &&
1115 (scan->data->ipdata.op_flags &
1116 HAMMER2_OPFLAG_DIRECTDATA)) {
1120 if (scan->flags & HAMMER2_CHAIN_SUBMODIFIED) {
1125 spin_unlock(&above->cst.spin);
1127 atomic_clear_int(&child->flags, HAMMER2_CHAIN_MOVED);
1128 hammer2_chain_drop(child); /* flag */
1133 * Unlock the child. This can wind up dropping the child's
1134 * last ref, removing it from the parent's RB tree, and deallocating
1135 * the structure. The RB_SCAN() our caller is doing handles the
1138 hammer2_chain_unlock(child);
1139 hammer2_chain_drop(child);
1140 spin_lock(&above->cst.spin);
1146 * The parent cleared SUBMODIFIED prior to the scan. If the child
1147 * still requires a flush (possibly due to being outside the current
1148 * synchronization zone), we must re-set SUBMODIFIED on the way back
1153 kprintf("G child %p 08x\n", child, child->flags);