STATIC void xfs_fstrm_free_func( unsigned long ino, void *data) { fstrm_item_t *item = (fstrm_item_t *)data; xfs_inode_t *ip = item->ip; ASSERT(ip->i_ino == ino); xfs_iflags_clear(ip, XFS_IFILESTREAM); xfs_filestream_put_ag(ip->i_mount, item->ag); TRACE_FREE(ip->i_mount, ip, item->pip, item->ag, xfs_filestream_peek_ag(ip->i_mount, item->ag)); IRELE(ip); if (item->pip) IRELE(item->pip); kmem_zone_free(item_zone, item); }
/* xfs_fstrm_free_func(): callback for freeing cached stream items. */ STATIC void xfs_fstrm_free_func( unsigned long ino, void *data) { fstrm_item_t *item = (fstrm_item_t *)data; xfs_inode_t *ip = item->ip; int ref; ASSERT(ip->i_ino == ino); xfs_iflags_clear(ip, XFS_IFILESTREAM); /* Drop the reference taken on the AG when the item was added. */ ref = xfs_filestream_put_ag(ip->i_mount, item->ag); ASSERT(ref >= 0); TRACE_FREE(ip->i_mount, ip, item->pip, item->ag, xfs_filestream_peek_ag(ip->i_mount, item->ag)); /* * _xfs_filestream_update_ag() always takes a reference on the inode * itself, whether it's a file or a directory. Release it here. * This can result in the inode being freed and so we must * not hold any inode locks when freeing filesstreams objects * otherwise we can deadlock here. */ IRELE(ip); /* * In the case of a regular file, _xfs_filestream_update_ag() also * takes a ref on the parent inode to keep it in-core. Release that * too. */ if (item->pip) IRELE(item->pip); /* Finally, free the memory allocated for the item. */ kmem_zone_free(item_zone, item); }