<dec f='src/src/sys/ufs/ffs/ffs_extern.h' l='155' type='int ffs_snapblkfree(struct fs * , struct vnode * , daddr_t , long , ino_t )'/>
<use f='src/src/sys/ufs/ffs/ffs_alloc.c' l='1702' u='c' c='ffs_blkfree'/>
<use f='src/src/sys/ufs/ffs/ffs_snapshot.c' l='1490' u='c' c='ffs_snapremove'/>
<use f='src/src/sys/ufs/ffs/ffs_snapshot.c' l='1511' u='c' c='ffs_snapremove'/>
<def f='src/src/sys/ufs/ffs/ffs_snapshot.c' l='1552' ll='1727' type='int ffs_snapblkfree(struct fs * fs, struct vnode * devvp, daddr_t bno, long size, ino_t inum)'/>
<doc f='src/src/sys/ufs/ffs/ffs_snapshot.c' l='1534'>/*
 * Notification that a block is being freed. Return zero if the free
 * should be allowed to proceed. Return non-zero if the snapshot file
 * wants to claim the block. The block will be claimed if it is an
 * uncopied part of one of the snapshots. It will be freed if it is
 * either a BLK_NOCOPY or has already been copied in all of the snapshots.
 * If a fragment is being freed, then all snapshots that care about
 * it must make a copy since a snapshot file can only claim full sized
 * blocks. Note that if more than one snapshot file maps the block,
 * we can pick one at random to claim it. Since none of the snapshots
 * can change, we are assurred that they will all see the same unmodified
 * image. When deleting a snapshot file (see ffs_snapremove above), we
 * must push any of these claimed blocks to one of the other snapshots
 * that maps it. These claimed blocks are easily identified as they will
 * have a block number equal to their logical block number within the
 * snapshot. A copied block can never have this property because they
 * must always have been allocated from a BLK_NOCOPY location.
 */</doc>
