Lines Matching refs:si
46 static int __ocfs2_node_num_to_slot(struct ocfs2_slot_info *si,
49 static void ocfs2_invalidate_slot(struct ocfs2_slot_info *si,
52 BUG_ON((slot_num < 0) || (slot_num >= si->si_num_slots));
53 si->si_slots[slot_num].sl_valid = 0;
56 static void ocfs2_set_slot(struct ocfs2_slot_info *si,
59 BUG_ON((slot_num < 0) || (slot_num >= si->si_num_slots));
61 si->si_slots[slot_num].sl_valid = 1;
62 si->si_slots[slot_num].sl_node_num = node_num;
66 static void ocfs2_update_slot_info_extended(struct ocfs2_slot_info *si)
72 for (b = 0; b < si->si_blocks; b++) {
73 se = (struct ocfs2_slot_map_extended *)si->si_bh[b]->b_data;
75 (i < si->si_slots_per_block) &&
76 (slotno < si->si_num_slots);
79 ocfs2_set_slot(si, slotno,
82 ocfs2_invalidate_slot(si, slotno);
91 static void ocfs2_update_slot_info_old(struct ocfs2_slot_info *si)
96 sm = (struct ocfs2_slot_map *)si->si_bh[0]->b_data;
98 for (i = 0; i < si->si_num_slots; i++) {
100 ocfs2_invalidate_slot(si, i);
102 ocfs2_set_slot(si, i, le16_to_cpu(sm->sm_slots[i]));
106 static void ocfs2_update_slot_info(struct ocfs2_slot_info *si)
112 if (si->si_extended)
113 ocfs2_update_slot_info_extended(si);
115 ocfs2_update_slot_info_old(si);
121 struct ocfs2_slot_info *si = osb->slot_info;
123 if (si == NULL)
126 BUG_ON(si->si_blocks == 0);
127 BUG_ON(si->si_bh == NULL);
129 trace_ocfs2_refresh_slot_info(si->si_blocks);
132 * We pass -1 as blocknr because we expect all of si->si_bh to
136 ret = ocfs2_read_blocks(INODE_CACHE(si->si_inode), -1, si->si_blocks,
137 si->si_bh, OCFS2_BH_IGNORE_CACHE, NULL);
140 ocfs2_update_slot_info(si);
149 static void ocfs2_update_disk_slot_extended(struct ocfs2_slot_info *si,
153 int blkind = slot_num / si->si_slots_per_block;
154 int slotno = slot_num % si->si_slots_per_block;
157 BUG_ON(blkind >= si->si_blocks);
159 se = (struct ocfs2_slot_map_extended *)si->si_bh[blkind]->b_data;
160 se->se_slots[slotno].es_valid = si->si_slots[slot_num].sl_valid;
161 if (si->si_slots[slot_num].sl_valid)
163 cpu_to_le32(si->si_slots[slot_num].sl_node_num);
164 *bh = si->si_bh[blkind];
167 static void ocfs2_update_disk_slot_old(struct ocfs2_slot_info *si,
174 sm = (struct ocfs2_slot_map *)si->si_bh[0]->b_data;
175 for (i = 0; i < si->si_num_slots; i++) {
176 if (si->si_slots[i].sl_valid)
178 cpu_to_le16(si->si_slots[i].sl_node_num);
182 *bh = si->si_bh[0];
186 struct ocfs2_slot_info *si,
193 if (si->si_extended)
194 ocfs2_update_disk_slot_extended(si, slot_num, &bh);
196 ocfs2_update_disk_slot_old(si, slot_num, &bh);
199 status = ocfs2_write_block(osb, bh, INODE_CACHE(si->si_inode));
235 static int __ocfs2_node_num_to_slot(struct ocfs2_slot_info *si,
240 for(i = 0; i < si->si_num_slots; i++) {
241 if (si->si_slots[i].sl_valid &&
242 (node_num == si->si_slots[i].sl_node_num)) {
251 static int __ocfs2_find_empty_slot(struct ocfs2_slot_info *si,
256 if ((preferred >= 0) && (preferred < si->si_num_slots)) {
257 if (!si->si_slots[preferred].sl_valid) {
263 for(i = 0; i < si->si_num_slots; i++) {
264 if (!si->si_slots[i].sl_valid) {
276 struct ocfs2_slot_info *si = osb->slot_info;
279 slot = __ocfs2_node_num_to_slot(si, node_num);
288 struct ocfs2_slot_info *si = osb->slot_info;
295 if (!si->si_slots[slot_num].sl_valid)
298 *node_num = si->si_slots[slot_num].sl_node_num;
302 static void __ocfs2_free_slot_info(struct ocfs2_slot_info *si)
306 if (si == NULL)
309 iput(si->si_inode);
310 if (si->si_bh) {
311 for (i = 0; i < si->si_blocks; i++) {
312 if (si->si_bh[i]) {
313 brelse(si->si_bh[i]);
314 si->si_bh[i] = NULL;
317 kfree(si->si_bh);
320 kfree(si);
325 struct ocfs2_slot_info *si = osb->slot_info;
327 if (si == NULL)
331 ocfs2_invalidate_slot(si, slot_num);
338 struct ocfs2_slot_info *si)
346 status = ocfs2_slot_map_physical_size(osb, si->si_inode, &bytes);
350 blocks = ocfs2_blocks_for_bytes(si->si_inode->i_sb, bytes);
352 si->si_blocks = blocks;
353 if (!si->si_blocks)
356 if (si->si_extended)
357 si->si_slots_per_block =
361 si->si_slots_per_block = osb->sb->s_blocksize / sizeof(__le16);
364 BUG_ON((osb->max_slots / si->si_slots_per_block) > blocks);
366 trace_ocfs2_map_slot_buffers(bytes, si->si_blocks);
368 si->si_bh = kcalloc(si->si_blocks, sizeof(struct buffer_head *),
370 if (!si->si_bh) {
376 for (i = 0; i < si->si_blocks; i++) {
377 status = ocfs2_extent_map_get_blocks(si->si_inode, i,
387 status = ocfs2_read_blocks(INODE_CACHE(si->si_inode), blkno,
394 si->si_bh[i] = bh;
405 struct ocfs2_slot_info *si;
407 si = kzalloc(struct_size(si, si_slots, osb->max_slots), GFP_KERNEL);
408 if (!si) {
414 si->si_extended = ocfs2_uses_extended_slot_map(osb);
415 si->si_num_slots = osb->max_slots;
425 si->si_inode = inode;
426 status = ocfs2_map_slot_buffers(osb, si);
432 osb->slot_info = (struct ocfs2_slot_info *)si;
435 __ocfs2_free_slot_info(si);
442 struct ocfs2_slot_info *si = osb->slot_info;
445 __ocfs2_free_slot_info(si);
452 struct ocfs2_slot_info *si;
454 si = osb->slot_info;
457 ocfs2_update_slot_info(si);
463 slot = __ocfs2_node_num_to_slot(si, osb->node_num);
467 slot = __ocfs2_find_empty_slot(si, osb->preferred_slot);
478 ocfs2_set_slot(si, slot, osb->node_num);
484 status = ocfs2_update_disk_slot(osb, si, osb->slot_num);
492 ocfs2_invalidate_slot(si, osb->slot_num);
504 struct ocfs2_slot_info *si = osb->slot_info;
506 if (!si)
510 ocfs2_update_slot_info(si);
513 ocfs2_invalidate_slot(si, osb->slot_num);
517 status = ocfs2_update_disk_slot(osb, si, slot_num);