Author: delphij
Date: Mon Jun 24 05:03:42 2013
New Revision: 252142
URL: http://svnweb.freebsd.org/changeset/base/252142

Log:
  MFC r251520: MFV r251519:
  
   * Illumos ZFS issue #3805 arc shouldn't cache freed blocks

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

Modified: stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
==============================================================================
--- stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c       Mon Jun 
24 05:01:13 2013        (r252141)
+++ stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c       Mon Jun 
24 05:03:42 2013        (r252142)
@@ -3372,6 +3372,34 @@ arc_set_callback(arc_buf_t *buf, arc_evi
 }
 
 /*
+ * Notify the arc that a block was freed, and thus will never be used again.
+ */
+void
+arc_freed(spa_t *spa, const blkptr_t *bp)
+{
+       arc_buf_hdr_t *hdr;
+       kmutex_t *hash_lock;
+       uint64_t guid = spa_load_guid(spa);
+
+       hdr = buf_hash_find(guid, BP_IDENTITY(bp), BP_PHYSICAL_BIRTH(bp),
+           &hash_lock);
+       if (hdr == NULL)
+               return;
+       if (HDR_BUF_AVAILABLE(hdr)) {
+               arc_buf_t *buf = hdr->b_buf;
+               add_reference(hdr, hash_lock, FTAG);
+               hdr->b_flags &= ~ARC_BUF_AVAILABLE;
+               mutex_exit(hash_lock);
+
+               arc_release(buf, FTAG);
+               (void) arc_buf_remove_ref(buf, FTAG);
+       } else {
+               mutex_exit(hash_lock);
+       }
+
+}
+
+/*
  * This is used by the DMU to let the ARC know that a buffer is
  * being evicted, so the ARC should clean up.  If this arc buf
  * is not yet in the evicted state, it will be put there.

Modified: stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/arc.h
==============================================================================
--- stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/arc.h   Mon Jun 
24 05:01:13 2013        (r252141)
+++ stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/arc.h   Mon Jun 
24 05:03:42 2013        (r252142)
@@ -20,7 +20,7 @@
  */
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2012 by Delphix. All rights reserved.
+ * Copyright (c) 2013 by Delphix. All rights reserved.
  * Copyright (c) 2013 by Saso Kiselkov. All rights reserved.
  */
 
@@ -110,6 +110,7 @@ zio_t *arc_write(zio_t *pio, spa_t *spa,
     blkptr_t *bp, arc_buf_t *buf, boolean_t l2arc, boolean_t l2arc_compress,
     const zio_prop_t *zp, arc_done_func_t *ready, arc_done_func_t *done,
     void *priv, int priority, int zio_flags, const zbookmark_t *zb);
+void arc_freed(spa_t *spa, const blkptr_t *bp);
 
 void arc_set_callback(arc_buf_t *buf, arc_evict_func_t *func, void *priv);
 int arc_buf_evict(arc_buf_t *buf);

Modified: stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
==============================================================================
--- stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c       Mon Jun 
24 05:01:13 2013        (r252141)
+++ stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c       Mon Jun 
24 05:03:42 2013        (r252142)
@@ -772,6 +772,7 @@ zio_free_sync(zio_t *pio, spa_t *spa, ui
        ASSERT(spa_sync_pass(spa) < zfs_sync_pass_deferred_free);
 
        metaslab_check_free(spa, bp);
+       arc_freed(spa, bp);
 
        zio = zio_create(pio, spa, txg, bp, NULL, size,
            NULL, NULL, ZIO_TYPE_FREE, ZIO_PRIORITY_FREE, flags,
_______________________________________________
svn-src-stable-9@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-stable-9
To unsubscribe, send any mail to "svn-src-stable-9-unsubscr...@freebsd.org"

Reply via email to