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