Home | History | Annotate | Line # | Download | only in sys
      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  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
     23  * Copyright (c) 2012, 2015 by Delphix. All rights reserved.
     24  * Copyright (c) 2013 by Saso Kiselkov. All rights reserved.
     25  * Copyright (c) 2014 Spectra Logic Corporation, All rights reserved.
     26  * Copyright (c) 2014 Integros [integros.com]
     27  */
     28 
     29 /* Portions Copyright 2010 Robert Milkowski */
     30 
     31 #ifndef	_SYS_DMU_OBJSET_H
     32 #define	_SYS_DMU_OBJSET_H
     33 
     34 #include <sys/spa.h>
     35 #include <sys/arc.h>
     36 #include <sys/txg.h>
     37 #include <sys/zfs_context.h>
     38 #include <sys/dnode.h>
     39 #include <sys/zio.h>
     40 #include <sys/zil.h>
     41 #include <sys/sa.h>
     42 
     43 #ifdef	__cplusplus
     44 extern "C" {
     45 #endif
     46 
     47 extern krwlock_t os_lock;
     48 
     49 struct dsl_pool;
     50 struct dsl_dataset;
     51 struct dmu_tx;
     52 
     53 #define	OBJSET_PHYS_SIZE 2048
     54 #define	OBJSET_OLD_PHYS_SIZE 1024
     55 
     56 #define	OBJSET_BUF_HAS_USERUSED(buf) \
     57 	(arc_buf_size(buf) > OBJSET_OLD_PHYS_SIZE)
     58 
     59 #define	OBJSET_FLAG_USERACCOUNTING_COMPLETE	(1ULL<<0)
     60 
     61 typedef struct objset_phys {
     62 	dnode_phys_t os_meta_dnode;
     63 	zil_header_t os_zil_header;
     64 	uint64_t os_type;
     65 	uint64_t os_flags;
     66 	char os_pad[OBJSET_PHYS_SIZE - sizeof (dnode_phys_t)*3 -
     67 	    sizeof (zil_header_t) - sizeof (uint64_t)*2];
     68 	dnode_phys_t os_userused_dnode;
     69 	dnode_phys_t os_groupused_dnode;
     70 } objset_phys_t;
     71 
     72 struct objset {
     73 	/* Immutable: */
     74 	struct dsl_dataset *os_dsl_dataset;
     75 	spa_t *os_spa;
     76 	arc_buf_t *os_phys_buf;
     77 	objset_phys_t *os_phys;
     78 	/*
     79 	 * The following "special" dnodes have no parent, are exempt
     80 	 * from dnode_move(), and are not recorded in os_dnodes, but they
     81 	 * root their descendents in this objset using handles anyway, so
     82 	 * that all access to dnodes from dbufs consistently uses handles.
     83 	 */
     84 	dnode_handle_t os_meta_dnode;
     85 	dnode_handle_t os_userused_dnode;
     86 	dnode_handle_t os_groupused_dnode;
     87 	zilog_t *os_zil;
     88 
     89 	list_node_t os_evicting_node;
     90 
     91 	/* can change, under dsl_dir's locks: */
     92 	enum zio_checksum os_checksum;
     93 	enum zio_compress os_compress;
     94 	uint8_t os_copies;
     95 	enum zio_checksum os_dedup_checksum;
     96 	boolean_t os_dedup_verify;
     97 	zfs_logbias_op_t os_logbias;
     98 	zfs_cache_type_t os_primary_cache;
     99 	zfs_cache_type_t os_secondary_cache;
    100 	zfs_sync_type_t os_sync;
    101 	zfs_redundant_metadata_type_t os_redundant_metadata;
    102 	int os_recordsize;
    103 
    104 	/*
    105 	 * Pointer is constant; the blkptr it points to is protected by
    106 	 * os_dsl_dataset->ds_bp_rwlock
    107 	 */
    108 	blkptr_t *os_rootbp;
    109 
    110 	/* no lock needed: */
    111 	struct dmu_tx *os_synctx; /* XXX sketchy */
    112 	zil_header_t os_zil_header;
    113 	list_t os_synced_dnodes;
    114 	uint64_t os_flags;
    115 
    116 	/* Protected by os_obj_lock */
    117 	kmutex_t os_obj_lock;
    118 	uint64_t os_obj_next;
    119 
    120 	/* Protected by os_lock */
    121 	kmutex_t os_lock;
    122 	list_t os_dirty_dnodes[TXG_SIZE];
    123 	list_t os_free_dnodes[TXG_SIZE];
    124 	list_t os_dnodes;
    125 	list_t os_downgraded_dbufs;
    126 
    127 	/* stuff we store for the user */
    128 	kmutex_t os_user_ptr_lock;
    129 	void *os_user_ptr;
    130 	sa_os_t *os_sa;
    131 };
    132 
    133 #define	DMU_META_OBJSET		0
    134 #define	DMU_META_DNODE_OBJECT	0
    135 #define	DMU_OBJECT_IS_SPECIAL(obj) ((int64_t)(obj) <= 0)
    136 #define	DMU_META_DNODE(os)	((os)->os_meta_dnode.dnh_dnode)
    137 #define	DMU_USERUSED_DNODE(os)	((os)->os_userused_dnode.dnh_dnode)
    138 #define	DMU_GROUPUSED_DNODE(os)	((os)->os_groupused_dnode.dnh_dnode)
    139 
    140 #define	DMU_OS_IS_L2CACHEABLE(os)				\
    141 	((os)->os_secondary_cache == ZFS_CACHE_ALL ||		\
    142 	(os)->os_secondary_cache == ZFS_CACHE_METADATA)
    143 
    144 #define	DMU_OS_IS_L2COMPRESSIBLE(os)	(zfs_mdcomp_disable == B_FALSE)
    145 
    146 /* called from zpl */
    147 int dmu_objset_hold(const char *name, void *tag, objset_t **osp);
    148 int dmu_objset_own(const char *name, dmu_objset_type_t type,
    149     boolean_t readonly, void *tag, objset_t **osp);
    150 int dmu_objset_own_obj(struct dsl_pool *dp, uint64_t obj,
    151     dmu_objset_type_t type, boolean_t readonly, void *tag, objset_t **osp);
    152 void dmu_objset_refresh_ownership(objset_t *os, void *tag);
    153 void dmu_objset_rele(objset_t *os, void *tag);
    154 void dmu_objset_disown(objset_t *os, void *tag);
    155 int dmu_objset_from_ds(struct dsl_dataset *ds, objset_t **osp);
    156 
    157 void dmu_objset_stats(objset_t *os, nvlist_t *nv);
    158 void dmu_objset_fast_stat(objset_t *os, dmu_objset_stats_t *stat);
    159 void dmu_objset_space(objset_t *os, uint64_t *refdbytesp, uint64_t *availbytesp,
    160     uint64_t *usedobjsp, uint64_t *availobjsp);
    161 uint64_t dmu_objset_fsid_guid(objset_t *os);
    162 int dmu_objset_find_dp(struct dsl_pool *dp, uint64_t ddobj,
    163     int func(struct dsl_pool *, struct dsl_dataset *, void *),
    164     void *arg, int flags);
    165 int dmu_objset_prefetch(const char *name, void *arg);
    166 void dmu_objset_evict_dbufs(objset_t *os);
    167 timestruc_t dmu_objset_snap_cmtime(objset_t *os);
    168 
    169 /* called from dsl */
    170 void dmu_objset_sync(objset_t *os, zio_t *zio, dmu_tx_t *tx);
    171 boolean_t dmu_objset_is_dirty(objset_t *os, uint64_t txg);
    172 objset_t *dmu_objset_create_impl(spa_t *spa, struct dsl_dataset *ds,
    173     blkptr_t *bp, dmu_objset_type_t type, dmu_tx_t *tx);
    174 int dmu_objset_open_impl(spa_t *spa, struct dsl_dataset *ds, blkptr_t *bp,
    175     objset_t **osp);
    176 void dmu_objset_evict(objset_t *os);
    177 void dmu_objset_do_userquota_updates(objset_t *os, dmu_tx_t *tx);
    178 void dmu_objset_userquota_get_ids(dnode_t *dn, boolean_t before, dmu_tx_t *tx);
    179 boolean_t dmu_objset_userused_enabled(objset_t *os);
    180 int dmu_objset_userspace_upgrade(objset_t *os);
    181 boolean_t dmu_objset_userspace_present(objset_t *os);
    182 int dmu_fsname(const char *snapname, char *buf);
    183 
    184 void dmu_objset_evict_done(objset_t *os);
    185 
    186 void dmu_objset_init(void);
    187 void dmu_objset_fini(void);
    188 
    189 #ifdef	__cplusplus
    190 }
    191 #endif
    192 
    193 #endif /* _SYS_DMU_OBJSET_H */
    194