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_FAR_IMPL_H
  27 #define _SYS_FAR_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 #include <sys/avl.h>
  38 #include <sys/dmu_impl.h>
  39 
  40 #define FAR_NO_INO      0
  41 
  42 enum pass {
  43         PASS_LINK,
  44         PASS_UNLINK
  45 };
  46 
  47 typedef struct _far_count_elem {
  48         avl_node_t      fce_avl_node;
  49         uint64_t        fce_ino;
  50         uint64_t        fce_count;
  51         uint64_t        fce_aux;
  52 } far_count_elem_t;
  53 
  54 typedef struct _far_counter {
  55         avl_tree_t fc_avl;
  56         char *fc_name;
  57 } far_counter_t;
  58 
  59 typedef struct blklevel {
  60         uint64_t        bl_blk;
  61         int             bl_nslots;
  62         blkptr_t        *bl_bp;
  63         arc_buf_t       *bl_buf;
  64 } blklevel_t;
  65 
  66 typedef struct _far {
  67         enum pass f_pass;
  68         struct _far_ops *f_ops;
  69         far_counter_t f_del_dir_cnt;
  70         far_counter_t f_put_back_cnt;
  71         far_counter_t f_link_add_cnt;
  72         uint64_t f_current_ino;
  73         struct _far_path *f_current_path;
  74         int             f_alloc_len;
  75         uint8_t         *f_buf;
  76         int             f_size;
  77         struct vnode    *f_vp;          /* file to which we are reporting */
  78         offset_t        *f_offp;
  79         int             f_err;          /* error that stopped diff search */
  80         dsl_dataset_t   *f_fromds;
  81         dsl_dataset_t   *f_tods;
  82         objset_t        *f_fromsnap;
  83         objset_t        *f_tosnap;
  84         dnode_phys_t    *f_dnp;
  85         blklevel_t      *f_bl;
  86         blklevel_t      *f_filebl;
  87         uint64_t        f_fromtxg;
  88         sa_attr_type_t  *f_from_sa_table;
  89         sa_attr_type_t  *f_to_sa_table;
  90         uint64_t        f_shares_dir;
  91         dmu_sendarg_t   f_dmu_sendarg;
  92 } far_t;
  93 
  94 typedef struct _far_ops {
  95         int (*far_dir_add)(far_t *f, uint64_t ino);
  96         int (*far_dir_del)(far_t *f, uint64_t ino);
  97         int (*far_dir_mod)(far_t *f, uint64_t ino);
  98         int (*far_dirent_add)(void *far_enump, char *name, uint64_t ino);
  99         int (*far_dirent_del)(void *far_enump, char *name, uint64_t ino);
 100         int (*far_dirent_mod)(void *far_enump, char *name,
 101             uint64_t ino_old, uint64_t ino_new);
 102         int (*far_dirent_unmod)(void *far_enump, char *name, uint64_t ino);
 103         int (*far_file_add)(far_t *f, uint64_t ino);
 104         int (*far_file_del)(far_t *f, uint64_t ino);
 105         int (*far_file_mod)(far_t *f, uint64_t ino);
 106         int (*far_file_data)(void *far_filep, void *data, uint64_t off,
 107             uint64_t len);
 108 } far_ops_t;
 109 
 110 typedef struct _far_path {
 111         struct _far_path *fp_next;
 112         int fp_len;
 113         int fp_total_len;
 114         char fp_buf[0];
 115 } far_path_t;
 116 
 117 typedef struct _far_dirent {
 118         char *fd_name;
 119         uint64_t fd_parent_ino;
 120         struct _far_dirent *fd_prev;
 121 } far_dirent_t;
 122 
 123 typedef enum _far_which {
 124         FAR_UNDEF,
 125         FAR_OLD,
 126         FAR_NEW
 127 } far_which_t;
 128 
 129 typedef struct _far_time {
 130         uint64_t        st_sec;
 131         uint64_t        st_nsec;
 132 } far_time_t;
 133 
 134 #define FI_ATTR_ATIME           (1 <<  0)
 135 #define FI_ATTR_MTIME           (1 <<  1)
 136 #define FI_ATTR_CTIME           (1 <<  2)
 137 #define FI_ATTR_OTIME           (1 <<  3)
 138 #define FI_ATTR_MODE            (1 <<  4)
 139 #define FI_ATTR_SIZE            (1 <<  5)
 140 #define FI_ATTR_NENTRIES        (1 <<  5)
 141 #define FI_ATTR_PARENT          (1 <<  6)
 142 #define FI_ATTR_LINKS           (1 <<  7)
 143 #define FI_ATTR_RDEV            (1 <<  8)
 144 #define FI_ATTR_UID             (1 <<  9)
 145 #define FI_ATTR_GID             (1 << 10)
 146 #define FI_ATTR_GEN             (1 << 11)
 147 /* XXX TODO xattr, acl, dacl */
 148 
 149 #undef si_uid   /* XXX defined in siginfo.h */
 150 #undef si_gid   /* XXX defined in siginfo.h */
 151 typedef struct _far_info {
 152         uint64_t        si_nlinks;
 153         uint64_t        si_parent;
 154         union {
 155                 uint64_t        si_nentries;
 156                 uint64_t        si_size;
 157         };
 158         far_time_t      si_atime;
 159         far_time_t      si_mtime;
 160         far_time_t      si_ctime;
 161         far_time_t      si_otime;
 162         uint64_t        si_mode;
 163         /* XXX TODO xattr */
 164         uint64_t        si_rdev;
 165         uint64_t        si_uid;
 166         uint64_t        si_gid;
 167         uint64_t        si_gen;
 168 } far_info_t;
 169 
 170 int far_start(far_t *f, far_ops_t **);
 171 int far_start2(far_t *f, far_ops_t **);
 172 int far_abort(far_t *f);
 173 int far_end(far_t *f);
 174 
 175 int far_dirent_add_file(far_t *f, far_dirent_t *dirent,
 176     uint64_t ino, uint64_t mode, int exists);
 177 void far_path_free(far_path_t *fp);
 178 
 179 int far_get_info(far_t *f, uint64_t dnobj, far_which_t which,
 180     far_info_t *sp, uint64_t flags);
 181 
 182 typedef int (*far_file_cb_t)(void *ctx, void *data, int len);
 183 int far_file_contents(far_t *f, uint64_t dnobj, void *ctx);
 184 int far_dir_contents(far_t *f, uint64_t dnobj, void *ctx);
 185 int far_find_entry(far_t *f, uint64_t dirobj, uint64_t dnobj,
 186     far_which_t which, char **name);
 187 void far_free_name(char *name);
 188 int far_lookup_entry(far_t *f, uint64_t dirobj, char *name,
 189     far_which_t which, uint64_t *dnobj);
 190 int far_write(far_t *f, const uint8_t *data, int len);
 191 int far_get_uuid(far_t *f, far_which_t which, uint8_t data[16]);
 192 int far_get_ctransid(far_t *f, far_which_t which,
 193     uint64_t *ctransid);
 194 int far_get_snapname(far_t *f, far_which_t which,
 195     char **name, int *len);
 196 int far_read_symlink(far_t *f, uint64_t dnobj, far_which_t which,
 197     char **target, int *plen);
 198 
 199 int far_send_start(far_t *f);
 200 int far_send_create_file(far_t *f, far_dirent_t *dirent, uint64_t ino,
 201 int devise_tempname, far_path_t **path_ret);
 202 int far_send_link(far_t *f, far_dirent_t *new_dirent, uint64_t ino,
 203     uint64_t old_parent_ino, far_which_t which,
 204 int devise_tempname);
 205 int far_send_mkdir(far_t *f, far_dirent_t *dirent, uint64_t ino,
 206 int devise_tempname);
 207 int far_send_rename(far_t *f, far_dirent_t *dirent, uint64_t ino,
 208     uint64_t old_parent_ino, int devise_tempname);
 209 int far_send_rename_from_tempname(far_t *f, far_dirent_t *dirent,
 210     uint64_t ino, uint64_t old);
 211 int far_send_unlink(far_t *f, far_dirent_t *dirent, uint64_t ino);
 212 int far_send_rmdir(far_t *f, far_dirent_t *dirent, uint64_t ino);
 213 /* TODO: make **path *path or do we really still alloc it? */
 214 int far_send_file_data(far_t *f,
 215     far_path_t **path, far_dirent_t *dirent,
 216     uint64_t ino, uint64_t off, uint64_t len, void *data);
 217 int far_send_mtime_update(far_t *f, far_dirent_t *dirent, uint64_t ino);
 218 int far_send_truncate(far_t *f, far_dirent_t *dirent, uint64_t ino,
 219     uint64_t new_size);
 220 int far_send_chown(far_t *f, far_dirent_t *dirent, uint64_t ino,
 221     uint64_t new_uid, uint64_t new_gid);
 222 int far_send_chmod(far_t *f, far_dirent_t *dirent, uint64_t ino,
 223     uint64_t new_mode);
 224 int far_send_end(far_t *f);
 225 int far_count_init(far_counter_t *fc, char *name);
 226 void far_count_destroy(far_counter_t *fc);
 227 int far_add_count(far_counter_t *fc, uint64_t ino, uint64_t inc,
 228     uint64_t aux, uint64_t *new_count, uint64_t *old_aux);
 229 void far_free_count(far_counter_t *fc, uint64_t ino);
 230 int far_get_count(far_counter_t *fc, uint64_t ino, uint64_t *new_count,
 231     uint64_t *old_aux);
 232 int far_count_fini(far_counter_t *fc);
 233 
 234 void far_send_init(far_t *f);
 235 void far_send_fini(far_t *f);
 236 
 237 #endif /* _SYS_FAR_IMPL_H */