Lines Matching refs:si
62 static int __ocfs2_node_num_to_slot(struct ocfs2_slot_info *si,
65 static void ocfs2_invalidate_slot(struct ocfs2_slot_info *si, in ocfs2_invalidate_slot() argument
68 BUG_ON((slot_num < 0) || (slot_num >= si->si_num_slots)); in ocfs2_invalidate_slot()
69 si->si_slots[slot_num].sl_valid = 0; in ocfs2_invalidate_slot()
72 static void ocfs2_set_slot(struct ocfs2_slot_info *si, in ocfs2_set_slot() argument
75 BUG_ON((slot_num < 0) || (slot_num >= si->si_num_slots)); in ocfs2_set_slot()
77 si->si_slots[slot_num].sl_valid = 1; in ocfs2_set_slot()
78 si->si_slots[slot_num].sl_node_num = node_num; in ocfs2_set_slot()
82 static void ocfs2_update_slot_info_extended(struct ocfs2_slot_info *si) in ocfs2_update_slot_info_extended() argument
88 for (b = 0; b < si->si_blocks; b++) { in ocfs2_update_slot_info_extended()
89 se = (struct ocfs2_slot_map_extended *)si->si_bh[b]->b_data; in ocfs2_update_slot_info_extended()
91 (i < si->si_slots_per_block) && in ocfs2_update_slot_info_extended()
92 (slotno < si->si_num_slots); in ocfs2_update_slot_info_extended()
95 ocfs2_set_slot(si, slotno, in ocfs2_update_slot_info_extended()
98 ocfs2_invalidate_slot(si, slotno); in ocfs2_update_slot_info_extended()
107 static void ocfs2_update_slot_info_old(struct ocfs2_slot_info *si) in ocfs2_update_slot_info_old() argument
112 sm = (struct ocfs2_slot_map *)si->si_bh[0]->b_data; in ocfs2_update_slot_info_old()
114 for (i = 0; i < si->si_num_slots; i++) { in ocfs2_update_slot_info_old()
116 ocfs2_invalidate_slot(si, i); in ocfs2_update_slot_info_old()
118 ocfs2_set_slot(si, i, le16_to_cpu(sm->sm_slots[i])); in ocfs2_update_slot_info_old()
122 static void ocfs2_update_slot_info(struct ocfs2_slot_info *si) in ocfs2_update_slot_info() argument
128 if (si->si_extended) in ocfs2_update_slot_info()
129 ocfs2_update_slot_info_extended(si); in ocfs2_update_slot_info()
131 ocfs2_update_slot_info_old(si); in ocfs2_update_slot_info()
137 struct ocfs2_slot_info *si = osb->slot_info; in ocfs2_refresh_slot_info() local
139 if (si == NULL) in ocfs2_refresh_slot_info()
142 BUG_ON(si->si_blocks == 0); in ocfs2_refresh_slot_info()
143 BUG_ON(si->si_bh == NULL); in ocfs2_refresh_slot_info()
146 si->si_blocks); in ocfs2_refresh_slot_info()
153 ret = ocfs2_read_blocks(si->si_inode, -1, si->si_blocks, si->si_bh, in ocfs2_refresh_slot_info()
157 ocfs2_update_slot_info(si); in ocfs2_refresh_slot_info()
166 static void ocfs2_update_disk_slot_extended(struct ocfs2_slot_info *si, in ocfs2_update_disk_slot_extended() argument
170 int blkind = slot_num / si->si_slots_per_block; in ocfs2_update_disk_slot_extended()
171 int slotno = slot_num % si->si_slots_per_block; in ocfs2_update_disk_slot_extended()
174 BUG_ON(blkind >= si->si_blocks); in ocfs2_update_disk_slot_extended()
176 se = (struct ocfs2_slot_map_extended *)si->si_bh[blkind]->b_data; in ocfs2_update_disk_slot_extended()
177 se->se_slots[slotno].es_valid = si->si_slots[slot_num].sl_valid; in ocfs2_update_disk_slot_extended()
178 if (si->si_slots[slot_num].sl_valid) in ocfs2_update_disk_slot_extended()
180 cpu_to_le32(si->si_slots[slot_num].sl_node_num); in ocfs2_update_disk_slot_extended()
181 *bh = si->si_bh[blkind]; in ocfs2_update_disk_slot_extended()
184 static void ocfs2_update_disk_slot_old(struct ocfs2_slot_info *si, in ocfs2_update_disk_slot_old() argument
191 sm = (struct ocfs2_slot_map *)si->si_bh[0]->b_data; in ocfs2_update_disk_slot_old()
192 for (i = 0; i < si->si_num_slots; i++) { in ocfs2_update_disk_slot_old()
193 if (si->si_slots[i].sl_valid) in ocfs2_update_disk_slot_old()
195 cpu_to_le16(si->si_slots[i].sl_node_num); in ocfs2_update_disk_slot_old()
199 *bh = si->si_bh[0]; in ocfs2_update_disk_slot_old()
203 struct ocfs2_slot_info *si, in ocfs2_update_disk_slot() argument
210 if (si->si_extended) in ocfs2_update_disk_slot()
211 ocfs2_update_disk_slot_extended(si, slot_num, &bh); in ocfs2_update_disk_slot()
213 ocfs2_update_disk_slot_old(si, slot_num, &bh); in ocfs2_update_disk_slot()
216 status = ocfs2_write_block(osb, bh, si->si_inode); in ocfs2_update_disk_slot()
252 static int __ocfs2_node_num_to_slot(struct ocfs2_slot_info *si, in __ocfs2_node_num_to_slot() argument
257 for(i = 0; i < si->si_num_slots; i++) { in __ocfs2_node_num_to_slot()
258 if (si->si_slots[i].sl_valid && in __ocfs2_node_num_to_slot()
259 (node_num == si->si_slots[i].sl_node_num)) { in __ocfs2_node_num_to_slot()
268 static int __ocfs2_find_empty_slot(struct ocfs2_slot_info *si, in __ocfs2_find_empty_slot() argument
273 if ((preferred >= 0) && (preferred < si->si_num_slots)) { in __ocfs2_find_empty_slot()
274 if (!si->si_slots[preferred].sl_valid) { in __ocfs2_find_empty_slot()
280 for(i = 0; i < si->si_num_slots; i++) { in __ocfs2_find_empty_slot()
281 if (!si->si_slots[i].sl_valid) { in __ocfs2_find_empty_slot()
293 struct ocfs2_slot_info *si = osb->slot_info; in ocfs2_node_num_to_slot() local
296 slot = __ocfs2_node_num_to_slot(si, node_num); in ocfs2_node_num_to_slot()
305 struct ocfs2_slot_info *si = osb->slot_info; in ocfs2_slot_to_node_num_locked() local
312 if (!si->si_slots[slot_num].sl_valid) in ocfs2_slot_to_node_num_locked()
315 *node_num = si->si_slots[slot_num].sl_node_num; in ocfs2_slot_to_node_num_locked()
319 static void __ocfs2_free_slot_info(struct ocfs2_slot_info *si) in __ocfs2_free_slot_info() argument
323 if (si == NULL) in __ocfs2_free_slot_info()
326 if (si->si_inode) in __ocfs2_free_slot_info()
327 iput(si->si_inode); in __ocfs2_free_slot_info()
328 if (si->si_bh) { in __ocfs2_free_slot_info()
329 for (i = 0; i < si->si_blocks; i++) { in __ocfs2_free_slot_info()
330 if (si->si_bh[i]) { in __ocfs2_free_slot_info()
331 brelse(si->si_bh[i]); in __ocfs2_free_slot_info()
332 si->si_bh[i] = NULL; in __ocfs2_free_slot_info()
335 kfree(si->si_bh); in __ocfs2_free_slot_info()
338 kfree(si); in __ocfs2_free_slot_info()
343 struct ocfs2_slot_info *si = osb->slot_info; in ocfs2_clear_slot() local
345 if (si == NULL) in ocfs2_clear_slot()
349 ocfs2_invalidate_slot(si, slot_num); in ocfs2_clear_slot()
356 struct ocfs2_slot_info *si) in ocfs2_map_slot_buffers() argument
364 status = ocfs2_slot_map_physical_size(osb, si->si_inode, &bytes); in ocfs2_map_slot_buffers()
368 blocks = ocfs2_blocks_for_bytes(si->si_inode->i_sb, bytes); in ocfs2_map_slot_buffers()
370 si->si_blocks = blocks; in ocfs2_map_slot_buffers()
371 if (!si->si_blocks) in ocfs2_map_slot_buffers()
374 if (si->si_extended) in ocfs2_map_slot_buffers()
375 si->si_slots_per_block = in ocfs2_map_slot_buffers()
379 si->si_slots_per_block = osb->sb->s_blocksize / sizeof(__le16); in ocfs2_map_slot_buffers()
382 BUG_ON((osb->max_slots / si->si_slots_per_block) > blocks); in ocfs2_map_slot_buffers()
385 si->si_blocks, bytes); in ocfs2_map_slot_buffers()
387 si->si_bh = kzalloc(sizeof(struct buffer_head *) * si->si_blocks, in ocfs2_map_slot_buffers()
389 if (!si->si_bh) { in ocfs2_map_slot_buffers()
395 for (i = 0; i < si->si_blocks; i++) { in ocfs2_map_slot_buffers()
396 status = ocfs2_extent_map_get_blocks(si->si_inode, i, in ocfs2_map_slot_buffers()
407 status = ocfs2_read_blocks(si->si_inode, blkno, 1, &bh, in ocfs2_map_slot_buffers()
414 si->si_bh[i] = bh; in ocfs2_map_slot_buffers()
425 struct ocfs2_slot_info *si; in ocfs2_init_slot_info() local
427 si = kzalloc(sizeof(struct ocfs2_slot_info) + in ocfs2_init_slot_info()
430 if (!si) { in ocfs2_init_slot_info()
436 si->si_extended = ocfs2_uses_extended_slot_map(osb); in ocfs2_init_slot_info()
437 si->si_num_slots = osb->max_slots; in ocfs2_init_slot_info()
438 si->si_slots = (struct ocfs2_slot *)((char *)si + in ocfs2_init_slot_info()
449 si->si_inode = inode; in ocfs2_init_slot_info()
450 status = ocfs2_map_slot_buffers(osb, si); in ocfs2_init_slot_info()
456 osb->slot_info = (struct ocfs2_slot_info *)si; in ocfs2_init_slot_info()
458 if (status < 0 && si) in ocfs2_init_slot_info()
459 __ocfs2_free_slot_info(si); in ocfs2_init_slot_info()
466 struct ocfs2_slot_info *si = osb->slot_info; in ocfs2_free_slot_info() local
469 __ocfs2_free_slot_info(si); in ocfs2_free_slot_info()
476 struct ocfs2_slot_info *si; in ocfs2_find_slot() local
480 si = osb->slot_info; in ocfs2_find_slot()
483 ocfs2_update_slot_info(si); in ocfs2_find_slot()
489 slot = __ocfs2_node_num_to_slot(si, osb->node_num); in ocfs2_find_slot()
493 slot = __ocfs2_find_empty_slot(si, osb->preferred_slot); in ocfs2_find_slot()
504 ocfs2_set_slot(si, slot, osb->node_num); in ocfs2_find_slot()
510 status = ocfs2_update_disk_slot(osb, si, osb->slot_num); in ocfs2_find_slot()
522 struct ocfs2_slot_info *si = osb->slot_info; in ocfs2_put_slot() local
524 if (!si) in ocfs2_put_slot()
528 ocfs2_update_slot_info(si); in ocfs2_put_slot()
531 ocfs2_invalidate_slot(si, osb->slot_num); in ocfs2_put_slot()
535 status = ocfs2_update_disk_slot(osb, si, slot_num); in ocfs2_put_slot()