mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 02:27:36 +03:00
OpenZFS 9328 - zap code can take advantage of c99
The ZAP code was written before we allowed c99 in the Solaris kernel. We should change it to take advantage of being able to declare variables where they are first used. This reduces variable scope and means less scrolling to find the type of variables. Authored by: Matthew Ahrens <mahrens@delphix.com> Reviewed by: Steve Gonczi <steve.gonczi@delphix.com> Reviewed by: George Wilson <george.wilson@delphix.com> Reviewed-by: George Melikov <mail@gmelikov.ru> Approved by: Dan McDonald <danmcd@joyent.com> Ported-by: Brian Behlendorf <behlendorf1@llnl.gov> OpenZFS-issue: https://illumos.org/issues/9328 OpenZFS-commit: https://github.com/openzfs/openzfs/commit/76ead05 Closes #7578
This commit is contained in:
committed by
Brian Behlendorf
parent
74d42600d8
commit
d2a12f9e2a
+28
-55
@@ -21,7 +21,7 @@
|
||||
|
||||
/*
|
||||
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2013, 2015 by Delphix. All rights reserved.
|
||||
* Copyright (c) 2013, 2016 by Delphix. All rights reserved.
|
||||
* Copyright 2017 Nexenta Systems, Inc.
|
||||
*/
|
||||
|
||||
@@ -109,7 +109,6 @@ ldv(int len, const void *addr)
|
||||
void
|
||||
zap_leaf_byteswap(zap_leaf_phys_t *buf, int size)
|
||||
{
|
||||
int i;
|
||||
zap_leaf_t l;
|
||||
dmu_buf_t l_dbuf;
|
||||
|
||||
@@ -125,10 +124,10 @@ zap_leaf_byteswap(zap_leaf_phys_t *buf, int size)
|
||||
buf->l_hdr.lh_prefix_len = BSWAP_16(buf->l_hdr.lh_prefix_len);
|
||||
buf->l_hdr.lh_freelist = BSWAP_16(buf->l_hdr.lh_freelist);
|
||||
|
||||
for (i = 0; i < ZAP_LEAF_HASH_NUMENTRIES(&l); i++)
|
||||
for (int i = 0; i < ZAP_LEAF_HASH_NUMENTRIES(&l); i++)
|
||||
buf->l_hash[i] = BSWAP_16(buf->l_hash[i]);
|
||||
|
||||
for (i = 0; i < ZAP_LEAF_NUMCHUNKS(&l); i++) {
|
||||
for (int i = 0; i < ZAP_LEAF_NUMCHUNKS(&l); i++) {
|
||||
zap_leaf_chunk_t *lc = &ZAP_LEAF_CHUNK(&l, i);
|
||||
struct zap_leaf_entry *le;
|
||||
|
||||
@@ -165,14 +164,12 @@ zap_leaf_byteswap(zap_leaf_phys_t *buf, int size)
|
||||
void
|
||||
zap_leaf_init(zap_leaf_t *l, boolean_t sort)
|
||||
{
|
||||
int i;
|
||||
|
||||
l->l_bs = highbit64(l->l_dbuf->db_size) - 1;
|
||||
zap_memset(&zap_leaf_phys(l)->l_hdr, 0,
|
||||
sizeof (struct zap_leaf_header));
|
||||
zap_memset(zap_leaf_phys(l)->l_hash, CHAIN_END,
|
||||
2*ZAP_LEAF_HASH_NUMENTRIES(l));
|
||||
for (i = 0; i < ZAP_LEAF_NUMCHUNKS(l); i++) {
|
||||
for (int i = 0; i < ZAP_LEAF_NUMCHUNKS(l); i++) {
|
||||
ZAP_LEAF_CHUNK(l, i).l_free.lf_type = ZAP_CHUNK_FREE;
|
||||
ZAP_LEAF_CHUNK(l, i).l_free.lf_next = i+1;
|
||||
}
|
||||
@@ -191,11 +188,9 @@ zap_leaf_init(zap_leaf_t *l, boolean_t sort)
|
||||
static uint16_t
|
||||
zap_leaf_chunk_alloc(zap_leaf_t *l)
|
||||
{
|
||||
int chunk;
|
||||
|
||||
ASSERT(zap_leaf_phys(l)->l_hdr.lh_nfree > 0);
|
||||
|
||||
chunk = zap_leaf_phys(l)->l_hdr.lh_freelist;
|
||||
int chunk = zap_leaf_phys(l)->l_hdr.lh_freelist;
|
||||
ASSERT3U(chunk, <, ZAP_LEAF_NUMCHUNKS(l));
|
||||
ASSERT3U(ZAP_LEAF_CHUNK(l, chunk).l_free.lf_type, ==, ZAP_CHUNK_FREE);
|
||||
|
||||
@@ -235,7 +230,7 @@ zap_leaf_array_create(zap_leaf_t *l, const char *buf,
|
||||
uint16_t *chunkp = &chunk_head;
|
||||
int byten = 0;
|
||||
uint64_t value = 0;
|
||||
int shift = (integer_size-1)*8;
|
||||
int shift = (integer_size - 1) * 8;
|
||||
int len = num_integers;
|
||||
|
||||
ASSERT3U(num_integers * integer_size, <, MAX_ARRAY_BYTES);
|
||||
@@ -243,10 +238,9 @@ zap_leaf_array_create(zap_leaf_t *l, const char *buf,
|
||||
while (len > 0) {
|
||||
uint16_t chunk = zap_leaf_chunk_alloc(l);
|
||||
struct zap_leaf_array *la = &ZAP_LEAF_CHUNK(l, chunk).l_array;
|
||||
int i;
|
||||
|
||||
la->la_type = ZAP_CHUNK_ARRAY;
|
||||
for (i = 0; i < ZAP_LEAF_ARRAY_BYTES; i++) {
|
||||
for (int i = 0; i < ZAP_LEAF_ARRAY_BYTES; i++) {
|
||||
if (byten == 0)
|
||||
value = ldv(integer_size, buf);
|
||||
la->la_array[i] = value >> shift;
|
||||
@@ -324,10 +318,9 @@ zap_leaf_array_read(zap_leaf_t *l, uint16_t chunk,
|
||||
|
||||
while (len > 0) {
|
||||
struct zap_leaf_array *la = &ZAP_LEAF_CHUNK(l, chunk).l_array;
|
||||
int i;
|
||||
|
||||
ASSERT3U(chunk, <, ZAP_LEAF_NUMCHUNKS(l));
|
||||
for (i = 0; i < ZAP_LEAF_ARRAY_BYTES && len > 0; i++) {
|
||||
for (int i = 0; i < ZAP_LEAF_ARRAY_BYTES && len > 0; i++) {
|
||||
value = (value << 8) | la->la_array[i];
|
||||
byten++;
|
||||
if (byten == array_int_len) {
|
||||
@@ -350,16 +343,13 @@ zap_leaf_array_match(zap_leaf_t *l, zap_name_t *zn,
|
||||
int bseen = 0;
|
||||
|
||||
if (zap_getflags(zn->zn_zap) & ZAP_FLAG_UINT64_KEY) {
|
||||
uint64_t *thiskey;
|
||||
boolean_t match;
|
||||
|
||||
uint64_t *thiskey =
|
||||
kmem_alloc(array_numints * sizeof (*thiskey), KM_SLEEP);
|
||||
ASSERT(zn->zn_key_intlen == sizeof (*thiskey));
|
||||
thiskey = kmem_alloc(array_numints * sizeof (*thiskey),
|
||||
KM_SLEEP);
|
||||
|
||||
zap_leaf_array_read(l, chunk, sizeof (*thiskey), array_numints,
|
||||
sizeof (*thiskey), array_numints, thiskey);
|
||||
match = bcmp(thiskey, zn->zn_key_orig,
|
||||
boolean_t match = bcmp(thiskey, zn->zn_key_orig,
|
||||
array_numints * sizeof (*thiskey)) == 0;
|
||||
kmem_free(thiskey, array_numints * sizeof (*thiskey));
|
||||
return (match);
|
||||
@@ -368,11 +358,10 @@ zap_leaf_array_match(zap_leaf_t *l, zap_name_t *zn,
|
||||
ASSERT(zn->zn_key_intlen == 1);
|
||||
if (zn->zn_matchtype & MT_NORMALIZE) {
|
||||
char *thisname = kmem_alloc(array_numints, KM_SLEEP);
|
||||
boolean_t match;
|
||||
|
||||
zap_leaf_array_read(l, chunk, sizeof (char), array_numints,
|
||||
sizeof (char), array_numints, thisname);
|
||||
match = zap_match(zn, thisname);
|
||||
boolean_t match = zap_match(zn, thisname);
|
||||
kmem_free(thisname, array_numints);
|
||||
return (match);
|
||||
}
|
||||
@@ -403,12 +392,11 @@ zap_leaf_array_match(zap_leaf_t *l, zap_name_t *zn,
|
||||
int
|
||||
zap_leaf_lookup(zap_leaf_t *l, zap_name_t *zn, zap_entry_handle_t *zeh)
|
||||
{
|
||||
uint16_t *chunkp;
|
||||
struct zap_leaf_entry *le;
|
||||
|
||||
ASSERT3U(zap_leaf_phys(l)->l_hdr.lh_magic, ==, ZAP_LEAF_MAGIC);
|
||||
|
||||
for (chunkp = LEAF_HASH_ENTPTR(l, zn->zn_hash);
|
||||
for (uint16_t *chunkp = LEAF_HASH_ENTPTR(l, zn->zn_hash);
|
||||
*chunkp != CHAIN_END; chunkp = &le->le_next) {
|
||||
uint16_t chunk = *chunkp;
|
||||
le = ZAP_LEAF_ENTRY(l, chunk);
|
||||
@@ -449,17 +437,15 @@ int
|
||||
zap_leaf_lookup_closest(zap_leaf_t *l,
|
||||
uint64_t h, uint32_t cd, zap_entry_handle_t *zeh)
|
||||
{
|
||||
uint16_t chunk;
|
||||
uint64_t besth = -1ULL;
|
||||
uint32_t bestcd = -1U;
|
||||
uint16_t bestlh = ZAP_LEAF_HASH_NUMENTRIES(l)-1;
|
||||
uint16_t lh;
|
||||
struct zap_leaf_entry *le;
|
||||
|
||||
ASSERT3U(zap_leaf_phys(l)->l_hdr.lh_magic, ==, ZAP_LEAF_MAGIC);
|
||||
|
||||
for (lh = LEAF_HASH(l, h); lh <= bestlh; lh++) {
|
||||
for (chunk = zap_leaf_phys(l)->l_hash[lh];
|
||||
for (uint16_t lh = LEAF_HASH(l, h); lh <= bestlh; lh++) {
|
||||
for (uint16_t chunk = zap_leaf_phys(l)->l_hash[lh];
|
||||
chunk != CHAIN_END; chunk = le->le_next) {
|
||||
le = ZAP_LEAF_ENTRY(l, chunk);
|
||||
|
||||
@@ -532,11 +518,10 @@ int
|
||||
zap_entry_update(zap_entry_handle_t *zeh,
|
||||
uint8_t integer_size, uint64_t num_integers, const void *buf)
|
||||
{
|
||||
int delta_chunks;
|
||||
zap_leaf_t *l = zeh->zeh_leaf;
|
||||
struct zap_leaf_entry *le = ZAP_LEAF_ENTRY(l, *zeh->zeh_chunkp);
|
||||
|
||||
delta_chunks = ZAP_LEAF_ARRAY_NCHUNKS(num_integers * integer_size) -
|
||||
int delta_chunks = ZAP_LEAF_ARRAY_NCHUNKS(num_integers * integer_size) -
|
||||
ZAP_LEAF_ARRAY_NCHUNKS(le->le_value_numints * le->le_value_intlen);
|
||||
|
||||
if ((int)zap_leaf_phys(l)->l_hdr.lh_nfree < delta_chunks)
|
||||
@@ -553,14 +538,12 @@ zap_entry_update(zap_entry_handle_t *zeh,
|
||||
void
|
||||
zap_entry_remove(zap_entry_handle_t *zeh)
|
||||
{
|
||||
uint16_t entry_chunk;
|
||||
struct zap_leaf_entry *le;
|
||||
zap_leaf_t *l = zeh->zeh_leaf;
|
||||
|
||||
ASSERT3P(zeh->zeh_chunkp, !=, &zeh->zeh_fakechunk);
|
||||
|
||||
entry_chunk = *zeh->zeh_chunkp;
|
||||
le = ZAP_LEAF_ENTRY(l, entry_chunk);
|
||||
uint16_t entry_chunk = *zeh->zeh_chunkp;
|
||||
struct zap_leaf_entry *le = ZAP_LEAF_ENTRY(l, entry_chunk);
|
||||
ASSERT3U(le->le_type, ==, ZAP_CHUNK_ENTRY);
|
||||
|
||||
zap_leaf_array_free(l, &le->le_name_chunk);
|
||||
@@ -578,15 +561,12 @@ zap_entry_create(zap_leaf_t *l, zap_name_t *zn, uint32_t cd,
|
||||
zap_entry_handle_t *zeh)
|
||||
{
|
||||
uint16_t chunk;
|
||||
uint16_t *chunkp;
|
||||
struct zap_leaf_entry *le;
|
||||
uint64_t valuelen;
|
||||
int numchunks;
|
||||
uint64_t h = zn->zn_hash;
|
||||
|
||||
valuelen = integer_size * num_integers;
|
||||
uint64_t valuelen = integer_size * num_integers;
|
||||
|
||||
numchunks = 1 + ZAP_LEAF_ARRAY_NCHUNKS(zn->zn_key_orig_numints *
|
||||
int numchunks = 1 + ZAP_LEAF_ARRAY_NCHUNKS(zn->zn_key_orig_numints *
|
||||
zn->zn_key_intlen) + ZAP_LEAF_ARRAY_NCHUNKS(valuelen);
|
||||
if (numchunks > ZAP_LEAF_NUMCHUNKS(l))
|
||||
return (SET_ERROR(E2BIG));
|
||||
@@ -648,7 +628,7 @@ zap_entry_create(zap_leaf_t *l, zap_name_t *zn, uint32_t cd,
|
||||
|
||||
/* link it into the hash chain */
|
||||
/* XXX if we did the search above, we could just use that */
|
||||
chunkp = zap_leaf_rehash_entry(l, chunk);
|
||||
uint16_t *chunkp = zap_leaf_rehash_entry(l, chunk);
|
||||
|
||||
zap_leaf_phys(l)->l_hdr.lh_nentries++;
|
||||
|
||||
@@ -676,14 +656,13 @@ boolean_t
|
||||
zap_entry_normalization_conflict(zap_entry_handle_t *zeh, zap_name_t *zn,
|
||||
const char *name, zap_t *zap)
|
||||
{
|
||||
uint64_t chunk;
|
||||
struct zap_leaf_entry *le;
|
||||
boolean_t allocdzn = B_FALSE;
|
||||
|
||||
if (zap->zap_normflags == 0)
|
||||
return (B_FALSE);
|
||||
|
||||
for (chunk = *LEAF_HASH_ENTPTR(zeh->zeh_leaf, zeh->zeh_hash);
|
||||
for (uint16_t chunk = *LEAF_HASH_ENTPTR(zeh->zeh_leaf, zeh->zeh_hash);
|
||||
chunk != CHAIN_END; chunk = le->le_next) {
|
||||
le = ZAP_LEAF_ENTRY(zeh->zeh_leaf, chunk);
|
||||
if (le->le_hash != zeh->zeh_hash)
|
||||
@@ -766,14 +745,11 @@ zap_leaf_transfer_array(zap_leaf_t *l, uint16_t chunk, zap_leaf_t *nl)
|
||||
static void
|
||||
zap_leaf_transfer_entry(zap_leaf_t *l, int entry, zap_leaf_t *nl)
|
||||
{
|
||||
struct zap_leaf_entry *le, *nle;
|
||||
uint16_t chunk;
|
||||
|
||||
le = ZAP_LEAF_ENTRY(l, entry);
|
||||
struct zap_leaf_entry *le = ZAP_LEAF_ENTRY(l, entry);
|
||||
ASSERT3U(le->le_type, ==, ZAP_CHUNK_ENTRY);
|
||||
|
||||
chunk = zap_leaf_chunk_alloc(nl);
|
||||
nle = ZAP_LEAF_ENTRY(nl, chunk);
|
||||
uint16_t chunk = zap_leaf_chunk_alloc(nl);
|
||||
struct zap_leaf_entry *nle = ZAP_LEAF_ENTRY(nl, chunk);
|
||||
*nle = *le; /* structure assignment */
|
||||
|
||||
(void) zap_leaf_rehash_entry(nl, chunk);
|
||||
@@ -794,7 +770,6 @@ zap_leaf_transfer_entry(zap_leaf_t *l, int entry, zap_leaf_t *nl)
|
||||
void
|
||||
zap_leaf_split(zap_leaf_t *l, zap_leaf_t *nl, boolean_t sort)
|
||||
{
|
||||
int i;
|
||||
int bit = 64 - 1 - zap_leaf_phys(l)->l_hdr.lh_prefix_len;
|
||||
|
||||
/* set new prefix and prefix_len */
|
||||
@@ -821,7 +796,7 @@ zap_leaf_split(zap_leaf_t *l, zap_leaf_t *nl, boolean_t sort)
|
||||
* but this accesses memory more sequentially, and when we're
|
||||
* called, the block is usually pretty full.
|
||||
*/
|
||||
for (i = 0; i < ZAP_LEAF_NUMCHUNKS(l); i++) {
|
||||
for (int i = 0; i < ZAP_LEAF_NUMCHUNKS(l); i++) {
|
||||
struct zap_leaf_entry *le = ZAP_LEAF_ENTRY(l, i);
|
||||
if (le->le_type != ZAP_CHUNK_ENTRY)
|
||||
continue;
|
||||
@@ -836,9 +811,7 @@ zap_leaf_split(zap_leaf_t *l, zap_leaf_t *nl, boolean_t sort)
|
||||
void
|
||||
zap_leaf_stats(zap_t *zap, zap_leaf_t *l, zap_stats_t *zs)
|
||||
{
|
||||
int i, n;
|
||||
|
||||
n = zap_f_phys(zap)->zap_ptrtbl.zt_shift -
|
||||
int n = zap_f_phys(zap)->zap_ptrtbl.zt_shift -
|
||||
zap_leaf_phys(l)->l_hdr.lh_prefix_len;
|
||||
n = MIN(n, ZAP_HISTOGRAM_SIZE-1);
|
||||
zs->zs_leafs_with_2n_pointers[n]++;
|
||||
@@ -854,7 +827,7 @@ zap_leaf_stats(zap_t *zap, zap_leaf_t *l, zap_stats_t *zs)
|
||||
n = MIN(n, ZAP_HISTOGRAM_SIZE-1);
|
||||
zs->zs_blocks_n_tenths_full[n]++;
|
||||
|
||||
for (i = 0; i < ZAP_LEAF_HASH_NUMENTRIES(l); i++) {
|
||||
for (int i = 0; i < ZAP_LEAF_HASH_NUMENTRIES(l); i++) {
|
||||
int nentries = 0;
|
||||
int chunk = zap_leaf_phys(l)->l_hash[i];
|
||||
|
||||
|
||||
Reference in New Issue
Block a user