aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXin LI <delphij@FreeBSD.org>2015-09-11 23:49:41 +0000
committerXin LI <delphij@FreeBSD.org>2015-09-11 23:49:41 +0000
commit86328befc69d84de5be0e6ebb3e974b840183110 (patch)
tree16156780095e1bc21f7f9d14388a8689f899003d
parent96bcca3330bd957a7781346e1ab41aebf949e717 (diff)
downloadsrc-86328befc69d84de5be0e6ebb3e974b840183110.tar.gz
src-86328befc69d84de5be0e6ebb3e974b840183110.zip
Notes
-rw-r--r--uts/common/fs/zfs/arc.c33
-rw-r--r--uts/common/fs/zfs/sys/arc.h15
2 files changed, 14 insertions, 34 deletions
diff --git a/uts/common/fs/zfs/arc.c b/uts/common/fs/zfs/arc.c
index 889d4e528eff..b3afc4ff2b74 100644
--- a/uts/common/fs/zfs/arc.c
+++ b/uts/common/fs/zfs/arc.c
@@ -748,6 +748,7 @@ typedef struct l2arc_buf_hdr {
uint64_t b_daddr; /* disk address, offset byte */
/* real alloc'd buffer size depending on b_compress applied */
int32_t b_asize;
+ uint8_t b_compress;
list_node_t b_l2node;
} l2arc_buf_hdr_t;
@@ -807,15 +808,6 @@ static arc_buf_hdr_t arc_eviction_hdr;
#define HDR_HAS_L1HDR(hdr) ((hdr)->b_flags & ARC_FLAG_HAS_L1HDR)
#define HDR_HAS_L2HDR(hdr) ((hdr)->b_flags & ARC_FLAG_HAS_L2HDR)
-/* For storing compression mode in b_flags */
-#define HDR_COMPRESS_OFFSET 24
-#define HDR_COMPRESS_NBITS 7
-
-#define HDR_GET_COMPRESS(hdr) ((enum zio_compress)BF32_GET(hdr->b_flags, \
- HDR_COMPRESS_OFFSET, HDR_COMPRESS_NBITS))
-#define HDR_SET_COMPRESS(hdr, cmp) BF32_SET(hdr->b_flags, \
- HDR_COMPRESS_OFFSET, HDR_COMPRESS_NBITS, (cmp))
-
/*
* Other sizes
*/
@@ -2040,7 +2032,7 @@ arc_buf_l2_cdata_free(arc_buf_hdr_t *hdr)
* separately compressed buffer, so there's nothing to free (it
* points to the same buffer as the arc_buf_t's b_data field).
*/
- if (HDR_GET_COMPRESS(hdr) == ZIO_COMPRESS_OFF) {
+ if (hdr->b_l2hdr.b_compress == ZIO_COMPRESS_OFF) {
hdr->b_l1hdr.b_tmp_cdata = NULL;
return;
}
@@ -2049,12 +2041,12 @@ arc_buf_l2_cdata_free(arc_buf_hdr_t *hdr)
* There's nothing to free since the buffer was all zero's and
* compressed to a zero length buffer.
*/
- if (HDR_GET_COMPRESS(hdr) == ZIO_COMPRESS_EMPTY) {
+ if (hdr->b_l2hdr.b_compress == ZIO_COMPRESS_EMPTY) {
ASSERT3P(hdr->b_l1hdr.b_tmp_cdata, ==, NULL);
return;
}
- ASSERT(L2ARC_IS_VALID_COMPRESS(HDR_GET_COMPRESS(hdr)));
+ ASSERT(L2ARC_IS_VALID_COMPRESS(hdr->b_l2hdr.b_compress));
arc_buf_free_on_write(hdr->b_l1hdr.b_tmp_cdata,
hdr->b_size, zio_data_buf_free);
@@ -4218,7 +4210,7 @@ top:
(vd = hdr->b_l2hdr.b_dev->l2ad_vdev) != NULL) {
devw = hdr->b_l2hdr.b_dev->l2ad_writing;
addr = hdr->b_l2hdr.b_daddr;
- b_compress = HDR_GET_COMPRESS(hdr);
+ b_compress = hdr->b_l2hdr.b_compress;
b_asize = hdr->b_l2hdr.b_asize;
/*
* Lock out device removal.
@@ -5684,6 +5676,8 @@ l2arc_read_done(zio_t *zio)
if (cb->l2rcb_compress != ZIO_COMPRESS_OFF)
l2arc_decompress_zio(zio, hdr, cb->l2rcb_compress);
ASSERT(zio->io_data != NULL);
+ ASSERT3U(zio->io_size, ==, hdr->b_size);
+ ASSERT3U(BP_GET_LSIZE(&cb->l2rcb_bp), ==, hdr->b_size);
/*
* Check this survived the L2ARC journey.
@@ -5720,7 +5714,7 @@ l2arc_read_done(zio_t *zio)
ASSERT(!pio || pio->io_child_type == ZIO_CHILD_LOGICAL);
zio_nowait(zio_read(pio, cb->l2rcb_spa, &cb->l2rcb_bp,
- buf->b_data, zio->io_size, arc_read_done, buf,
+ buf->b_data, hdr->b_size, arc_read_done, buf,
zio->io_priority, cb->l2rcb_flags, &cb->l2rcb_zb));
}
}
@@ -6018,7 +6012,7 @@ l2arc_write_buffers(spa_t *spa, l2arc_dev_t *dev, uint64_t target_sz,
* can't access without holding the ARC list locks
* (which we want to avoid during compression/writing).
*/
- HDR_SET_COMPRESS(hdr, ZIO_COMPRESS_OFF);
+ hdr->b_l2hdr.b_compress = ZIO_COMPRESS_OFF;
hdr->b_l2hdr.b_asize = hdr->b_size;
hdr->b_l1hdr.b_tmp_cdata = hdr->b_l1hdr.b_buf->b_data;
@@ -6208,7 +6202,7 @@ l2arc_compress_buf(arc_buf_hdr_t *hdr)
l2arc_buf_hdr_t *l2hdr = &hdr->b_l2hdr;
ASSERT(HDR_HAS_L1HDR(hdr));
- ASSERT(HDR_GET_COMPRESS(hdr) == ZIO_COMPRESS_OFF);
+ ASSERT3S(l2hdr->b_compress, ==, ZIO_COMPRESS_OFF);
ASSERT(hdr->b_l1hdr.b_tmp_cdata != NULL);
len = l2hdr->b_asize;
@@ -6226,7 +6220,7 @@ l2arc_compress_buf(arc_buf_hdr_t *hdr)
if (csize == 0) {
/* zero block, indicate that there's nothing to write */
zio_data_buf_free(cdata, len);
- HDR_SET_COMPRESS(hdr, ZIO_COMPRESS_EMPTY);
+ l2hdr->b_compress = ZIO_COMPRESS_EMPTY;
l2hdr->b_asize = 0;
hdr->b_l1hdr.b_tmp_cdata = NULL;
ARCSTAT_BUMP(arcstat_l2_compress_zeros);
@@ -6236,7 +6230,7 @@ l2arc_compress_buf(arc_buf_hdr_t *hdr)
* Compression succeeded, we'll keep the cdata around for
* writing and release it afterwards.
*/
- HDR_SET_COMPRESS(hdr, ZIO_COMPRESS_LZ4);
+ l2hdr->b_compress = ZIO_COMPRESS_LZ4;
l2hdr->b_asize = csize;
hdr->b_l1hdr.b_tmp_cdata = cdata;
ARCSTAT_BUMP(arcstat_l2_compress_successes);
@@ -6323,7 +6317,8 @@ l2arc_decompress_zio(zio_t *zio, arc_buf_hdr_t *hdr, enum zio_compress c)
static void
l2arc_release_cdata_buf(arc_buf_hdr_t *hdr)
{
- enum zio_compress comp = HDR_GET_COMPRESS(hdr);
+ ASSERT(HDR_HAS_L2HDR(hdr));
+ enum zio_compress comp = hdr->b_l2hdr.b_compress;
ASSERT(HDR_HAS_L1HDR(hdr));
ASSERT(comp == ZIO_COMPRESS_OFF || L2ARC_IS_VALID_COMPRESS(comp));
diff --git a/uts/common/fs/zfs/sys/arc.h b/uts/common/fs/zfs/sys/arc.h
index f9b527008be0..899b72114b99 100644
--- a/uts/common/fs/zfs/sys/arc.h
+++ b/uts/common/fs/zfs/sys/arc.h
@@ -88,21 +88,6 @@ typedef enum arc_flags
/* Flags specifying whether optional hdr struct fields are defined */
ARC_FLAG_HAS_L1HDR = 1 << 19,
ARC_FLAG_HAS_L2HDR = 1 << 20,
-
-
- /*
- * The arc buffer's compression mode is stored in the top 7 bits of the
- * flags field, so these dummy flags are included so that MDB can
- * interpret the enum properly.
- */
- ARC_FLAG_COMPRESS_0 = 1 << 24,
- ARC_FLAG_COMPRESS_1 = 1 << 25,
- ARC_FLAG_COMPRESS_2 = 1 << 26,
- ARC_FLAG_COMPRESS_3 = 1 << 27,
- ARC_FLAG_COMPRESS_4 = 1 << 28,
- ARC_FLAG_COMPRESS_5 = 1 << 29,
- ARC_FLAG_COMPRESS_6 = 1 << 30
-
} arc_flags_t;
struct arc_buf {