void ocfs2_put_slot(struct ocfs2_super *osb) { int status; struct ocfs2_slot_info *si = osb->slot_info; if (!si) return; ocfs2_update_slot_info(si); spin_lock(&si->si_lock); __ocfs2_fill_slot(si, osb->slot_num, OCFS2_INVALID_SLOT); osb->slot_num = OCFS2_INVALID_SLOT; spin_unlock(&si->si_lock); status = ocfs2_update_disk_slots(osb, si); if (status < 0) { mlog_errno(status); goto bail; } bail: osb->slot_info = NULL; ocfs2_free_slot_info(si); }
void ocfs2_put_slot(struct ocfs2_super *osb) { int status, slot_num; struct ocfs2_slot_info *si = osb->slot_info; if (!si) return; spin_lock(&osb->osb_lock); ocfs2_update_slot_info(si); slot_num = osb->slot_num; ocfs2_invalidate_slot(si, osb->slot_num); osb->slot_num = OCFS2_INVALID_SLOT; spin_unlock(&osb->osb_lock); status = ocfs2_update_disk_slot(osb, si, slot_num); if (status < 0) { mlog_errno(status); goto bail; } bail: ocfs2_free_slot_info(osb); }
int ocfs2_init_slot_info(struct ocfs2_super *osb) { int status, i; u64 blkno; struct inode *inode = NULL; struct buffer_head *bh = NULL; struct ocfs2_slot_info *si; si = kzalloc(sizeof(struct ocfs2_slot_info), GFP_KERNEL); if (!si) { status = -ENOMEM; mlog_errno(status); goto bail; } spin_lock_init(&si->si_lock); si->si_num_slots = osb->max_slots; si->si_size = OCFS2_MAX_SLOTS; for(i = 0; i < si->si_num_slots; i++) si->si_global_node_nums[i] = OCFS2_INVALID_SLOT; inode = ocfs2_get_system_file_inode(osb, SLOT_MAP_SYSTEM_INODE, OCFS2_INVALID_SLOT); if (!inode) { status = -EINVAL; mlog_errno(status); goto bail; } status = ocfs2_extent_map_get_blocks(inode, 0ULL, 1, &blkno, NULL); if (status < 0) { mlog_errno(status); goto bail; } status = ocfs2_read_block(osb, blkno, &bh, 0, inode); if (status < 0) { mlog_errno(status); goto bail; } si->si_inode = inode; si->si_bh = bh; osb->slot_info = si; bail: if (status < 0 && si) ocfs2_free_slot_info(si); return status; }