Skip to content

Commit

Permalink
3805 arc shouldn't cache freed blocks
Browse files Browse the repository at this point in the history
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: Christopher Siden <christopher.siden@delphix.com>
Reviewed by: Richard Elling <richard.elling@dey-sys.com>
Reviewed by: Will Andrews <will@firepipe.net>
Approved by: Dan McDonald <danmcd@nexenta.com>
  • Loading branch information
ahrens authored and Christopher Siden committed Jun 8, 2013
1 parent 480bbe0 commit 6e6d586
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 1 deletion.
28 changes: 28 additions & 0 deletions usr/src/uts/common/fs/zfs/arc.c
Expand Up @@ -3110,6 +3110,34 @@ arc_set_callback(arc_buf_t *buf, arc_evict_func_t *func, void *private)
buf->b_private = private;
}

/*
* 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
Expand Down
3 changes: 2 additions & 1 deletion usr/src/uts/common/fs/zfs/sys/arc.h
Expand Up @@ -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.
*/

Expand Down Expand Up @@ -110,6 +110,7 @@ zio_t *arc_write(zio_t *pio, spa_t *spa, uint64_t txg,
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 *private, 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 *private);
int arc_buf_evict(arc_buf_t *buf);
Expand Down
1 change: 1 addition & 0 deletions usr/src/uts/common/fs/zfs/zio.c
Expand Up @@ -715,6 +715,7 @@ zio_free_sync(zio_t *pio, spa_t *spa, uint64_t txg, const blkptr_t *bp,
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, BP_GET_PSIZE(bp),
NULL, NULL, ZIO_TYPE_FREE, ZIO_PRIORITY_FREE, flags,
Expand Down

0 comments on commit 6e6d586

Please sign in to comment.