Merge branch 'vendor/BMAKE'
[dragonfly.git] / sys / vfs / hammer2 / hammer2_flush.c
1 /*
2  * Copyright (c) 2011-2013 The DragonFly Project.  All rights reserved.
3  *
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>
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
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
17  *    distribution.
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.
21  *
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
33  * SUCH DAMAGE.
34  */
35
36 #include <sys/cdefs.h>
37 #include <sys/param.h>
38 #include <sys/systm.h>
39 #include <sys/types.h>
40 #include <sys/lock.h>
41 #include <sys/uuid.h>
42
43 #include "hammer2.h"
44
45 #define FLUSH_DEBUG 0
46
47 /*
48  * Recursively flush the specified chain.  The chain is locked and
49  * referenced by the caller and will remain so on return.  The chain
50  * will remain referenced throughout but can temporarily lose its
51  * lock during the recursion to avoid unnecessarily stalling user
52  * processes.
53  */
54 struct hammer2_flush_info {
55         hammer2_chain_t *parent;
56         hammer2_trans_t *trans;
57         int             depth;
58         int             diddeferral;
59         int             pass;
60         int             cache_index;
61         int             domodify;
62         struct h2_flush_deferral_list flush_list;
63         hammer2_tid_t   sync_tid;       /* flush synchronization point */
64 };
65
66 typedef struct hammer2_flush_info hammer2_flush_info_t;
67
68 static void hammer2_chain_flush_core(hammer2_flush_info_t *info,
69                                 hammer2_chain_t **chainp);
70 static int hammer2_chain_flush_scan1(hammer2_chain_t *child, void *data);
71 static int hammer2_chain_flush_scan2(hammer2_chain_t *child, void *data);
72 static void hammer2_rollup_stats(hammer2_chain_t *parent,
73                                 hammer2_chain_t *child, int how);
74
75 /*
76  * Can we ignore a chain for the purposes of flushing modifications
77  * to the media?
78  */
79 static __inline
80 int
81 h2ignore_deleted(hammer2_flush_info_t *info, hammer2_chain_t *chain)
82 {
83         return (chain->delete_tid <= info->sync_tid &&
84                 (chain->bref.type != HAMMER2_BREF_TYPE_INODE ||
85                  (chain->flags & HAMMER2_CHAIN_DESTROYED)));
86 }
87
88 #if 0
89 static __inline
90 void
91 hammer2_updatestats(hammer2_flush_info_t *info, hammer2_blockref_t *bref,
92                     int how)
93 {
94         hammer2_key_t bytes;
95
96         if (bref->type != 0) {
97                 bytes = 1 << (bref->data_off & HAMMER2_OFF_MASK_RADIX);
98                 if (bref->type == HAMMER2_BREF_TYPE_INODE)
99                         info->inode_count += how;
100                 if (how < 0)
101                         info->data_count -= bytes;
102                 else
103                         info->data_count += bytes;
104         }
105 }
106 #endif
107
108 /*
109  * Transaction support functions for writing to the filesystem.
110  *
111  * Initializing a new transaction allocates a transaction ID.  Typically
112  * passed a pmp (hmp passed as NULL), indicating a cluster transaction.  Can
113  * be passed a NULL pmp and non-NULL hmp to indicate a transaction on a single
114  * media target.  The latter mode is used by the recovery code.
115  *
116  * TWO TRANSACTION IDs can run concurrently, where one is a flush and the
117  * other is a set of any number of concurrent filesystem operations.  We
118  * can either have <running_fs_ops> + <waiting_flush> + <blocked_fs_ops>
119  * or we can have <running_flush> + <concurrent_fs_ops>.
120  *
121  * During a flush, new fs_ops are only blocked until the fs_ops prior to
122  * the flush complete.  The new fs_ops can then run concurrent with the flush.
123  *
124  * Buffer-cache transactions operate as fs_ops but never block.  A
125  * buffer-cache flush will run either before or after the current pending
126  * flush depending on its state.
127  *
128  * sync_tid vs real_tid.  For flush transactions ONLY, the flush operation
129  * actually uses two transaction ids, one for the flush operation itself,
130  * and <N+1> for any freemap allocations made as a side-effect.  real_tid
131  * is fixed at <N>, sync_tid is adjusted dynamically as-needed.
132  *
133  * NOTE: The sync_tid for a flush's freemap allocation will match the
134  *       sync_tid of the following <concurrent_fs_ops> transaction(s).
135  *       The freemap topology will be out-of-step by one transaction id
136  *       in order to give the flusher a stable freemap topology to flush
137  *       out.  This is fixed up at mount-time using a quick incremental
138  *       scan.
139  */
140 void
141 hammer2_trans_init(hammer2_trans_t *trans, hammer2_pfsmount_t *pmp,
142                    hammer2_mount_t *hmp, int flags)
143 {
144         hammer2_trans_t *head;
145
146         bzero(trans, sizeof(*trans));
147         if (pmp) {
148                 trans->pmp = pmp;
149                 KKASSERT(hmp == NULL);
150                 hmp = pmp->cluster.chains[0]->hmp;      /* XXX */
151         } else {
152                 trans->hmp_single = hmp;
153                 KKASSERT(hmp);
154         }
155
156         hammer2_voldata_lock(hmp);
157         trans->flags = flags;
158         trans->td = curthread;
159         /*trans->delete_gen = 0;*/      /* multiple deletions within trans */
160
161         if (flags & HAMMER2_TRANS_ISFLUSH) {
162                 /*
163                  * If multiple flushes are trying to run we have to
164                  * wait until it is our turn.  All flushes are serialized.
165                  *
166                  * We queue ourselves and then wait to become the head
167                  * of the queue, allowing all prior flushes to complete.
168                  *
169                  * A unique transaction id is required to avoid confusion
170                  * when updating the block tables.
171                  */
172                 ++hmp->flushcnt;
173                 ++hmp->voldata.alloc_tid;
174                 trans->sync_tid = hmp->voldata.alloc_tid;
175                 trans->real_tid = trans->sync_tid;
176                 ++hmp->voldata.alloc_tid;
177                 TAILQ_INSERT_TAIL(&hmp->transq, trans, entry);
178                 if (TAILQ_FIRST(&hmp->transq) != trans) {
179                         trans->blocked = 1;
180                         while (trans->blocked) {
181                                 lksleep(&trans->sync_tid, &hmp->voldatalk,
182                                         0, "h2multf", hz);
183                         }
184                 }
185         } else if (hmp->flushcnt == 0) {
186                 /*
187                  * No flushes are pending, we can go.
188                  */
189                 TAILQ_INSERT_TAIL(&hmp->transq, trans, entry);
190                 trans->sync_tid = hmp->voldata.alloc_tid;
191                 trans->real_tid = trans->sync_tid;
192
193                 /* XXX improve/optimize inode allocation */
194         } else {
195                 /*
196                  * One or more flushes are pending.  We insert after
197                  * the current flush and may block.  We have priority
198                  * over any flushes that are not the current flush.
199                  *
200                  * TRANS_BUFCACHE transactions cannot block.
201                  */
202                 TAILQ_FOREACH(head, &hmp->transq, entry) {
203                         if (head->flags & HAMMER2_TRANS_ISFLUSH)
204                                 break;
205                 }
206                 KKASSERT(head);
207                 TAILQ_INSERT_AFTER(&hmp->transq, head, trans, entry);
208                 trans->sync_tid = head->real_tid + 1;
209                 trans->real_tid = trans->sync_tid;
210
211                 if ((trans->flags & HAMMER2_TRANS_BUFCACHE) == 0) {
212                         if (TAILQ_FIRST(&hmp->transq) != head) {
213                                 trans->blocked = 1;
214                                 while (trans->blocked) {
215                                         lksleep(&trans->sync_tid,
216                                                 &hmp->voldatalk, 0,
217                                                 "h2multf", hz);
218                                 }
219                         }
220                 }
221         }
222         if (flags & HAMMER2_TRANS_NEWINODE)
223                 trans->inode_tid = hmp->voldata.inode_tid++;
224         hammer2_voldata_unlock(hmp, 0);
225 }
226
227 void
228 hammer2_trans_done(hammer2_trans_t *trans)
229 {
230         hammer2_mount_t *hmp;
231         hammer2_trans_t *head;
232         hammer2_trans_t *scan;
233
234         if (trans->pmp)
235                 hmp = trans->pmp->cluster.chains[0]->hmp;
236         else
237                 hmp = trans->hmp_single;
238
239         /*
240          * Remove and adjust flushcnt
241          */
242         hammer2_voldata_lock(hmp);
243         TAILQ_REMOVE(&hmp->transq, trans, entry);
244         if (trans->flags & HAMMER2_TRANS_ISFLUSH)
245                 --hmp->flushcnt;
246
247         /*
248          * Unblock the head of the queue and any additional transactions
249          * up to the next flush.
250          */
251         head = TAILQ_FIRST(&hmp->transq);
252         if (head && head->blocked) {
253                 head->blocked = 0;
254                 wakeup(&head->sync_tid);
255
256                 scan = TAILQ_NEXT(head, entry);
257                 while (scan && (scan->flags & HAMMER2_TRANS_ISFLUSH) == 0) {
258                         if (scan->blocked) {
259                                 scan->blocked = 0;
260                                 wakeup(&scan->sync_tid);
261                         }
262                         scan = TAILQ_NEXT(scan, entry);
263                 }
264         }
265         hammer2_voldata_unlock(hmp, 0);
266 }
267
268 /*
269  * Flush the chain and all modified sub-chains through the specified
270  * synchronization point (sync_tid), propagating parent chain modifications
271  * and mirror_tid updates back up as needed.  Since we are recursing downward
272  * we do not have to deal with the complexities of multi-homed chains (chains
273  * with multiple parents).
274  *
275  * Caller must have interlocked against any non-flush-related modifying
276  * operations in progress whos modify_tid values are less than or equal
277  * to the passed sync_tid.
278  *
279  * Caller must have already vetted synchronization points to ensure they
280  * are properly flushed.  Only snapshots and cluster flushes can create
281  * these sorts of synchronization points.
282  *
283  * This routine can be called from several places but the most important
284  * is from the hammer2_vop_reclaim() function.  We want to try to completely
285  * clean out the inode structure to prevent disconnected inodes from
286  * building up and blowing out the kmalloc pool.  However, it is not actually
287  * necessary to flush reclaimed inodes to maintain HAMMER2's crash recovery
288  * capability.
289  *
290  * chain is locked on call and will remain locked on return.  If a flush
291  * occured, the chain's MOVED bit will be set indicating that its parent
292  * (which is not part of the flush) should be updated.  The chain may be
293  * replaced by the call.
294  */
295 void
296 hammer2_chain_flush(hammer2_trans_t *trans, hammer2_chain_t **chainp)
297 {
298         hammer2_chain_t *chain = *chainp;
299         hammer2_chain_t *scan;
300         hammer2_chain_core_t *core;
301         hammer2_flush_info_t info;
302         int loops;
303
304         /*
305          * Execute the recursive flush and handle deferrals.
306          *
307          * Chains can be ridiculously long (thousands deep), so to
308          * avoid blowing out the kernel stack the recursive flush has a
309          * depth limit.  Elements at the limit are placed on a list
310          * for re-execution after the stack has been popped.
311          */
312         bzero(&info, sizeof(info));
313         TAILQ_INIT(&info.flush_list);
314         info.trans = trans;
315         info.sync_tid = trans->sync_tid;
316         info.cache_index = -1;
317
318         core = chain->core;
319 #if FLUSH_DEBUG
320         kprintf("CHAIN FLUSH trans %p.%016jx chain %p.%d mod %016jx upd %016jx\n", trans, trans->sync_tid, chain, chain->bref.type, chain->modify_tid, core->update_lo);
321 #endif
322
323         /*
324          * Extra ref needed because flush_core expects it when replacing
325          * chain.
326          */
327         hammer2_chain_ref(chain);
328         loops = 0;
329
330         for (;;) {
331                 /*
332                  * Unwind deep recursions which had been deferred.  This
333                  * can leave MOVED set for these chains, which will be
334                  * handled when we [re]flush chain after the unwind.
335                  */
336                 while ((scan = TAILQ_FIRST(&info.flush_list)) != NULL) {
337                         KKASSERT(scan->flags & HAMMER2_CHAIN_DEFERRED);
338                         TAILQ_REMOVE(&info.flush_list, scan, flush_node);
339                         atomic_clear_int(&scan->flags, HAMMER2_CHAIN_DEFERRED);
340
341                         /*
342                          * Now that we've popped back up we can do a secondary
343                          * recursion on the deferred elements.
344                          *
345                          * NOTE: hammer2_chain_flush() may replace scan.
346                          */
347                         if (hammer2_debug & 0x0040)
348                                 kprintf("deferred flush %p\n", scan);
349                         hammer2_chain_lock(scan, HAMMER2_RESOLVE_MAYBE);
350                         hammer2_chain_drop(scan);       /* ref from deferral */
351                         hammer2_chain_flush(trans, &scan);
352                         hammer2_chain_unlock(scan);
353                 }
354
355                 /*
356                  * [re]flush chain.
357                  */
358                 info.diddeferral = 0;
359                 hammer2_chain_flush_core(&info, &chain);
360 #if FLUSH_DEBUG
361                 kprintf("flush_core_done parent=<base> chain=%p.%d %08x\n",
362                         chain, chain->bref.type, chain->flags);
363 #endif
364
365                 /*
366                  * Only loop if deep recursions have been deferred.
367                  */
368                 if (TAILQ_EMPTY(&info.flush_list))
369                         break;
370
371                 if (++loops % 1000 == 0) {
372                         kprintf("hammer2_chain_flush: excessive loops on %p\n",
373                                 chain);
374                         if (hammer2_debug & 0x100000)
375                                 Debugger("hell4");
376                 }
377         }
378         hammer2_chain_drop(chain);
379         *chainp = chain;
380 }
381
382 /*
383  * This is the core of the chain flushing code.  The chain is locked by the
384  * caller and must also have an extra ref on it by the caller, and remains
385  * locked and will have an extra ref on return.
386  *
387  * If the flush accomplished any work chain will be flagged MOVED
388  * indicating a copy-on-write propagation back up is required.
389  * Deep sub-nodes may also have been entered onto the deferral list.
390  * MOVED is never set on the volume root.
391  *
392  * NOTE: modify_tid is different from MODIFIED.  modify_tid is updated
393  *       only when a chain is specifically modified, and not updated
394  *       for copy-on-write propagations.  MODIFIED is set on any modification
395  *       including copy-on-write propagations.
396  *
397  * NOTE: We are responsible for updating chain->bref.mirror_tid and
398  *       core->update_lo  The caller is responsible for processing us into
399  *       our parent (if any).
400  *
401  *       We are also responsible for updating chain->core->update_lo to
402  *       prevent repeated recursions due to deferrals.
403  */
404 static void
405 hammer2_chain_flush_core(hammer2_flush_info_t *info, hammer2_chain_t **chainp)
406 {
407         hammer2_chain_t *chain = *chainp;
408         hammer2_mount_t *hmp;
409         hammer2_blockref_t *bref;
410         hammer2_chain_core_t *core;
411         char *bdata;
412         hammer2_io_t *dio;
413         int error;
414         int diddeferral;
415
416         hmp = chain->hmp;
417         core = chain->core;
418         diddeferral = info->diddeferral;
419
420 #if FLUSH_DEBUG
421         if (info->parent)
422                 kprintf("flush_core %p->%p.%d %08x (%s)\n",
423                         info->parent, chain, chain->bref.type,
424                         chain->flags,
425                         ((chain->bref.type == HAMMER2_BREF_TYPE_INODE) ?
426                                 (char *)chain->data->ipdata.filename : "?"));
427         else
428                 kprintf("flush_core NULL->%p.%d %08x (%s)\n",
429                         chain, chain->bref.type,
430                         chain->flags,
431                         ((chain->bref.type == HAMMER2_BREF_TYPE_INODE) ?
432                                 (char *)chain->data->ipdata.filename : "?"));
433         kprintf("PUSH   %p.%d %08x mod=%016jx del=%016jx mirror=%016jx (sync %016jx, update_lo %016jx)\n", chain, chain->bref.type, chain->flags, chain->modify_tid, chain->delete_tid, chain->bref.mirror_tid, info->sync_tid, core->update_lo);
434 #endif
435
436         /*
437          * Check if we even have any work to do.
438          *
439          * We do not update core->update_lo because there might be other
440          * paths to the core and we haven't actually checked it.
441          *
442          * This bit of code is capable of short-cutting entire sub-trees
443          * if they have not been touched.
444          */
445         if ((chain->flags & HAMMER2_CHAIN_MODIFIED) == 0 &&
446             (core->update_lo >= info->sync_tid ||
447              chain->bref.mirror_tid >= info->sync_tid ||
448              chain->bref.mirror_tid >= core->update_hi)) {
449                 KKASSERT(chain->modify_tid <= info->sync_tid);
450                 /* don't update update_lo, there may be other paths to core */
451                 /* don't update bref.mirror_tid, scan2 is not called */
452                 return;
453         }
454
455         /*
456          * Ignore chains modified beyond the current flush point.  These
457          * will be treated as if they did not exist.  Subchains with lower
458          * modify_tid's will still be accessible via other parents.
459          *
460          * Do not update bref.mirror_tid here, it will interfere with
461          * synchronization.  e.g. inode flush tid 1, concurrent D-D tid 2,
462          * then later on inode flush tid 2.  If we were to set mirror_tid
463          * to 1 during inode flush tid 1 the blockrefs would only be partially
464          * updated (and likely panic).
465          *
466          * Do not update core->update_lo here, there might be other paths
467          * to the core and we haven't actually flushed it.
468          *
469          * (vchain and fchain are exceptions since they cannot be duplicated)
470          */
471         if (chain->modify_tid > info->sync_tid &&
472             chain != &hmp->fchain && chain != &hmp->vchain) {
473                 chain->debug_reason = (chain->debug_reason & ~255) | 5;
474                 /* do not update bref.mirror_tid, scan2 ignores chain */
475                 /* do not update core->update_lo, there may be another path */
476                 return;
477         }
478
479 retry:
480         /*
481          * Early handling of deleted chains is required to avoid double
482          * recursions.  If the deleted chain has been duplicated then the
483          * flush will have visibility into chain->core via some other chain
484          * and we can safely terminate the operation right here.
485          *
486          * If the deleted chain has not been duplicated then the deletion
487          * is terminal and we must recurse to deal with any dirty chains
488          * under the deletion, including possibly flushing them out (e.g.
489          * open descriptor on an unlinked file).
490          */
491         if (chain->delete_tid <= info->sync_tid &&
492             (chain->flags & HAMMER2_CHAIN_DUPLICATED)) {
493                 chain->debug_reason = (chain->debug_reason & ~255) | 9;
494                 if (chain->flags & HAMMER2_CHAIN_MODIFIED) {
495 #if 0
496                         /*
497                          * XXX should be able to invalidate the buffer here.
498                          * XXX problem if reused, snapshotted, or reactivated.
499                          */
500                         if (chain->dio) {
501                                 hammer2_io_setinval(chain->dio, chain->bytes);
502                         }
503 #endif
504                         if ((chain->flags & HAMMER2_CHAIN_MOVED) == 0) {
505                                 hammer2_chain_ref(chain);
506                                 atomic_set_int(&chain->flags,
507                                                HAMMER2_CHAIN_MOVED);
508                         }
509                         atomic_clear_int(&chain->flags, HAMMER2_CHAIN_MODIFIED);
510                         hammer2_chain_drop(chain);
511                 }
512
513                 /*
514                  * Update mirror_tid, indicating that chain is synchronized
515                  * on its modification and block table.  This probably isn't
516                  * needed since scan2 should ignore deleted chains anyway.
517                  */
518                 if (chain->bref.mirror_tid < info->sync_tid)
519                         chain->bref.mirror_tid = info->sync_tid;
520                 /* do not update core->update_lo, there may be another path */
521                 return;
522         }
523
524         /*
525          * Recurse if we are not up-to-date.  Once we are done we will
526          * update update_lo if there were no deferrals.  update_lo can become
527          * higher than update_hi and is used to prevent re-recursions during
528          * the same flush cycle.
529          *
530          * update_hi was already checked and prevents initial recursions on
531          * subtrees which have not been modified.
532          *
533          * NOTE: We must recurse whether chain is flagged DELETED or not.
534          *       However, if it is flagged DELETED we limit sync_tid to
535          *       delete_tid to ensure that the chain's bref.mirror_tid is
536          *       not fully updated and causes it to miss the non-DELETED
537          *       path.
538          *
539          * NOTE: If a deferral occurs hammer2_chain_flush() will flush the
540          *       deferred chain independently which will update it's
541          *       bref.mirror_tid and prevent it from deferred again.
542          */
543         if (chain->bref.mirror_tid < info->sync_tid &&
544             chain->bref.mirror_tid < core->update_hi) {
545                 hammer2_chain_t *saved_parent;
546                 hammer2_chain_layer_t *layer;
547                 int saved_domodify;
548                 int save_gen;
549
550                 /*
551                  * Races will bump update_hi above trans->sync_tid causing
552                  * us to catch the issue in a later flush.
553                  *
554                  * We don't want to set our chain to MODIFIED gratuitously.
555                  *
556                  * We need an extra ref on chain because we are going to
557                  * release its lock temporarily in our child loop.
558                  */
559
560                 /*
561                  * Run two passes.  The first pass handles MODIFIED and
562                  * update_lo recursions while the second pass handles
563                  * MOVED chains on the way back up.
564                  *
565                  * If the stack gets too deep we defer the chain.   Since
566                  * hammer2_chain_core's can be shared at multiple levels
567                  * in the tree, we may encounter a chain that we had already
568                  * deferred.  We could undefer it but it will probably just
569                  * defer again so it is best to leave it deferred.
570                  *
571                  * Scan1 is recursive.
572                  *
573                  * NOTE: The act of handling a modified/submodified chain can
574                  *       cause the MOVED Flag to be set.  It can also be set
575                  *       via hammer2_chain_delete() and in other situations.
576                  *
577                  * NOTE: RB_SCAN() must be used instead of RB_FOREACH()
578                  *       because children can be physically removed during
579                  *       the scan.
580                  *
581                  * NOTE: We would normally not care about insertions except
582                  *       that some insertions might occur from the flush
583                  *       itself, so loop on generation number changes.
584                  */
585                 saved_parent = info->parent;
586                 saved_domodify = info->domodify;
587                 info->parent = chain;
588                 info->domodify = 0;
589                 chain->debug_reason = (chain->debug_reason & ~255) | 6;
590
591                 if (chain->flags & HAMMER2_CHAIN_DEFERRED) {
592                         ++info->diddeferral;
593                 } else if (info->depth == HAMMER2_FLUSH_DEPTH_LIMIT) {
594                         if ((chain->flags & HAMMER2_CHAIN_DEFERRED) == 0) {
595                                 hammer2_chain_ref(chain);
596                                 TAILQ_INSERT_TAIL(&info->flush_list,
597                                                   chain, flush_node);
598                                 atomic_set_int(&chain->flags,
599                                                HAMMER2_CHAIN_DEFERRED);
600                         }
601                         ++info->diddeferral;
602                 } else {
603                         spin_lock(&core->cst.spin);
604                         KKASSERT(core->good == 0x1234 && core->sharecnt > 0);
605                         do {
606                                 save_gen = core->generation;
607                                 TAILQ_FOREACH_REVERSE(layer, &core->layerq,
608                                                       h2_layer_list, entry) {
609                                         ++layer->refs;
610                                         KKASSERT(layer->good == 0xABCD);
611                                         RB_SCAN(hammer2_chain_tree,
612                                                 &layer->rbtree,
613                                                 NULL, hammer2_chain_flush_scan1,
614                                                 info);
615                                         --layer->refs;
616                                 }
617                         } while (core->generation != save_gen);
618                         spin_unlock(&core->cst.spin);
619                 }
620
621                 if (info->parent != chain) {
622                         kprintf("ZZZ\n");
623                         hammer2_chain_drop(chain);
624                         hammer2_chain_ref(info->parent);
625                 }
626                 chain = info->parent;
627
628                 /*
629                  * We unlock the parent during the scan1 recursion, parent
630                  * may have been deleted out from under us.
631                  *
632                  * parent may have been destroyed out from under us
633                  *
634                  * parent may have been synchronously flushed due to aliasing
635                  * via core (is this possible?).
636                  */
637                 if (chain->delete_tid <= info->sync_tid &&
638                     (chain->flags & HAMMER2_CHAIN_DUPLICATED)) {
639                         kprintf("xxx\n");
640                         goto retry;
641                 }
642                 if (chain->bref.mirror_tid >= info->sync_tid ||
643                     chain->bref.mirror_tid >= core->update_hi) {
644                         kprintf("yyy\n");
645                         goto retry;
646                 }
647
648                 /*
649                  * If any deferral occurred we must set domodify to 0 to avoid
650                  * potentially modifying the parent twice (now and when we run
651                  * the deferral list), as doing so could cause the blockref
652                  * update to run on a block array which has already been
653                  * updated.
654                  */
655                 if (info->domodify && diddeferral != info->diddeferral)
656                         info->domodify = 0;
657
658                 /*
659                  * We are responsible for setting the parent into a modified
660                  * state before we scan the children to update the parent's
661                  * block table.  This must essentially be done as an atomic
662                  * operation (the parent must remain locked throughout the
663                  * operation), otherwise other transactions can squeeze a
664                  * delete-duplicate in and create block table havoc.
665                  *
666                  * Care must be taken to not try to update the parent twice
667                  * during the current flush cycle, which would cause more
668                  * havoc.  It's so important that we assert that we haven't
669                  * double-flushed a parent below by testing modify_tid.
670                  *
671                  * NOTE: Blockrefs are only updated on live chains.
672                  *
673                  * NOTE: Modifying the parent generally causes a
674                  *       delete-duplicate to occur from within the flush
675                  *       itself, with an allocation from the freemap occuring
676                  *       as an additional side-effect.
677                  *
678                  * NOTE: If the parent was deleted our modified chain will
679                  *       also be marked deleted, but since it inherits the
680                  *       parent's delete_tid it will still appear to be
681                  *       'live' for the purposes of the flush.
682                  */
683                 if (info->domodify && !h2ignore_deleted(info, chain)) {
684                         KKASSERT(chain->modify_tid < info->sync_tid);
685
686                         /*
687                          * The scan1 loop and/or flush_core is reentrant,
688                          * particularly when core->generation changes.  To
689                          * avoid havoc we have to prevent repetitive
690                          * delete-duplicates of the same chain.
691                          *
692                          * After executing the modify set the original chain's
693                          * bref.mirror_tid to prevent any reentrancy during
694                          * the current flush cycle.
695                          */
696                         hammer2_chain_modify(info->trans, &info->parent,
697                                              HAMMER2_MODIFY_NO_MODIFY_TID);
698                         if (info->parent != chain) {
699                                 if (chain->bref.mirror_tid < info->sync_tid)
700                                         chain->bref.mirror_tid = info->sync_tid;
701                                 hammer2_chain_drop(chain);
702                                 hammer2_chain_ref(info->parent);
703                         }
704                         chain = info->parent;
705                 }
706                 chain->debug_reason = (chain->debug_reason & ~255) | 7;
707
708                 KKASSERT(chain == info->parent);
709
710                 /*
711                  * Handle successfully flushed children who are in the MOVED
712                  * state on the way back up the recursion.  This can have
713                  * the side-effect of clearing MOVED.
714                  *
715                  * Scan2 may replace info->parent.  If it does it will also
716                  * replace the extra ref we made.
717                  *
718                  * Scan2 is non-recursive.
719                  */
720                 if (diddeferral != info->diddeferral) {
721                         spin_lock(&core->cst.spin);
722                 } else {
723                         KKASSERT(chain == info->parent);
724                         KKASSERT(info->domodify == 0 ||
725                                  (chain->flags & HAMMER2_CHAIN_FLUSHED) == 0);
726                         atomic_set_int(&chain->flags, HAMMER2_CHAIN_FLUSHED);
727                         spin_lock(&core->cst.spin);
728                         KKASSERT(core->good == 0x1234 && core->sharecnt > 0);
729                         KKASSERT(info->parent->core == core);
730                         TAILQ_FOREACH_REVERSE(layer, &core->layerq,
731                                               h2_layer_list, entry) {
732                                 info->pass = 1;
733                                 ++layer->refs;
734                                 KKASSERT(layer->good == 0xABCD);
735                                 RB_SCAN(hammer2_chain_tree, &layer->rbtree,
736                                         NULL, hammer2_chain_flush_scan2, info);
737                                 info->pass = 2;
738                                 RB_SCAN(hammer2_chain_tree, &layer->rbtree,
739                                         NULL, hammer2_chain_flush_scan2, info);
740                                 --layer->refs;
741                         }
742
743                         /*
744                          * chain is now considered up-to-date, adjust
745                          * bref.mirror_tid and update_lo before running
746                          * pass3.
747                          *
748                          * (no deferral in this path)
749                          */
750                         if (core->update_lo < info->sync_tid)
751                                 core->update_lo = info->sync_tid;
752
753                         TAILQ_FOREACH_REVERSE(layer, &core->layerq,
754                                               h2_layer_list, entry) {
755                                 info->pass = 3;
756                                 ++layer->refs;
757                                 KKASSERT(layer->good == 0xABCD);
758                                 RB_SCAN(hammer2_chain_tree, &layer->rbtree,
759                                         NULL, hammer2_chain_flush_scan2, info);
760                                 --layer->refs;
761                                 KKASSERT(info->parent->core == core);
762                         }
763                 }
764
765                 /*
766                  * info->parent must not have been replaced again
767                  */
768                 KKASSERT(info->parent == chain);
769
770                 chain->debug_reason = (chain->debug_reason & ~255) | 8;
771                 *chainp = chain;
772
773                 hammer2_chain_layer_check_locked(chain->hmp, core);
774                 spin_unlock(&core->cst.spin);
775
776                 info->parent = saved_parent;
777                 info->domodify = saved_domodify;
778                 KKASSERT(chain->refs > 1);
779         } else {
780                 /*
781                  * There is no deferral in this path.  Chain is now
782                  * considered up-to-date.
783                  *
784                  * Adjust update_lo now and bref.mirror_tid will be
785                  * updated a bit later on the fall-through.
786                  */
787                 if (core->update_lo < info->sync_tid)
788                         core->update_lo = info->sync_tid;
789         }
790
791 #if FLUSH_DEBUG
792         kprintf("POP    %p.%d defer=%d\n", chain, chain->bref.type, diddeferral);
793 #endif
794
795         /*
796          * Do not flush chain if there were any deferrals.  It will be
797          * retried later after the deferrals are independently handled.
798          * Do not update update_lo or bref.mirror_tid.
799          */
800         if (diddeferral != info->diddeferral) {
801                 chain->debug_reason = (chain->debug_reason & ~255) | 99;
802                 if (hammer2_debug & 0x0008) {
803                         kprintf("%*.*s} %p/%d %04x (deferred)",
804                                 info->depth, info->depth, "",
805                                 chain, chain->refs, chain->flags);
806                 }
807                 /* do not update core->update_lo */
808                 /* do not update bref.mirror_tid */
809                 return;
810         }
811
812         /*
813          * Non-deferral path, chain is now deterministically being flushed.
814          * We've finished running the recursion and the blockref update.
815          *
816          * update bref.mirror_tid.  update_lo has already been updated.
817          */
818         if (chain->bref.mirror_tid < info->sync_tid)
819                 chain->bref.mirror_tid = info->sync_tid;
820
821         /*
822          * Deal with deleted and destroyed chains on the way back up.
823          *
824          * Deleted inodes may still be active due to open descriptors so
825          * test whether the inode has been DESTROYED (aka deactivated after
826          * being unlinked) or not.
827          *
828          * Otherwise a delted chain can be optimized by clearing MODIFIED
829          * without bothering to write it out.
830          *
831          * NOTE: We optimize this by noting that only 'inode' chains require
832          *       this treatment.  When a file with an open descriptor is
833          *       deleted only its inode is marked deleted.  Other deletions,
834          *       such as indirect block deletions, will no longer be visible
835          *       to the live filesystem and do not need to be updated.
836          */
837         if (h2ignore_deleted(info, chain)) {
838                 /*
839                  * At the moment we unconditionally set the MOVED bit because
840                  * there are situations where it might not have been set due
841                  * to similar delete-destroyed optimizations, and the parent
842                  * of the parent still may need to be notified of the deletion.
843                  */
844                 if ((chain->flags & HAMMER2_CHAIN_MOVED) == 0) {
845                         hammer2_chain_ref(chain);
846                         atomic_set_int(&chain->flags,
847                                        HAMMER2_CHAIN_MOVED);
848                 }
849                 chain->debug_reason = (chain->debug_reason & ~255) | 9;
850                 if (chain->flags & HAMMER2_CHAIN_MODIFIED) {
851 #if 0
852                         /*
853                          * XXX should be able to invalidate the buffer here.
854                          * XXX problem if reused, snapshotted, or reactivated.
855                          */
856                         if (chain->dio) {
857                                 hammer2_io_setinval(chain->dio, chain->bytes);
858                         }
859 #endif
860                         atomic_clear_int(&chain->flags, HAMMER2_CHAIN_MODIFIED);
861                         hammer2_chain_drop(chain);
862                 }
863                 return;
864         }
865
866         /*
867          * A degenerate flush might not have flushed anything and thus not
868          * processed modified blocks on the way back up.  Detect the case.
869          *
870          * This case can occur when modifications cross flush boundaries
871          * and cause the submodified recursion to run up multiple parents (?).
872          */
873         if ((chain->flags & HAMMER2_CHAIN_MODIFIED) == 0) {
874                 kprintf("chain %p.%d %08x recursed but wasn't "
875                         "modified mirr=%016jx "
876                         "update_lo=%016jx synctid=%016jx\n",
877                         chain, chain->bref.type, chain->flags,
878                         chain->bref.mirror_tid,
879                         core->update_lo, info->sync_tid);
880 #if 0
881                 if ((chain->flags & HAMMER2_CHAIN_MOVED) == 0) {
882                         hammer2_chain_ref(chain);
883                         atomic_set_int(&chain->flags, HAMMER2_CHAIN_MOVED);
884                 }
885 #endif
886                 chain->debug_reason = (chain->debug_reason & ~255) | 10;
887                 return;
888         }
889
890         chain->debug_reason = (chain->debug_reason & ~255) | 11;
891
892         /*
893          * Issue flush.
894          *
895          * A DESTROYED node that reaches this point must be flushed for
896          * synchronization point consistency.
897          *
898          * Update bref.mirror_tid, clear MODIFIED, and set MOVED.
899          *
900          * The caller will update the parent's reference to this chain
901          * by testing MOVED as long as the modification was in-bounds.
902          *
903          * MOVED is never set on the volume root as there is no parent
904          * to adjust.
905          */
906         if (hammer2_debug & 0x1000) {
907                 kprintf("Flush %p.%d %016jx/%d sync_tid=%016jx data=%016jx\n",
908                         chain, chain->bref.type,
909                         chain->bref.key, chain->bref.keybits,
910                         info->sync_tid, chain->bref.data_off);
911         }
912         if (hammer2_debug & 0x2000) {
913                 Debugger("Flush hell");
914         }
915
916         atomic_clear_int(&chain->flags, HAMMER2_CHAIN_MODIFIED);
917
918         if ((chain->flags & HAMMER2_CHAIN_MOVED) ||
919             chain == &hmp->vchain ||
920             chain == &hmp->fchain) {
921                 /*
922                  * Drop the ref from the MODIFIED bit we cleared,
923                  * net -1 ref.
924                  */
925                 hammer2_chain_drop(chain);
926         } else {
927                 /*
928                  * Drop the ref from the MODIFIED bit we cleared and
929                  * set a ref for the MOVED bit we are setting.  Net 0 refs.
930                  */
931                 atomic_set_int(&chain->flags, HAMMER2_CHAIN_MOVED);
932         }
933
934         /*
935          * If this is part of a recursive flush we can go ahead and write
936          * out the buffer cache buffer and pass a new bref back up the chain
937          * via the MOVED bit.
938          *
939          * Volume headers are NOT flushed here as they require special
940          * processing.
941          */
942         switch(chain->bref.type) {
943         case HAMMER2_BREF_TYPE_FREEMAP:
944                 hammer2_modify_volume(hmp);
945                 hmp->voldata.freemap_tid = hmp->fchain.bref.mirror_tid;
946                 break;
947         case HAMMER2_BREF_TYPE_VOLUME:
948                 /*
949                  * The free block table is flushed by hammer2_vfs_sync()
950                  * before it flushes vchain.  We must still hold fchain
951                  * locked while copying voldata to volsync, however.
952                  */
953                 hammer2_chain_lock(&hmp->fchain, HAMMER2_RESOLVE_ALWAYS);
954 #if 0
955                 if ((hmp->fchain.flags & HAMMER2_CHAIN_MODIFIED) ||
956                     hmp->voldata.freemap_tid < info->trans->sync_tid) {
957                         /* this will modify vchain as a side effect */
958                         hammer2_chain_t *tmp = &hmp->fchain;
959                         hammer2_chain_flush(info->trans, &tmp);
960                         KKASSERT(tmp == &hmp->fchain);
961                 }
962 #endif
963
964                 /*
965                  * There is no parent to our root vchain and fchain to
966                  * synchronize the bref to, their updated mirror_tid's
967                  * must be synchronized to the volume header.
968                  */
969                 hmp->voldata.mirror_tid = chain->bref.mirror_tid;
970                 /*hmp->voldata.freemap_tid = hmp->fchain.bref.mirror_tid;*/
971
972                 /*
973                  * The volume header is flushed manually by the syncer, not
974                  * here.  All we do here is adjust the crc's.
975                  */
976                 KKASSERT(chain->data != NULL);
977                 KKASSERT(chain->dio == NULL);
978
979                 hmp->voldata.icrc_sects[HAMMER2_VOL_ICRC_SECT1]=
980                         hammer2_icrc32(
981                                 (char *)&hmp->voldata +
982                                  HAMMER2_VOLUME_ICRC1_OFF,
983                                 HAMMER2_VOLUME_ICRC1_SIZE);
984                 hmp->voldata.icrc_sects[HAMMER2_VOL_ICRC_SECT0]=
985                         hammer2_icrc32(
986                                 (char *)&hmp->voldata +
987                                  HAMMER2_VOLUME_ICRC0_OFF,
988                                 HAMMER2_VOLUME_ICRC0_SIZE);
989                 hmp->voldata.icrc_volheader =
990                         hammer2_icrc32(
991                                 (char *)&hmp->voldata +
992                                  HAMMER2_VOLUME_ICRCVH_OFF,
993                                 HAMMER2_VOLUME_ICRCVH_SIZE);
994                 hmp->volsync = hmp->voldata;
995                 atomic_set_int(&chain->flags, HAMMER2_CHAIN_VOLUMESYNC);
996                 hammer2_chain_unlock(&hmp->fchain);
997                 break;
998         case HAMMER2_BREF_TYPE_DATA:
999                 /*
1000                  * Data elements have already been flushed via the logical
1001                  * file buffer cache.  Their hash was set in the bref by
1002                  * the vop_write code.
1003                  *
1004                  * Make sure any device buffer(s) have been flushed out here.
1005                  * (there aren't usually any to flush).
1006                  */
1007 #if 0
1008                 /* XXX */
1009                 /* chain and chain->bref, NOWAIT operation */
1010 #endif
1011                 break;
1012 #if 0
1013         case HAMMER2_BREF_TYPE_INDIRECT:
1014                 /*
1015                  * Indirect blocks may be in an INITIAL state.  Use the
1016                  * chain_lock() call to ensure that the buffer has been
1017                  * instantiated (even though it is already locked the buffer
1018                  * might not have been instantiated).
1019                  *
1020                  * Only write the buffer out if it is dirty, it is possible
1021                  * the operating system had already written out the buffer.
1022                  */
1023                 hammer2_chain_lock(chain, HAMMER2_RESOLVE_ALWAYS);
1024                 KKASSERT(chain->dio != NULL);
1025
1026                 chain->data = NULL;
1027                 hammer2_io_bqrelse(&chain->dio);
1028                 hammer2_chain_unlock(chain);
1029                 break;
1030 #endif
1031         case HAMMER2_BREF_TYPE_INDIRECT:
1032         case HAMMER2_BREF_TYPE_FREEMAP_NODE:
1033                 /*
1034                  * Device-backed.  Buffer will be flushed by the sync
1035                  * code XXX.
1036                  */
1037                 KKASSERT((chain->flags & HAMMER2_CHAIN_EMBEDDED) == 0);
1038                 break;
1039         case HAMMER2_BREF_TYPE_FREEMAP_LEAF:
1040         default:
1041                 /*
1042                  * Embedded elements have to be flushed out.
1043                  * (Basically just BREF_TYPE_INODE).
1044                  */
1045                 KKASSERT(chain->flags & HAMMER2_CHAIN_EMBEDDED);
1046                 KKASSERT(chain->data != NULL);
1047                 KKASSERT(chain->dio == NULL);
1048                 bref = &chain->bref;
1049
1050                 KKASSERT((bref->data_off & HAMMER2_OFF_MASK) != 0);
1051                 KKASSERT(HAMMER2_DEC_CHECK(chain->bref.methods) ==
1052                          HAMMER2_CHECK_ISCSI32 ||
1053                          HAMMER2_DEC_CHECK(chain->bref.methods) ==
1054                          HAMMER2_CHECK_FREEMAP);
1055
1056                 /*
1057                  * The data is embedded, we have to acquire the
1058                  * buffer cache buffer and copy the data into it.
1059                  */
1060                 error = hammer2_io_bread(hmp, bref->data_off, chain->bytes,
1061                                          &dio);
1062                 KKASSERT(error == 0);
1063                 bdata = hammer2_io_data(dio, bref->data_off);
1064
1065                 /*
1066                  * Copy the data to the buffer, mark the buffer
1067                  * dirty, and convert the chain to unmodified.
1068                  */
1069                 bcopy(chain->data, bdata, chain->bytes);
1070                 hammer2_io_bdwrite(&dio);
1071
1072                 switch(HAMMER2_DEC_CHECK(chain->bref.methods)) {
1073                 case HAMMER2_CHECK_FREEMAP:
1074                         chain->bref.check.freemap.icrc32 =
1075                                 hammer2_icrc32(chain->data, chain->bytes);
1076                         break;
1077                 case HAMMER2_CHECK_ISCSI32:
1078                         chain->bref.check.iscsi32.value =
1079                                 hammer2_icrc32(chain->data, chain->bytes);
1080                         break;
1081                 default:
1082                         panic("hammer2_flush_core: bad crc type");
1083                         break; /* NOT REACHED */
1084                 }
1085                 if (chain->bref.type == HAMMER2_BREF_TYPE_INODE)
1086                         ++hammer2_iod_meta_write;
1087                 else
1088                         ++hammer2_iod_indr_write;
1089         }
1090 }
1091
1092 /*
1093  * Flush helper scan1 (recursive)
1094  *
1095  * Flushes the children of the caller's chain (parent) and updates
1096  * the blockref, restricted by sync_tid.
1097  *
1098  * Ripouts during the loop should not cause any problems.  Because we are
1099  * flushing to a synchronization point, modification races will occur after
1100  * sync_tid and do not have to be flushed anyway.
1101  *
1102  * It is also ok if the parent is chain_duplicate()'d while unlocked because
1103  * the delete/duplication will install a delete_tid that is still larger than
1104  * our current sync_tid.
1105  *
1106  * WARNING! If we do not call chain_flush_core we must update bref.mirror_tid
1107  *          ourselves.
1108  */
1109 static int
1110 hammer2_chain_flush_scan1(hammer2_chain_t *child, void *data)
1111 {
1112         hammer2_flush_info_t *info = data;
1113         hammer2_trans_t *trans = info->trans;
1114         hammer2_chain_t *parent = info->parent;
1115         int     diddeferral;
1116
1117         if (hammer2_debug & 0x80000)
1118                 Debugger("hell3");
1119         diddeferral = info->diddeferral;
1120
1121         /*
1122          * Child is beyond the flush synchronization zone, don't persue.
1123          * Remember that modifications generally delete-duplicate so if the
1124          * sub-tree is dirty another child will get us there.  But not this
1125          * one.
1126          *
1127          * Or MODIFIED is not set and child is already fully synchronized
1128          * with its sub-tree.  Don't persue.
1129          *
1130          * (child can never be fchain or vchain so a special check isn't
1131          *  needed).
1132          */
1133         if (child->modify_tid > trans->sync_tid) {
1134                 KKASSERT(child->delete_tid >= child->modify_tid);
1135                 child->debug_reason = (child->debug_reason & ~255) | 1;
1136                 /* do not update child->core->update_lo, core not flushed */
1137                 /* do not update core->update_lo, there may be another path */
1138                 /* do not update mirror_tid, scan2 will ignore chain */
1139                 return (0);
1140         }
1141
1142         /*
1143          * We must ref the child before unlocking the spinlock.
1144          *
1145          * The caller has added a ref to the parent so we can temporarily
1146          * unlock it in order to lock the child.
1147          */
1148         hammer2_chain_ref(child);
1149         spin_unlock(&parent->core->cst.spin);
1150
1151         hammer2_chain_unlock(parent);
1152         hammer2_chain_lock(child, HAMMER2_RESOLVE_MAYBE);
1153
1154 #if 0
1155         /*
1156          * This isn't working atm, it seems to be causing necessary
1157          * updates to be thrown away, probably due to aliasing, resulting
1158          * base_insert/base_delete panics.
1159          */
1160         /*
1161          * The DESTROYED flag can only be initially set on an unreferenced
1162          * deleted inode and will propagate downward via the mechanic below.
1163          * Such inode chains have been deleted for good and should no longer
1164          * be subject to delete/duplication.
1165          *
1166          * This optimization allows the inode reclaim (destroy unlinked file
1167          * on vnode reclamation after last close) to be flagged by just
1168          * setting HAMMER2_CHAIN_DESTROYED at the top level and then will
1169          * cause the chains to be terminated and related buffers to be
1170          * invalidated and not flushed out.
1171          *
1172          * We have to be careful not to propagate the DESTROYED flag if
1173          * the destruction occurred after our flush sync_tid.
1174          */
1175         if (parent->delete_tid <= trans->sync_tid &&
1176             (parent->flags & HAMMER2_CHAIN_DESTROYED) &&
1177             (child->flags & HAMMER2_CHAIN_DESTROYED) == 0) {
1178                 /*
1179                  * Force downward recursion by bringing update_hi up to
1180                  * at least sync_tid, and setting the DESTROYED flag.
1181                  * Parent's mirror_tid has not yet been updated.
1182                  *
1183                  * We do not mark the child DELETED because this would
1184                  * cause unnecessary modifications/updates.  Instead, the
1185                  * DESTROYED flag propagates downward and causes the flush
1186                  * to ignore any pre-existing modified chains.
1187                  *
1188                  * Vnode reclamation may have forced update_hi to MAX_TID
1189                  * (we do this because there was no transaction at the time).
1190                  * In this situation bring it down to something reasonable
1191                  * so the elements being destroyed can be retired.
1192                  */
1193                 atomic_set_int(&child->flags, HAMMER2_CHAIN_DESTROYED);
1194                 spin_lock(&child->core->cst.spin);
1195                 if (child->core->update_hi < trans->sync_tid)
1196                         child->core->update_hi = trans->sync_tid;
1197                 spin_unlock(&child->core->cst.spin);
1198         }
1199 #endif
1200
1201         /*
1202          * No recursion needed if neither the child or anything under it
1203          * was messed with.
1204          */
1205         if ((child->flags & HAMMER2_CHAIN_MODIFIED) == 0 &&
1206             child->core->update_lo >= info->sync_tid) {
1207                 child->debug_reason = (child->debug_reason & ~255) | 2;
1208                 if (child->bref.mirror_tid < info->sync_tid)
1209                         child->bref.mirror_tid = info->sync_tid;
1210                 goto skip;
1211         }
1212
1213         /*
1214          * Re-check original pre-lock conditions after locking.
1215          */
1216         if (child->modify_tid > trans->sync_tid) {
1217                 child->debug_reason = (child->debug_reason & ~255) | 3;
1218                 hammer2_chain_unlock(child);
1219                 hammer2_chain_drop(child);
1220                 hammer2_chain_lock(parent, HAMMER2_RESOLVE_MAYBE);
1221                 spin_lock(&parent->core->cst.spin);
1222                 return (0);
1223         }
1224
1225         if ((child->flags & HAMMER2_CHAIN_MODIFIED) == 0 &&
1226             child->core->update_lo >= info->sync_tid) {
1227                 child->debug_reason = (child->debug_reason & ~255) | 4;
1228                 if (child->bref.mirror_tid < info->sync_tid)
1229                         child->bref.mirror_tid = info->sync_tid;
1230                 goto skip;
1231         }
1232
1233         /*
1234          * Recurse and collect deferral data.
1235          */
1236         ++info->depth;
1237         hammer2_chain_flush_core(info, &child);
1238         --info->depth;
1239
1240 skip:
1241         /*
1242          * Check the conditions that could cause SCAN2 to modify the parent.
1243          * Modify the parent here instead of in SCAN2, which would cause
1244          * rollup chicken-and-egg races.
1245          *
1246          * Scan2 is expected to update bref.mirror_tid in the domodify case,
1247          * but will skip the child otherwise giving us the responsibility to
1248          * update bref.mirror_tid.
1249          *
1250          * WARNING!  Do NOT update the child's bref.mirror_tid right here,
1251          *           even if there was no deferral.  Doing so would cause
1252          *           confusion with the child's block array state in a
1253          *           future flush.
1254          */
1255         if (h2ignore_deleted(info, parent)) {
1256                 /*
1257                  * Special optimization matching similar tests done in
1258                  * flush_core, scan1, and scan2.  Avoid updating the block
1259                  * table in the parent if the parent is no longer visible.
1260                  * A deleted parent is no longer visible unless it's an
1261                  * inode (in which case it might have an open fd).. the
1262                  * DESTROYED flag must also be checked for inodes.
1263                  */
1264                 ;
1265         } else if (child->delete_tid <= trans->sync_tid &&
1266                    child->delete_tid > parent->bref.mirror_tid &&
1267                    child->modify_tid <= parent->bref.mirror_tid) {
1268                 info->domodify = 1;
1269         } else if (child->delete_tid > trans->sync_tid &&
1270                    child->modify_tid > parent->bref.mirror_tid) {
1271                 info->domodify = 1;             /* base insertion */
1272         }
1273
1274         /*
1275          * Relock to continue the loop
1276          */
1277         hammer2_chain_unlock(child);
1278         hammer2_chain_lock(parent, HAMMER2_RESOLVE_MAYBE);
1279         hammer2_chain_drop(child);
1280         KKASSERT(info->parent == parent);
1281
1282         spin_lock(&parent->core->cst.spin);
1283         return (0);
1284 }
1285
1286 /*
1287  * Flush helper scan2 (non-recursive)
1288  *
1289  * This pass on a chain's children propagates any MOVED or DELETED
1290  * elements back up the chain towards the root after those elements have
1291  * been fully flushed.  Unlike scan1, this function is NOT recursive and
1292  * the parent remains locked across the entire scan.
1293  *
1294  * SCAN2 is called twice, once with pass set to 1 and once with it set to 2.
1295  * We have to do this so base[] elements can be deleted in pass 1 to make
1296  * room for adding new elements in pass 2.
1297  *
1298  * This function also rolls up storage statistics.
1299  *
1300  * NOTE!  A deletion is a visbility issue, there can still be references to
1301  *        deleted elements (for example, to an unlinked file which is still
1302  *        open), and there can also be multiple chains pointing to the same
1303  *        bref where some are deleted and some are not (for example due to
1304  *        a rename).   So a chain marked for deletion is basically considered
1305  *        to be live until it is explicitly destroyed or until its ref-count
1306  *        reaches zero (also implying that MOVED and MODIFIED are clear).
1307  *
1308  * NOTE!  Info->parent will be locked but will only be instantiated/modified
1309  *        if it is either MODIFIED or if scan1 determined that block table
1310  *        updates will occur.
1311  *
1312  * NOTE!  SCAN2 is responsible for updating child->bref.mirror_tid only in
1313  *        the case where it modifies the parent (does a base insertion
1314  *        or deletion).  SCAN1 handled all other cases.
1315  */
1316 static int
1317 hammer2_chain_flush_scan2(hammer2_chain_t *child, void *data)
1318 {
1319         hammer2_flush_info_t *info = data;
1320         hammer2_chain_t *parent = info->parent;
1321         hammer2_chain_core_t *above = child->above;
1322         hammer2_mount_t *hmp = child->hmp;
1323         hammer2_trans_t *trans = info->trans;
1324         hammer2_blockref_t *base;
1325         int count;
1326         int ok;
1327
1328 #if FLUSH_DEBUG
1329         kprintf("SCAN2 %p.%d %08x mod=%016jx del=%016jx trans=%016jx\n", child, child->bref.type, child->flags, child->modify_tid, child->delete_tid, info->trans->sync_tid);
1330 #endif
1331         /*
1332          * Ignore children created after our flush point, treating them as
1333          * if they did not exist).  These children will not cause the parent
1334          * to be updated.
1335          *
1336          * Children deleted after our flush point are treated as having been
1337          * created for the purposes of the flush.  The parent's update_hi
1338          * will already be higher than our trans->sync_tid so the path for
1339          * the next flush is left intact.
1340          *
1341          * When we encounter such children and the parent chain has not been
1342          * deleted, delete/duplicated, or delete/duplicated-for-move, then
1343          * the parent may be used to funnel through several flush points.
1344          * These chains will still be visible to later flushes due to having
1345          * a higher update_hi than we can set in the current flush.
1346          */
1347         if (child->modify_tid > trans->sync_tid) {
1348                 KKASSERT(child->delete_tid >= child->modify_tid);
1349                 goto finalize;
1350         }
1351
1352 #if 0
1353         /*
1354          * Ignore children which have not changed.  The parent's block table
1355          * is already correct.
1356          *
1357          * XXX The MOVED bit is only cleared when all multi-homed parents
1358          *     have flushed, creating a situation where a re-flush can occur
1359          *     via a parent which has already flushed.  The hammer2_base_*()
1360          *     functions currently have a hack to deal with this case but
1361          *     we need something better.
1362          */
1363         if ((child->flags & HAMMER2_CHAIN_MOVED) == 0) {
1364                 KKASSERT((child->flags & HAMMER2_CHAIN_MODIFIED) == 0);
1365                 goto finalize;
1366         }
1367 #endif
1368
1369         /*
1370          * Make sure child is referenced before we unlock.
1371          */
1372         hammer2_chain_ref(child);
1373         spin_unlock(&above->cst.spin);
1374
1375         /*
1376          * Parent reflushed after the child has passed them by should skip
1377          * due to the modify_tid test. XXX
1378          */
1379         hammer2_chain_lock(child, HAMMER2_RESOLVE_NEVER);
1380         KKASSERT(child->above == above);
1381         KKASSERT(parent->core == above);
1382
1383         /*
1384          * The parent's blockref to the child must be deleted or updated.
1385          *
1386          * This point is not reached on successful DESTROYED optimizations
1387          * but can be reached on recursive deletions and restricted flushes.
1388          *
1389          * The chain_modify here may delete-duplicate the block.  This can
1390          * cause a multitude of issues if the block was already modified
1391          * by a later (post-flush) transaction.  Primarily blockrefs in
1392          * the later block can be out-of-date, so if the situation occurs
1393          * we can't throw away the MOVED bit on the current blocks until
1394          * the later blocks are flushed (so as to be able to regenerate all
1395          * the changes that were made).
1396          *
1397          * Because flushes are ordered we do not have to make a
1398          * modify/duplicate of indirect blocks.  That is, the flush
1399          * code does not have to kmalloc or duplicate anything.  We
1400          * can adjust the indirect block table in-place and reuse the
1401          * chain.  It IS possible that the chain has already been duplicated
1402          * or may wind up being duplicated on-the-fly by modifying code
1403          * on the frontend.  We simply use the original and ignore such
1404          * chains.  However, it does mean we can't clear the MOVED bit.
1405          *
1406          * XXX recursive deletions not optimized.
1407          */
1408
1409         switch(parent->bref.type) {
1410         case HAMMER2_BREF_TYPE_INODE:
1411                 /*
1412                  * Access the inode's block array.  However, there is no
1413                  * block array if the inode is flagged DIRECTDATA.  The
1414                  * DIRECTDATA case typicaly only occurs when a hardlink has
1415                  * been shifted up the tree and the original inode gets
1416                  * replaced with an OBJTYPE_HARDLINK placeholding inode.
1417                  */
1418                 if (parent->data &&
1419                     (parent->data->ipdata.op_flags &
1420                      HAMMER2_OPFLAG_DIRECTDATA) == 0) {
1421                         base = &parent->data->ipdata.u.blockset.blockref[0];
1422                 } else {
1423                         base = NULL;
1424                 }
1425                 count = HAMMER2_SET_COUNT;
1426                 break;
1427         case HAMMER2_BREF_TYPE_INDIRECT:
1428         case HAMMER2_BREF_TYPE_FREEMAP_NODE:
1429                 if (parent->data)
1430                         base = &parent->data->npdata[0];
1431                 else
1432                         base = NULL;
1433                 count = parent->bytes / sizeof(hammer2_blockref_t);
1434                 break;
1435         case HAMMER2_BREF_TYPE_VOLUME:
1436                 base = &hmp->voldata.sroot_blockset.blockref[0];
1437                 count = HAMMER2_SET_COUNT;
1438                 break;
1439         case HAMMER2_BREF_TYPE_FREEMAP:
1440                 base = &parent->data->npdata[0];
1441                 count = HAMMER2_SET_COUNT;
1442                 break;
1443         default:
1444                 base = NULL;
1445                 count = 0;
1446                 panic("hammer2_chain_flush_scan2: "
1447                       "unrecognized blockref type: %d",
1448                       parent->bref.type);
1449         }
1450
1451         /*
1452          * Don't bother updating a deleted + destroyed parent's blockrefs.
1453          * We MUST update deleted + non-destroyed parent's blockrefs since
1454          * they could represent an open file.
1455          *
1456          * Otherwise, we need to be COUNTEDBREFS synchronized for the
1457          * hammer2_base_*() functions.
1458          *
1459          * NOTE: We optimize this by noting that only 'inode' chains require
1460          *       this treatment.  When a file with an open descriptor is
1461          *       deleted only its inode is marked deleted.  Other deletions,
1462          *       such as indirect block deletions, will no longer be visible
1463          *       to the live filesystem and do not need to be updated.
1464          *
1465          *       rm -rf's generally wind up setting DESTROYED on the way down
1466          *       and the result is typically that no disk I/O is needed at all
1467          *       when rm -rf'ing an entire directory topology.
1468          *
1469          *       This test must match the similar one in flush_core.
1470          */
1471 #if FLUSH_DEBUG
1472         kprintf("SCAN2 base=%p pass=%d PARENT %p.%d DTID=%016jx SYNC=%016jx\n",
1473                 base,
1474                 info->pass, parent, parent->bref.type, parent->delete_tid, trans->sync_tid);
1475 #endif
1476         if (h2ignore_deleted(info, parent))
1477                 base = NULL;
1478
1479         /*
1480          * Update the parent's blockref table and propagate mirror_tid.
1481          *
1482          * NOTE! Children with modify_tid's beyond our flush point are
1483          *       considered to not exist for the purposes of updating the
1484          *       parent's blockref array.
1485          *
1486          * NOTE! SCAN1 has already put the parent in a modified state
1487          *       so if it isn't we panic.
1488          *
1489          * NOTE! chain->modify_tid vs chain->bref.modify_tid.  The chain's
1490          *       internal modify_tid is always updated based on creation
1491          *       or delete-duplicate.  However, the bref.modify_tid is NOT
1492          *       updated due to simple blockref updates.
1493          */
1494 #if FLUSH_DEBUG
1495         kprintf("chain %p->%p pass %d trans %016jx sync %p.%d %016jx/%d C=%016jx D=%016jx PMIRROR %016jx\n",
1496                 parent, child,
1497                 info->pass, trans->sync_tid,
1498                 child, child->bref.type,
1499                 child->bref.key, child->bref.keybits,
1500                 child->modify_tid, child->delete_tid, parent->bref.mirror_tid);
1501 #endif
1502
1503         if (info->pass == 1 && child->delete_tid <= trans->sync_tid) {
1504                 /*
1505                  * Deleting.  The block array is expected to contain the
1506                  * child's entry if:
1507                  *
1508                  * (1) The deletion occurred after the parent's block table
1509                  *     was last synchronized (delete_tid), and
1510                  *
1511                  * (2) The creation occurred before or during the parent's
1512                  *     last block table synchronization.
1513                  */
1514 #if FLUSH_DEBUG
1515                 kprintf("S2A %p.%d b=%p d/b=%016jx/%016jx m/b=%016jx/%016jx\n",
1516                         child, child->bref.type,
1517                         base, child->delete_tid, parent->bref.mirror_tid,
1518                         child->modify_tid, parent->bref.mirror_tid);
1519 #endif
1520                 if (base &&
1521                     child->delete_tid > parent->bref.mirror_tid &&
1522                     child->modify_tid <= parent->bref.mirror_tid) {
1523                         KKASSERT(child->flags & HAMMER2_CHAIN_MOVED);
1524                         KKASSERT(parent->modify_tid == trans->sync_tid ||
1525                                  (parent == &hmp->vchain ||
1526                                   parent == &hmp->fchain));
1527                         hammer2_rollup_stats(parent, child, -1);
1528                         spin_lock(&above->cst.spin);
1529 #if FLUSH_DEBUG
1530                         kprintf("trans %jx parent %p.%d child %p.%d m/d %016jx/%016jx "
1531                                 "flg=%08x %016jx/%d delete\n",
1532                                 trans->sync_tid,
1533                                 parent, parent->bref.type,
1534                                 child, child->bref.type,
1535                                 child->modify_tid, child->delete_tid,
1536                                 child->flags,
1537                                 child->bref.key, child->bref.keybits);
1538 #endif
1539                         hammer2_base_delete(trans, parent, base, count,
1540                                             &info->cache_index, child);
1541                         spin_unlock(&above->cst.spin);
1542                 }
1543         } else if (info->pass == 2 && child->delete_tid > trans->sync_tid) {
1544                 /*
1545                  * Inserting.  The block array is expected to NOT contain
1546                  * the child's entry if:
1547                  *
1548                  * (1) The creation occurred after the parent's block table
1549                  *     was last synchronized (modify_tid), and
1550                  *
1551                  * (2) The child is not being deleted in the same
1552                  *     transaction.
1553                  */
1554 #if FLUSH_DEBUG
1555                 kprintf("S2B %p.%d b=%p d/b=%016jx/%016jx m/b=%016jx/%016jx\n",
1556                         child, child->bref.type,
1557                         base, child->delete_tid, parent->bref.mirror_tid,
1558                         child->modify_tid, parent->bref.mirror_tid);
1559 #endif
1560                 if (base &&
1561                     child->modify_tid > parent->bref.mirror_tid) {
1562                         KKASSERT(child->flags & HAMMER2_CHAIN_MOVED);
1563                         KKASSERT(parent->modify_tid == trans->sync_tid ||
1564                                  (parent == &hmp->vchain ||
1565                                   parent == &hmp->fchain));
1566                         hammer2_rollup_stats(parent, child, 1);
1567                         spin_lock(&above->cst.spin);
1568 #if FLUSH_DEBUG
1569                         kprintf("trans %jx parent %p.%d child %p.%d m/d %016jx/%016jx "
1570                                 "flg=%08x %016jx/%d insert\n",
1571                                 trans->sync_tid,
1572                                 parent, parent->bref.type,
1573                                 child, child->bref.type,
1574                                 child->modify_tid, child->delete_tid,
1575                                 child->flags,
1576                                 child->bref.key, child->bref.keybits);
1577 #endif
1578                         hammer2_base_insert(trans, parent, base, count,
1579                                             &info->cache_index, child);
1580                         spin_unlock(&above->cst.spin);
1581                 }
1582         } else if (info->pass == 3 &&
1583                    (child->delete_tid == HAMMER2_MAX_TID ||
1584                     child->delete_tid <= trans->sync_tid) &&
1585                    (child->flags & HAMMER2_CHAIN_MOVED)) {
1586                 /*
1587                  * We can't clear the MOVED bit on children whos modify_tid
1588                  * is beyond our current trans (was tested at top of scan2),
1589                  * or on deleted children which have not yet been flushed
1590                  * (handled above).
1591                  *
1592                  * Scan all parents of this child and determine if any of
1593                  * them still need the child's MOVED bit.
1594                  */
1595                 hammer2_chain_t *scan;
1596
1597                 if (hammer2_debug & 0x4000)
1598                         kprintf("CHECKMOVED %p (parent=%p)", child, parent);
1599
1600                 ok = 1;
1601                 spin_lock(&above->cst.spin);
1602                 TAILQ_FOREACH(scan, &above->ownerq, core_entry) {
1603                         /*
1604                          * Can't clear child's MOVED until all parent's have
1605                          * synchronized with it.
1606                          *
1607                          * Ignore deleted parents as-of this flush TID.
1608                          * Ignore the current parent being flushed.
1609                          */
1610                         if (h2ignore_deleted(info, scan))
1611                                 continue;
1612                         if (scan == parent)
1613                                 continue;
1614
1615                         /*
1616                          * For parents not already synchronized check to see
1617                          * if the flush has gotten past them yet or not.
1618                          */
1619                         if (scan->bref.mirror_tid >= trans->sync_tid)
1620                                 continue;
1621
1622                         if (hammer2_debug & 0x4000) {
1623                                 kprintf("(fail scan %p %016jx/%016jx)",
1624                                         scan, scan->bref.mirror_tid,
1625                                         child->modify_tid);
1626                         }
1627                         ok = 0;
1628                         break;
1629                 }
1630                 if (hammer2_debug & 0x4000)
1631                         kprintf("\n");
1632                 spin_unlock(&above->cst.spin);
1633
1634                 /*
1635                  * Can we finally clear MOVED?
1636                  */
1637                 if (ok) {
1638                         if (hammer2_debug & 0x4000)
1639                                 kprintf("clear moved %p.%d %016jx/%d\n",
1640                                         child, child->bref.type,
1641                                         child->bref.key, child->bref.keybits);
1642                         atomic_clear_int(&child->flags, HAMMER2_CHAIN_MOVED);
1643                         hammer2_chain_drop(child);      /* moved cleared */
1644                         KKASSERT((child->flags & HAMMER2_CHAIN_MODIFIED) == 0);
1645                 } else {
1646                         if (hammer2_debug & 0x4000)
1647                                 kprintf("keep  moved %p.%d %016jx/%d\n",
1648                                         child, child->bref.type,
1649                                         child->bref.key, child->bref.keybits);
1650                 }
1651         }
1652
1653         /*
1654          * Unlock the child.  This can wind up dropping the child's
1655          * last ref, removing it from the parent's RB tree, and deallocating
1656          * the structure.  The RB_SCAN() our caller is doing handles the
1657          * situation.
1658          */
1659         hammer2_chain_unlock(child);
1660         hammer2_chain_drop(child);
1661         spin_lock(&above->cst.spin);
1662
1663         /*
1664          * The parent may have been delete-duplicated.
1665          */
1666         info->parent = parent;
1667 finalize:
1668         return (0);
1669 }
1670
1671 static
1672 void
1673 hammer2_rollup_stats(hammer2_chain_t *parent, hammer2_chain_t *child, int how)
1674 {
1675 #if 0
1676         hammer2_chain_t *grandp;
1677 #endif
1678
1679         parent->data_count += child->data_count;
1680         parent->inode_count += child->inode_count;
1681         child->data_count = 0;
1682         child->inode_count = 0;
1683         if (how < 0) {
1684                 parent->data_count -= child->bytes;
1685                 if (child->bref.type == HAMMER2_BREF_TYPE_INODE) {
1686                         parent->inode_count -= 1;
1687 #if 0
1688                         /* XXX child->data may be NULL atm */
1689                         parent->data_count -= child->data->ipdata.data_count;
1690                         parent->inode_count -= child->data->ipdata.inode_count;
1691 #endif
1692                 }
1693         } else if (how > 0) {
1694                 parent->data_count += child->bytes;
1695                 if (child->bref.type == HAMMER2_BREF_TYPE_INODE) {
1696                         parent->inode_count += 1;
1697 #if 0
1698                         /* XXX child->data may be NULL atm */
1699                         parent->data_count += child->data->ipdata.data_count;
1700                         parent->inode_count += child->data->ipdata.inode_count;
1701 #endif
1702                 }
1703         }
1704         if (parent->bref.type == HAMMER2_BREF_TYPE_INODE) {
1705                 parent->data->ipdata.data_count += parent->data_count;
1706                 parent->data->ipdata.inode_count += parent->inode_count;
1707 #if 0
1708                 for (grandp = parent->above->first_parent;
1709                      grandp;
1710                      grandp = grandp->next_parent) {
1711                         grandp->data_count += parent->data_count;
1712                         grandp->inode_count += parent->inode_count;
1713                 }
1714 #endif
1715                 parent->data_count = 0;
1716                 parent->inode_count = 0;
1717         }
1718 }