]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - usr.sbin/makefs/zfs/zfs.h
Import device-tree files from Linux 5.15
[FreeBSD/FreeBSD.git] / usr.sbin / makefs / zfs / zfs.h
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 2022 The FreeBSD Foundation
5  *
6  * This software was developed by Mark Johnston under sponsorship from
7  * the FreeBSD Foundation.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions are
11  * met:
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 distribution.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28  * SUCH DAMAGE.
29  */
30
31 #ifndef _MAKEFS_ZFS_H_
32 #define _MAKEFS_ZFS_H_
33
34 #include <sys/types.h>
35 #include <sys/queue.h>
36
37 #include <bitstring.h>
38 #include <stdbool.h>
39
40 #include "makefs.h"
41
42 #include "zfs/nvlist.h"
43 #define ASSERT          assert
44 #include "zfs/zfsimpl.h"
45
46 #define MAXBLOCKSHIFT           17      /* 128KB */
47 #define MAXBLOCKSIZE            ((off_t)(1 << MAXBLOCKSHIFT))
48 _Static_assert(MAXBLOCKSIZE == SPA_OLDMAXBLOCKSIZE, "");
49 #define MINBLOCKSHIFT           9       /* 512B */
50 #define MINBLOCKSIZE            ((off_t)(1 << MINBLOCKSHIFT))
51 _Static_assert(MINBLOCKSIZE == SPA_MINBLOCKSIZE, "");
52 #define MINDEVSIZE              ((off_t)SPA_MINDEVSIZE)
53
54 /* All data was written in this transaction group. */
55 #define TXG                     4
56
57 typedef struct zfs_dsl_dataset zfs_dsl_dataset_t;
58 typedef struct zfs_dsl_dir zfs_dsl_dir_t;
59 typedef struct zfs_objset zfs_objset_t;
60 typedef struct zfs_zap zfs_zap_t;
61
62 struct dataset_desc {
63         char            *params;
64         STAILQ_ENTRY(dataset_desc) next;
65 };
66
67 typedef struct {
68         bool            nowarn;
69
70         /* I/O buffer, just for convenience. */
71         char            filebuf[MAXBLOCKSIZE];
72
73         /* Pool parameters. */
74         const char      *poolname;
75         char            *rootpath;      /* implicit mount point prefix */
76         char            *bootfs;        /* bootable dataset, pool property */
77         int             ashift;         /* vdev block size */
78         uint64_t        mssize;         /* metaslab size */
79         STAILQ_HEAD(, dataset_desc) datasetdescs; /* non-root dataset descrs  */
80
81         /* Pool state. */
82         uint64_t        poolguid;       /* pool and root vdev GUID */
83         zfs_zap_t       *poolprops;
84
85         /* MOS state. */
86         zfs_objset_t    *mos;           /* meta object set */
87         uint64_t        objarrid;       /* space map object array */
88
89         /* DSL state. */
90         zfs_dsl_dir_t   *rootdsldir;    /* root DSL directory */
91         zfs_dsl_dataset_t *rootds;
92         zfs_dsl_dir_t   *origindsldir;  /* $ORIGIN */
93         zfs_dsl_dataset_t *originds;
94         zfs_dsl_dataset_t *snapds;
95         zfs_zap_t       *cloneszap;
96         zfs_dsl_dir_t   *freedsldir;    /* $FREE */
97         zfs_dsl_dir_t   *mosdsldir;     /* $MOS */
98
99         /* vdev state. */
100         int             fd;             /* vdev disk fd */
101         uint64_t        vdevguid;       /* disk vdev GUID */
102         off_t           vdevsize;       /* vdev size, including labels */
103         off_t           asize;          /* vdev size, excluding labels */
104         bitstr_t        *spacemap;      /* space allocation tracking */
105         int             spacemapbits;   /* one bit per ashift-sized block */
106         uint64_t        msshift;        /* log2(metaslab size) */
107         uint64_t        mscount;        /* number of metaslabs for this vdev */
108 } zfs_opt_t;
109
110 /* dsl.c */
111 void dsl_init(zfs_opt_t *);
112 const char *dsl_dir_fullname(const zfs_dsl_dir_t *);
113 uint64_t dsl_dir_id(zfs_dsl_dir_t *);
114 uint64_t dsl_dir_dataset_id(zfs_dsl_dir_t *);
115 void dsl_dir_foreach(zfs_opt_t *, zfs_dsl_dir_t *,
116     void (*)(zfs_opt_t *, zfs_dsl_dir_t *, void *), void *);
117 int dsl_dir_get_canmount(zfs_dsl_dir_t *, uint64_t *);
118 char *dsl_dir_get_mountpoint(zfs_opt_t *, zfs_dsl_dir_t *);
119 bool dsl_dir_has_dataset(zfs_dsl_dir_t *);
120 bool dsl_dir_dataset_has_objset(zfs_dsl_dir_t *);
121 void dsl_dir_dataset_write(zfs_opt_t *, zfs_objset_t *, zfs_dsl_dir_t *);
122 void dsl_dir_size_set(zfs_dsl_dir_t *, uint64_t);
123 void dsl_write(zfs_opt_t *);
124
125 /* fs.c */
126 void fs_build(zfs_opt_t *, int, fsnode *);
127
128 /* objset.c */
129 zfs_objset_t *objset_alloc(zfs_opt_t *zfs, uint64_t type);
130 off_t objset_space_alloc(zfs_opt_t *, zfs_objset_t *, off_t *);
131 dnode_phys_t *objset_dnode_alloc(zfs_objset_t *, uint8_t, uint64_t *);
132 dnode_phys_t *objset_dnode_bonus_alloc(zfs_objset_t *, uint8_t, uint8_t,
133     uint16_t, uint64_t *);
134 dnode_phys_t *objset_dnode_lookup(zfs_objset_t *, uint64_t);
135 void objset_root_blkptr_copy(const zfs_objset_t *, blkptr_t *);
136 uint64_t objset_space(const zfs_objset_t *);
137 void objset_write(zfs_opt_t *zfs, zfs_objset_t *os);
138
139 /* vdev.c */
140 void vdev_init(zfs_opt_t *, const char *);
141 off_t vdev_space_alloc(zfs_opt_t *zfs, off_t *lenp);
142 void vdev_pwrite_data(zfs_opt_t *zfs, uint8_t datatype, uint8_t cksumtype,
143     uint8_t level, uint64_t fill, const void *data, off_t sz, off_t loc,
144     blkptr_t *bp);
145 void vdev_pwrite_dnode_indir(zfs_opt_t *zfs, dnode_phys_t *dnode, uint8_t level,
146     uint64_t fill, const void *data, off_t sz, off_t loc, blkptr_t *bp);
147 void vdev_pwrite_dnode_data(zfs_opt_t *zfs, dnode_phys_t *dnode, const void *data,
148     off_t sz, off_t loc);
149 void vdev_label_write(zfs_opt_t *zfs, int ind, const vdev_label_t *labelp);
150 void vdev_spacemap_write(zfs_opt_t *);
151 void vdev_fini(zfs_opt_t *zfs);
152
153 /* zap.c */
154 zfs_zap_t *zap_alloc(zfs_objset_t *, dnode_phys_t *);
155 void zap_add(zfs_zap_t *, const char *, size_t, size_t, const uint8_t *);
156 void zap_add_uint64(zfs_zap_t *, const char *, uint64_t);
157 void zap_add_string(zfs_zap_t *, const char *, const char *);
158 bool zap_entry_exists(zfs_zap_t *, const char *);
159 void zap_write(zfs_opt_t *, zfs_zap_t *);
160
161 /* zfs.c */
162 struct dnode_cursor *dnode_cursor_init(zfs_opt_t *, zfs_objset_t *,
163     dnode_phys_t *, off_t, off_t);
164 blkptr_t *dnode_cursor_next(zfs_opt_t *, struct dnode_cursor *, off_t);
165 void dnode_cursor_finish(zfs_opt_t *, struct dnode_cursor *);
166
167 #endif /* !_MAKEFS_ZFS_H_ */