/* * clear an AFS inode */ void afs_clear_inode(struct inode *inode) { struct afs_vnode *vnode; vnode = AFS_FS_I(inode); _enter("ino=%lu { vn=%08x v=%u x=%u t=%u }", inode->i_ino, vnode->fid.vnode, vnode->cb_version, vnode->cb_expiry, vnode->cb_type ); BUG_ON(inode->i_ino != vnode->fid.vnode); afs_vnode_give_up_callback(vnode); #ifdef AFS_CACHING_SUPPORT cachefs_relinquish_cookie(vnode->cache, 0); vnode->cache = NULL; #endif _leave(""); } /* end afs_clear_inode() */
/* * destroy a volume record */ void afs_put_volume(struct afs_volume *volume) { struct afs_vlocation *vlocation; int loop; if (!volume) return; _enter("%p", volume); ASSERTCMP(atomic_read(&volume->usage), >, 0); vlocation = volume->vlocation; /* to prevent a race, the decrement and the dequeue must be effectively * atomic */ down_write(&vlocation->cell->vl_sem); if (likely(!atomic_dec_and_test(&volume->usage))) { up_write(&vlocation->cell->vl_sem); _leave(""); return; } vlocation->vols[volume->type] = NULL; up_write(&vlocation->cell->vl_sem); /* finish cleaning up the volume */ #ifdef AFS_CACHING_SUPPORT cachefs_relinquish_cookie(volume->cache, 0); #endif afs_put_vlocation(vlocation); for (loop = volume->nservers - 1; loop >= 0; loop--) afs_put_server(volume->servers[loop]); kfree(volume); _leave(" [destroyed]"); }