The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/contrib/openzfs/include/sys/uberblock_impl.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  * CDDL HEADER START
    3  *
    4  * The contents of this file are subject to the terms of the
    5  * Common Development and Distribution License (the "License").
    6  * You may not use this file except in compliance with the License.
    7  *
    8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
    9  * or https://opensource.org/licenses/CDDL-1.0.
   10  * See the License for the specific language governing permissions
   11  * and limitations under the License.
   12  *
   13  * When distributing Covered Code, include this CDDL HEADER in each
   14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
   15  * If applicable, add the following below this CDDL HEADER, with the
   16  * fields enclosed by brackets "[]" replaced with your own identifying
   17  * information: Portions Copyright [yyyy] [name of copyright owner]
   18  *
   19  * CDDL HEADER END
   20  */
   21 /*
   22  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
   23  * Copyright (c) 2016, 2017 by Delphix. All rights reserved.
   24  */
   25 
   26 #ifndef _SYS_UBERBLOCK_IMPL_H
   27 #define _SYS_UBERBLOCK_IMPL_H
   28 
   29 #include <sys/uberblock.h>
   30 
   31 #ifdef  __cplusplus
   32 extern "C" {
   33 #endif
   34 
   35 /*
   36  * The uberblock version is incremented whenever an incompatible on-disk
   37  * format change is made to the SPA, DMU, or ZAP.
   38  *
   39  * Note: the first two fields should never be moved.  When a storage pool
   40  * is opened, the uberblock must be read off the disk before the version
   41  * can be checked.  If the ub_version field is moved, we may not detect
   42  * version mismatch.  If the ub_magic field is moved, applications that
   43  * expect the magic number in the first word won't work.
   44  */
   45 #define UBERBLOCK_MAGIC         0x00bab10c              /* oo-ba-bloc!  */
   46 #define UBERBLOCK_SHIFT         10                      /* up to 1K     */
   47 #define MMP_MAGIC               0xa11cea11              /* all-see-all  */
   48 
   49 #define MMP_INTERVAL_VALID_BIT  0x01
   50 #define MMP_SEQ_VALID_BIT       0x02
   51 #define MMP_FAIL_INT_VALID_BIT  0x04
   52 
   53 #define MMP_VALID(ubp)          (ubp->ub_magic == UBERBLOCK_MAGIC && \
   54                                     ubp->ub_mmp_magic == MMP_MAGIC)
   55 #define MMP_INTERVAL_VALID(ubp) (MMP_VALID(ubp) && (ubp->ub_mmp_config & \
   56                                     MMP_INTERVAL_VALID_BIT))
   57 #define MMP_SEQ_VALID(ubp)      (MMP_VALID(ubp) && (ubp->ub_mmp_config & \
   58                                     MMP_SEQ_VALID_BIT))
   59 #define MMP_FAIL_INT_VALID(ubp) (MMP_VALID(ubp) && (ubp->ub_mmp_config & \
   60                                     MMP_FAIL_INT_VALID_BIT))
   61 
   62 #define MMP_INTERVAL(ubp)       ((ubp->ub_mmp_config & 0x00000000FFFFFF00) \
   63                                     >> 8)
   64 #define MMP_SEQ(ubp)            ((ubp->ub_mmp_config & 0x0000FFFF00000000) \
   65                                     >> 32)
   66 #define MMP_FAIL_INT(ubp)       ((ubp->ub_mmp_config & 0xFFFF000000000000) \
   67                                     >> 48)
   68 
   69 #define MMP_INTERVAL_SET(write) \
   70             (((uint64_t)(write & 0xFFFFFF) << 8) | MMP_INTERVAL_VALID_BIT)
   71 
   72 #define MMP_SEQ_SET(seq) \
   73             (((uint64_t)(seq & 0xFFFF) << 32) | MMP_SEQ_VALID_BIT)
   74 
   75 #define MMP_FAIL_INT_SET(fail) \
   76             (((uint64_t)(fail & 0xFFFF) << 48) | MMP_FAIL_INT_VALID_BIT)
   77 
   78 struct uberblock {
   79         uint64_t        ub_magic;       /* UBERBLOCK_MAGIC              */
   80         uint64_t        ub_version;     /* SPA_VERSION                  */
   81         uint64_t        ub_txg;         /* txg of last sync             */
   82         uint64_t        ub_guid_sum;    /* sum of all vdev guids        */
   83         uint64_t        ub_timestamp;   /* UTC time of last sync        */
   84         blkptr_t        ub_rootbp;      /* MOS objset_phys_t            */
   85 
   86         /* highest SPA_VERSION supported by software that wrote this txg */
   87         uint64_t        ub_software_version;
   88 
   89         /* Maybe missing in uberblocks we read, but always written */
   90         uint64_t        ub_mmp_magic;   /* MMP_MAGIC                    */
   91         /*
   92          * If ub_mmp_delay == 0 and ub_mmp_magic is valid, MMP is off.
   93          * Otherwise, nanosec since last MMP write.
   94          */
   95         uint64_t        ub_mmp_delay;
   96 
   97         /*
   98          * The ub_mmp_config contains the multihost write interval, multihost
   99          * fail intervals, sequence number for sub-second granularity, and
  100          * valid bit mask.  This layout is as follows:
  101          *
  102          *   64      56      48      40      32      24      16      8       0
  103          *   +-------+-------+-------+-------+-------+-------+-------+-------+
  104          * 0 | Fail Intervals|      Seq      |   Write Interval (ms) | VALID |
  105          *   +-------+-------+-------+-------+-------+-------+-------+-------+
  106          *
  107          * This allows a write_interval of (2^24/1000)s, over 4.5 hours
  108          *
  109          * VALID Bits:
  110          * - 0x01 - Write Interval (ms)
  111          * - 0x02 - Sequence number exists
  112          * - 0x04 - Fail Intervals
  113          * - 0xf8 - Reserved
  114          */
  115         uint64_t        ub_mmp_config;
  116 
  117         /*
  118          * ub_checkpoint_txg indicates two things about the current uberblock:
  119          *
  120          * 1] If it is not zero then this uberblock is a checkpoint. If it is
  121          *    zero, then this uberblock is not a checkpoint.
  122          *
  123          * 2] On checkpointed uberblocks, the value of ub_checkpoint_txg is
  124          *    the ub_txg that the uberblock had at the time we moved it to
  125          *    the MOS config.
  126          *
  127          * The field is set when we checkpoint the uberblock and continues to
  128          * hold that value even after we've rewound (unlike the ub_txg that
  129          * is reset to a higher value).
  130          *
  131          * Besides checks used to determine whether we are reopening the
  132          * pool from a checkpointed uberblock [see spa_ld_select_uberblock()],
  133          * the value of the field is used to determine which ZIL blocks have
  134          * been allocated according to the ms_sm when we are rewinding to a
  135          * checkpoint. Specifically, if blk_birth > ub_checkpoint_txg, then
  136          * the ZIL block is not allocated [see uses of spa_min_claim_txg()].
  137          */
  138         uint64_t        ub_checkpoint_txg;
  139 };
  140 
  141 #ifdef  __cplusplus
  142 }
  143 #endif
  144 
  145 #endif  /* _SYS_UBERBLOCK_IMPL_H */

Cache object: 71f30e3937e10aa86fa5aa923357fe1d


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.