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 http://www.opensolaris.org/os/licensing.
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 /*
23 * Copyright (c) 2012 STRATO AG. All rights reserved.
24 */
25
26 #ifndef _SYS_FITS_IMPL_H
27 #define _SYS_FITS_IMPL_H
28
29 #include <sys/inttypes.h>
30 #include <sys/types.h>
31 #include <sys/cmn_err.h>
32 #include <sys/spa.h>
33 #include <sys/arc.h>
34 #include <sys/dsl_dataset.h>
35 #include <sys/dnode.h>
36 #include <sys/sa.h>
37
38 #define FITS_NO_INO 0
39
40 enum pass {
41 PASS_LINK,
42 PASS_UNLINK
43 };
44
45 typedef struct _fits_count_elem {
46 struct _fits_count_elem *fce_next;
47 uint64_t fce_ino;
48 uint64_t fce_count;
49 uint64_t fce_aux;
50 } fits_count_elem_t;
51
52 typedef struct _fits_counter {
53 fits_count_elem_t *fc_head;
54 const char *fc_name;
55 } fits_counter_t;
56
57 typedef struct blklevel {
58 uint64_t bl_blk;
59 int bl_nslots;
60 blkptr_t *bl_bp;
61 arc_buf_t *bl_buf;
62 } blklevel_t;
63
64 typedef struct _fits {
65 enum pass f_pass;
66 struct _fits_ops *f_ops;
67 fits_counter_t f_del_dir_cnt;
68 fits_counter_t f_put_back_cnt;
69 fits_counter_t f_link_add_cnt;
70 uint64_t f_current_ino;
71 struct _fits_path *f_current_path;
72 int f_alloc_len;
73 uint8_t *f_buf;
74 int f_size;
75 struct vnode *f_vp; /* file to which we are reporting */
76 offset_t *f_offp;
77 int f_err; /* error that stopped diff search */
78 dsl_dataset_t *f_fromds;
79 dsl_dataset_t *f_tods;
80 objset_t *f_fromsnap;
81 objset_t *f_tosnap;
82 dnode_phys_t *f_dnp;
83 blklevel_t *f_bl;
84 blklevel_t *f_filebl;
85 uint64_t f_fromtxg;
86 sa_attr_type_t *f_from_sa_table;
87 sa_attr_type_t *f_to_sa_table;
88 uint64_t f_shares_dir;
89 } fits_t;
90
91 typedef struct _fits_ops {
92 int (*fits_dir_add)(fits_t *f, uint64_t ino);
93 int (*fits_dir_del)(fits_t *f, uint64_t ino);
94 int (*fits_dir_mod)(fits_t *f, uint64_t ino);
95 int (*fits_dirent_add)(void *fits_enump, char *name, uint64_t ino);
96 int (*fits_dirent_del)(void *fits_enump, char *name, uint64_t ino);
97 int (*fits_dirent_mod)(void *fits_enump, char *name,
98 uint64_t ino_old, uint64_t ino_new);
99 int (*fits_dirent_unmod)(void *fits_enump, char *name, uint64_t ino);
100 int (*fits_file_add)(fits_t *f, uint64_t ino);
101 int (*fits_file_del)(fits_t *f, uint64_t ino);
102 int (*fits_file_mod)(fits_t *f, uint64_t ino);
103 int (*fits_file_data)(void *fits_filep, void *data, uint64_t off,
104 uint64_t len);
105 } fits_ops_t;
106
107 typedef struct _fits_path {
108 struct _fits_path *fp_next;
109 int fp_len;
110 int fp_total_len;
111 char fp_buf[0];
112 } fits_path_t;
113
114 typedef struct _fits_dirent {
115 char *fd_name;
116 uint64_t fd_parent_ino;
117 struct _fits_dirent *fd_prev;
118 } fits_dirent_t;
119
120 typedef enum _fits_which {
121 FITS_UNDEF,
122 FITS_OLD,
123 FITS_NEW
124 } fits_which_t;
125
126 typedef struct _fits_time {
127 uint64_t st_sec;
128 uint64_t st_nsec;
129 } fits_time_t;
130
131 #define FI_ATTR_ATIME (1 << 0)
132 #define FI_ATTR_MTIME (1 << 1)
133 #define FI_ATTR_CTIME (1 << 2)
134 #define FI_ATTR_OTIME (1 << 3)
135 #define FI_ATTR_MODE (1 << 4)
136 #define FI_ATTR_SIZE (1 << 5)
137 #define FI_ATTR_NENTRIES (1 << 5)
138 #define FI_ATTR_PARENT (1 << 6)
139 #define FI_ATTR_LINKS (1 << 7)
140 #define FI_ATTR_RDEV (1 << 8)
141 #define FI_ATTR_UID (1 << 9)
142 #define FI_ATTR_GID (1 << 10)
143 #define FI_ATTR_GEN (1 << 11)
144 /* XXX TODO xattr, acl, dacl */
145
146 #undef si_uid /* XXX defined in siginfo.h */
147 #undef si_gid /* XXX defined in siginfo.h */
148 typedef struct _fits_info {
149 uint64_t si_nlinks;
150 uint64_t si_parent;
151 union {
152 uint64_t si_nentries;
153 uint64_t si_size;
154 };
155 fits_time_t si_atime;
156 fits_time_t si_mtime;
157 fits_time_t si_ctime;
158 fits_time_t si_otime;
159 uint64_t si_mode;
160 /* XXX TODO xattr */
161 uint64_t si_rdev;
162 uint64_t si_uid;
163 uint64_t si_gid;
164 uint64_t si_gen;
165 } fits_info_t;
166
167 int fits_start(fits_t *f, fits_ops_t **);
168 int fits_start2(fits_t *f, fits_ops_t **);
169 int fits_abort(fits_t *f);
170 int fits_end(fits_t *f);
171
172 int fits_dirent_add_file(fits_t *f, fits_dirent_t *dirent,
173 uint64_t ino, uint64_t mode, int exists);
174 void fits_path_free(fits_path_t *fp);
175
176 int fits_get_info(fits_t *f, uint64_t dnobj, fits_which_t which,
177 fits_info_t *sp, uint64_t flags);
178
179 typedef int (*fits_file_cb_t)(void *ctx, void *data, int len);
180 int fits_file_contents(fits_t *f, uint64_t dnobj, void *ctx);
181 int fits_dir_contents(fits_t *f, uint64_t dnobj, void *ctx);
182 int fits_find_entry(fits_t *f, uint64_t dirobj, uint64_t dnobj,
183 fits_which_t which, char **name);
184 void fits_free_name(char *name);
185 int fits_lookup_entry(fits_t *f, uint64_t dirobj, char *name,
186 fits_which_t which, uint64_t *dnobj);
187 int fits_write(fits_t *f, const uint8_t *data, int len);
188 int fits_get_uuid(fits_t *f, fits_which_t which, uint8_t data[16]);
189 int fits_get_ctransid(fits_t *f, fits_which_t which,
190 uint64_t *ctransid);
191 int fits_get_snapname(fits_t *f, fits_which_t which,
192 char **name, int *len);
193 int fits_read_symlink(fits_t *f, uint64_t dnobj, fits_which_t which,
194 char **target, int *plen);
195
196 int fits_send_start(fits_t *f);
197 int fits_send_create_file(fits_t *f, fits_dirent_t *dirent, uint64_t ino,
198 int devise_tempname, fits_path_t **path_ret);
199 int fits_send_link(fits_t *f, fits_dirent_t *new_dirent, uint64_t ino,
200 uint64_t old_parent_ino, fits_which_t which,
201 int devise_tempname);
202 int fits_send_mkdir(fits_t *f, fits_dirent_t *dirent, uint64_t ino,
203 int devise_tempname);
204 int fits_send_rename(fits_t *f, fits_dirent_t *dirent, uint64_t ino,
205 uint64_t old_parent_ino, int devise_tempname);
206 int fits_send_rename_from_tempname(fits_t *f, fits_dirent_t *dirent,
207 uint64_t ino, uint64_t old);
208 int fits_send_unlink(fits_t *f, fits_dirent_t *dirent, uint64_t ino);
209 int fits_send_rmdir(fits_t *f, fits_dirent_t *dirent, uint64_t ino);
210 /* TODO: make **path *path or do we really still alloc it? */
211 int fits_send_file_data(fits_t *f,
212 fits_path_t **path, fits_dirent_t *dirent,
213 uint64_t ino, uint64_t off, uint64_t len, void *data);
214 int fits_send_mtime_update(fits_t *f, fits_dirent_t *dirent, uint64_t ino);
215 int fits_send_truncate(fits_t *f, fits_dirent_t *dirent, uint64_t ino,
216 uint64_t new_size);
217 int fits_send_chown(fits_t *f, fits_dirent_t *dirent, uint64_t ino,
218 uint64_t new_uid, uint64_t new_gid);
219 int fits_send_chmod(fits_t *f, fits_dirent_t *dirent, uint64_t ino,
220 uint64_t new_mode);
221 int fits_send_end(fits_t *f);
222 int fits_add_count(fits_counter_t *fc, uint64_t ino, uint64_t inc,
223 uint64_t aux, uint64_t *new_count, uint64_t *old_aux);
224 void fits_free_count(fits_counter_t *fc, uint64_t ino);
225 int fits_get_count(fits_counter_t *fc, uint64_t ino, uint64_t *new_count,
226 uint64_t *old_aux);
227 int fits_assert_count_empty(fits_counter_t *fc);
228
229 void fits_send_init(fits_t *f);
230 void fits_send_fini(fits_t *f);
231
232 #endif /* _SYS_FITS_IMPL_H */