Author: delphij
Date: Tue Jul  1 08:28:49 2014
New Revision: 268085
URL: http://svnweb.freebsd.org/changeset/base/268085

Log:
  MFV r267569:
  
  4897 Space accounting mismatch in L2ARC/zpool
  
  illumos/illumos-dist@3038a2b421b40dc5ac11cd88423696618584f85a
  
  MFC after:    2 weeks

Modified:
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
Directory Properties:
  head/sys/cddl/contrib/opensolaris/   (props changed)

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c   Tue Jul  1 
08:20:34 2014        (r268084)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c   Tue Jul  1 
08:28:49 2014        (r268085)
@@ -22,7 +22,7 @@
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2013 by Delphix. All rights reserved.
  * Copyright (c) 2014 by Saso Kiselkov. All rights reserved.
- * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
  */
 
 /*
@@ -1746,6 +1746,8 @@ arc_hdr_destroy(arc_buf_hdr_t *hdr)
                        list_remove(l2hdr->b_dev->l2ad_buflist, hdr);
                        ARCSTAT_INCR(arcstat_l2_size, -hdr->b_size);
                        ARCSTAT_INCR(arcstat_l2_asize, -l2hdr->b_asize);
+                       vdev_space_update(l2hdr->b_dev->l2ad_vdev,
+                           -l2hdr->b_asize, 0, 0);
                        kmem_free(l2hdr, sizeof (l2arc_buf_hdr_t));
                        if (hdr->b_state == arc_l2c_only)
                                l2arc_hdr_stat_remove();
@@ -3699,6 +3701,8 @@ arc_release(arc_buf_t *buf, void *tag)
 
        if (l2hdr) {
                ARCSTAT_INCR(arcstat_l2_asize, -l2hdr->b_asize);
+               vdev_space_update(l2hdr->b_dev->l2ad_vdev,
+                   -l2hdr->b_asize, 0, 0);
                trim_map_free(l2hdr->b_dev->l2ad_vdev, l2hdr->b_daddr,
                    hdr->b_size, 0);
                kmem_free(l2hdr, sizeof (l2arc_buf_hdr_t));
@@ -4600,6 +4604,7 @@ l2arc_write_done(zio_t *zio)
        arc_buf_hdr_t *head, *ab, *ab_prev;
        l2arc_buf_hdr_t *abl2;
        kmutex_t *hash_lock;
+       int64_t bytes_dropped = 0;
 
        cb = zio->io_private;
        ASSERT(cb != NULL);
@@ -4647,6 +4652,7 @@ l2arc_write_done(zio_t *zio)
                         */
                        list_remove(buflist, ab);
                        ARCSTAT_INCR(arcstat_l2_asize, -abl2->b_asize);
+                       bytes_dropped += abl2->b_asize;
                        ab->b_l2hdr = NULL;
                        trim_map_free(abl2->b_dev->l2ad_vdev, abl2->b_daddr,
                            ab->b_size, 0);
@@ -4667,6 +4673,8 @@ l2arc_write_done(zio_t *zio)
        kmem_cache_free(hdr_cache, head);
        mutex_exit(&l2arc_buflist_mtx);
 
+       vdev_space_update(dev->l2ad_vdev, -bytes_dropped, 0, 0);
+
        l2arc_do_free_on_write();
 
        kmem_free(cb, sizeof (l2arc_write_callback_t));
@@ -4806,6 +4814,7 @@ l2arc_evict(l2arc_dev_t *dev, uint64_t d
        arc_buf_hdr_t *ab, *ab_prev;
        kmutex_t *hash_lock;
        uint64_t taddr;
+       int64_t bytes_evicted = 0;
 
        buflist = dev->l2ad_buflist;
 
@@ -4904,6 +4913,7 @@ top:
                        if (ab->b_l2hdr != NULL) {
                                abl2 = ab->b_l2hdr;
                                ARCSTAT_INCR(arcstat_l2_asize, -abl2->b_asize);
+                               bytes_evicted += abl2->b_asize;
                                ab->b_l2hdr = NULL;
                                kmem_free(abl2, sizeof (l2arc_buf_hdr_t));
                                ARCSTAT_INCR(arcstat_l2_size, -ab->b_size);
@@ -4920,7 +4930,7 @@ top:
        }
        mutex_exit(&l2arc_buflist_mtx);
 
-       vdev_space_update(dev->l2ad_vdev, -(taddr - dev->l2ad_evict), 0, 0);
+       vdev_space_update(dev->l2ad_vdev, -bytes_evicted, 0, 0);
        dev->l2ad_evict = taddr;
 }
 
@@ -5173,15 +5183,13 @@ l2arc_write_buffers(spa_t *spa, l2arc_de
        ARCSTAT_INCR(arcstat_l2_write_bytes, write_asize);
        ARCSTAT_INCR(arcstat_l2_size, write_sz);
        ARCSTAT_INCR(arcstat_l2_asize, write_asize);
-       vdev_space_update(dev->l2ad_vdev, write_psize, 0, 0);
+       vdev_space_update(dev->l2ad_vdev, write_asize, 0, 0);
 
        /*
         * Bump device hand to the device start if it is approaching the end.
         * l2arc_evict() will already have evicted ahead for this case.
         */
        if (dev->l2ad_hand >= (dev->l2ad_end - target_sz)) {
-               vdev_space_update(dev->l2ad_vdev,
-                   dev->l2ad_end - dev->l2ad_hand, 0, 0);
                dev->l2ad_hand = dev->l2ad_start;
                dev->l2ad_evict = dev->l2ad_start;
                dev->l2ad_first = B_FALSE;
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to