Lines Matching full:si
44 static int __ocfs2_node_num_to_slot(struct ocfs2_slot_info *si,
47 static void ocfs2_invalidate_slot(struct ocfs2_slot_info *si, in ocfs2_invalidate_slot() argument
50 BUG_ON((slot_num < 0) || (slot_num >= si->si_num_slots)); in ocfs2_invalidate_slot()
51 si->si_slots[slot_num].sl_valid = 0; in ocfs2_invalidate_slot()
54 static void ocfs2_set_slot(struct ocfs2_slot_info *si, in ocfs2_set_slot() argument
57 BUG_ON((slot_num < 0) || (slot_num >= si->si_num_slots)); in ocfs2_set_slot()
59 si->si_slots[slot_num].sl_valid = 1; in ocfs2_set_slot()
60 si->si_slots[slot_num].sl_node_num = node_num; in ocfs2_set_slot()
64 static void ocfs2_update_slot_info_extended(struct ocfs2_slot_info *si) in ocfs2_update_slot_info_extended() argument
70 for (b = 0; b < si->si_blocks; b++) { in ocfs2_update_slot_info_extended()
71 se = (struct ocfs2_slot_map_extended *)si->si_bh[b]->b_data; in ocfs2_update_slot_info_extended()
73 (i < si->si_slots_per_block) && in ocfs2_update_slot_info_extended()
74 (slotno < si->si_num_slots); in ocfs2_update_slot_info_extended()
77 ocfs2_set_slot(si, slotno, in ocfs2_update_slot_info_extended()
80 ocfs2_invalidate_slot(si, slotno); in ocfs2_update_slot_info_extended()
89 static void ocfs2_update_slot_info_old(struct ocfs2_slot_info *si) in ocfs2_update_slot_info_old() argument
94 sm = (struct ocfs2_slot_map *)si->si_bh[0]->b_data; in ocfs2_update_slot_info_old()
96 for (i = 0; i < si->si_num_slots; i++) { in ocfs2_update_slot_info_old()
98 ocfs2_invalidate_slot(si, i); in ocfs2_update_slot_info_old()
100 ocfs2_set_slot(si, i, le16_to_cpu(sm->sm_slots[i])); in ocfs2_update_slot_info_old()
104 static void ocfs2_update_slot_info(struct ocfs2_slot_info *si) in ocfs2_update_slot_info() argument
110 if (si->si_extended) in ocfs2_update_slot_info()
111 ocfs2_update_slot_info_extended(si); in ocfs2_update_slot_info()
113 ocfs2_update_slot_info_old(si); in ocfs2_update_slot_info()
119 struct ocfs2_slot_info *si = osb->slot_info; in ocfs2_refresh_slot_info() local
121 if (si == NULL) in ocfs2_refresh_slot_info()
124 BUG_ON(si->si_blocks == 0); in ocfs2_refresh_slot_info()
125 BUG_ON(si->si_bh == NULL); in ocfs2_refresh_slot_info()
127 trace_ocfs2_refresh_slot_info(si->si_blocks); in ocfs2_refresh_slot_info()
130 * We pass -1 as blocknr because we expect all of si->si_bh to in ocfs2_refresh_slot_info()
134 ret = ocfs2_read_blocks(INODE_CACHE(si->si_inode), -1, si->si_blocks, in ocfs2_refresh_slot_info()
135 si->si_bh, OCFS2_BH_IGNORE_CACHE, NULL); in ocfs2_refresh_slot_info()
138 ocfs2_update_slot_info(si); in ocfs2_refresh_slot_info()
147 static void ocfs2_update_disk_slot_extended(struct ocfs2_slot_info *si, in ocfs2_update_disk_slot_extended() argument
151 int blkind = slot_num / si->si_slots_per_block; in ocfs2_update_disk_slot_extended()
152 int slotno = slot_num % si->si_slots_per_block; in ocfs2_update_disk_slot_extended()
155 BUG_ON(blkind >= si->si_blocks); in ocfs2_update_disk_slot_extended()
157 se = (struct ocfs2_slot_map_extended *)si->si_bh[blkind]->b_data; in ocfs2_update_disk_slot_extended()
158 se->se_slots[slotno].es_valid = si->si_slots[slot_num].sl_valid; in ocfs2_update_disk_slot_extended()
159 if (si->si_slots[slot_num].sl_valid) in ocfs2_update_disk_slot_extended()
161 cpu_to_le32(si->si_slots[slot_num].sl_node_num); in ocfs2_update_disk_slot_extended()
162 *bh = si->si_bh[blkind]; in ocfs2_update_disk_slot_extended()
165 static void ocfs2_update_disk_slot_old(struct ocfs2_slot_info *si, in ocfs2_update_disk_slot_old() argument
172 sm = (struct ocfs2_slot_map *)si->si_bh[0]->b_data; in ocfs2_update_disk_slot_old()
173 for (i = 0; i < si->si_num_slots; i++) { in ocfs2_update_disk_slot_old()
174 if (si->si_slots[i].sl_valid) in ocfs2_update_disk_slot_old()
176 cpu_to_le16(si->si_slots[i].sl_node_num); in ocfs2_update_disk_slot_old()
180 *bh = si->si_bh[0]; in ocfs2_update_disk_slot_old()
184 struct ocfs2_slot_info *si, in ocfs2_update_disk_slot() argument
191 if (si->si_extended) in ocfs2_update_disk_slot()
192 ocfs2_update_disk_slot_extended(si, slot_num, &bh); in ocfs2_update_disk_slot()
194 ocfs2_update_disk_slot_old(si, slot_num, &bh); in ocfs2_update_disk_slot()
197 status = ocfs2_write_block(osb, bh, INODE_CACHE(si->si_inode)); in ocfs2_update_disk_slot()
233 static int __ocfs2_node_num_to_slot(struct ocfs2_slot_info *si, in __ocfs2_node_num_to_slot() argument
238 for(i = 0; i < si->si_num_slots; i++) { in __ocfs2_node_num_to_slot()
239 if (si->si_slots[i].sl_valid && in __ocfs2_node_num_to_slot()
240 (node_num == si->si_slots[i].sl_node_num)) { in __ocfs2_node_num_to_slot()
249 static int __ocfs2_find_empty_slot(struct ocfs2_slot_info *si, in __ocfs2_find_empty_slot() argument
254 if ((preferred >= 0) && (preferred < si->si_num_slots)) { in __ocfs2_find_empty_slot()
255 if (!si->si_slots[preferred].sl_valid) { in __ocfs2_find_empty_slot()
261 for(i = 0; i < si->si_num_slots; i++) { in __ocfs2_find_empty_slot()
262 if (!si->si_slots[i].sl_valid) { in __ocfs2_find_empty_slot()
274 struct ocfs2_slot_info *si = osb->slot_info; in ocfs2_node_num_to_slot() local
277 slot = __ocfs2_node_num_to_slot(si, node_num); in ocfs2_node_num_to_slot()
286 struct ocfs2_slot_info *si = osb->slot_info; in ocfs2_slot_to_node_num_locked() local
293 if (!si->si_slots[slot_num].sl_valid) in ocfs2_slot_to_node_num_locked()
296 *node_num = si->si_slots[slot_num].sl_node_num; in ocfs2_slot_to_node_num_locked()
300 static void __ocfs2_free_slot_info(struct ocfs2_slot_info *si) in __ocfs2_free_slot_info() argument
304 if (si == NULL) in __ocfs2_free_slot_info()
307 iput(si->si_inode); in __ocfs2_free_slot_info()
308 if (si->si_bh) { in __ocfs2_free_slot_info()
309 for (i = 0; i < si->si_blocks; i++) { in __ocfs2_free_slot_info()
310 if (si->si_bh[i]) { in __ocfs2_free_slot_info()
311 brelse(si->si_bh[i]); in __ocfs2_free_slot_info()
312 si->si_bh[i] = NULL; in __ocfs2_free_slot_info()
315 kfree(si->si_bh); in __ocfs2_free_slot_info()
318 kfree(si); in __ocfs2_free_slot_info()
323 struct ocfs2_slot_info *si = osb->slot_info; in ocfs2_clear_slot() local
325 if (si == NULL) in ocfs2_clear_slot()
329 ocfs2_invalidate_slot(si, slot_num); in ocfs2_clear_slot()
336 struct ocfs2_slot_info *si) in ocfs2_map_slot_buffers() argument
344 status = ocfs2_slot_map_physical_size(osb, si->si_inode, &bytes); in ocfs2_map_slot_buffers()
348 blocks = ocfs2_blocks_for_bytes(si->si_inode->i_sb, bytes); in ocfs2_map_slot_buffers()
350 si->si_blocks = blocks; in ocfs2_map_slot_buffers()
351 if (!si->si_blocks) in ocfs2_map_slot_buffers()
354 if (si->si_extended) in ocfs2_map_slot_buffers()
355 si->si_slots_per_block = in ocfs2_map_slot_buffers()
359 si->si_slots_per_block = osb->sb->s_blocksize / sizeof(__le16); in ocfs2_map_slot_buffers()
362 BUG_ON((osb->max_slots / si->si_slots_per_block) > blocks); in ocfs2_map_slot_buffers()
364 trace_ocfs2_map_slot_buffers(bytes, si->si_blocks); in ocfs2_map_slot_buffers()
366 si->si_bh = kcalloc(si->si_blocks, sizeof(struct buffer_head *), in ocfs2_map_slot_buffers()
368 if (!si->si_bh) { in ocfs2_map_slot_buffers()
374 for (i = 0; i < si->si_blocks; i++) { in ocfs2_map_slot_buffers()
375 status = ocfs2_extent_map_get_blocks(si->si_inode, i, in ocfs2_map_slot_buffers()
385 status = ocfs2_read_blocks(INODE_CACHE(si->si_inode), blkno, in ocfs2_map_slot_buffers()
392 si->si_bh[i] = bh; in ocfs2_map_slot_buffers()
403 struct ocfs2_slot_info *si; in ocfs2_init_slot_info() local
405 si = kzalloc(struct_size(si, si_slots, osb->max_slots), GFP_KERNEL); in ocfs2_init_slot_info()
406 if (!si) { in ocfs2_init_slot_info()
412 si->si_extended = ocfs2_uses_extended_slot_map(osb); in ocfs2_init_slot_info()
413 si->si_num_slots = osb->max_slots; in ocfs2_init_slot_info()
423 si->si_inode = inode; in ocfs2_init_slot_info()
424 status = ocfs2_map_slot_buffers(osb, si); in ocfs2_init_slot_info()
430 osb->slot_info = (struct ocfs2_slot_info *)si; in ocfs2_init_slot_info()
433 __ocfs2_free_slot_info(si); in ocfs2_init_slot_info()
440 struct ocfs2_slot_info *si = osb->slot_info; in ocfs2_free_slot_info() local
443 __ocfs2_free_slot_info(si); in ocfs2_free_slot_info()
450 struct ocfs2_slot_info *si; in ocfs2_find_slot() local
452 si = osb->slot_info; in ocfs2_find_slot()
455 ocfs2_update_slot_info(si); in ocfs2_find_slot()
461 slot = __ocfs2_node_num_to_slot(si, osb->node_num); in ocfs2_find_slot()
465 slot = __ocfs2_find_empty_slot(si, osb->preferred_slot); in ocfs2_find_slot()
476 ocfs2_set_slot(si, slot, osb->node_num); in ocfs2_find_slot()
482 status = ocfs2_update_disk_slot(osb, si, osb->slot_num); in ocfs2_find_slot()
490 ocfs2_invalidate_slot(si, osb->slot_num); in ocfs2_find_slot()
502 struct ocfs2_slot_info *si = osb->slot_info; in ocfs2_put_slot() local
504 if (!si) in ocfs2_put_slot()
508 ocfs2_update_slot_info(si); in ocfs2_put_slot()
511 ocfs2_invalidate_slot(si, osb->slot_num); in ocfs2_put_slot()
515 status = ocfs2_update_disk_slot(osb, si, slot_num); in ocfs2_put_slot()