Lines Matching refs:be
27 ext_tree_prev(struct pnfs_block_extent *be) in ext_tree_prev() argument
29 struct rb_node *node = rb_prev(&be->be_node); in ext_tree_prev()
34 ext_tree_next(struct pnfs_block_extent *be) in ext_tree_next() argument
36 struct rb_node *node = rb_next(&be->be_node); in ext_tree_next()
41 ext_f_end(struct pnfs_block_extent *be) in ext_f_end() argument
43 return be->be_f_offset + be->be_length; in ext_f_end()
50 struct pnfs_block_extent *be = NULL; in __ext_tree_search() local
53 be = ext_node(node); in __ext_tree_search()
54 if (start < be->be_f_offset) in __ext_tree_search()
56 else if (start >= ext_f_end(be)) in __ext_tree_search()
59 return be; in __ext_tree_search()
62 if (be) { in __ext_tree_search()
63 if (start < be->be_f_offset) in __ext_tree_search()
64 return be; in __ext_tree_search()
66 if (start >= ext_f_end(be)) in __ext_tree_search()
67 return ext_tree_next(be); in __ext_tree_search()
96 ext_try_to_merge_left(struct rb_root *root, struct pnfs_block_extent *be) in ext_try_to_merge_left() argument
98 struct pnfs_block_extent *left = ext_tree_prev(be); in ext_try_to_merge_left()
100 if (left && ext_can_merge(left, be)) { in ext_try_to_merge_left()
101 left->be_length += be->be_length; in ext_try_to_merge_left()
102 rb_erase(&be->be_node, root); in ext_try_to_merge_left()
103 nfs4_put_deviceid_node(be->be_device); in ext_try_to_merge_left()
104 kfree(be); in ext_try_to_merge_left()
108 return be; in ext_try_to_merge_left()
112 ext_try_to_merge_right(struct rb_root *root, struct pnfs_block_extent *be) in ext_try_to_merge_right() argument
114 struct pnfs_block_extent *right = ext_tree_next(be); in ext_try_to_merge_right()
116 if (right && ext_can_merge(be, right)) { in ext_try_to_merge_right()
117 be->be_length += right->be_length; in ext_try_to_merge_right()
123 return be; in ext_try_to_merge_right()
128 struct pnfs_block_extent *be, *tmp; in __ext_put_deviceids() local
130 list_for_each_entry_safe(be, tmp, head, be_list) { in __ext_put_deviceids()
131 nfs4_put_deviceid_node(be->be_device); in __ext_put_deviceids()
132 kfree(be); in __ext_put_deviceids()
141 struct pnfs_block_extent *be; in __ext_tree_insert() local
145 be = ext_node(parent); in __ext_tree_insert()
147 if (new->be_f_offset < be->be_f_offset) { in __ext_tree_insert()
148 if (merge_ok && ext_can_merge(new, be)) { in __ext_tree_insert()
149 be->be_f_offset = new->be_f_offset; in __ext_tree_insert()
150 if (be->be_state != PNFS_BLOCK_NONE_DATA) in __ext_tree_insert()
151 be->be_v_offset = new->be_v_offset; in __ext_tree_insert()
152 be->be_length += new->be_length; in __ext_tree_insert()
153 be = ext_try_to_merge_left(root, be); in __ext_tree_insert()
157 } else if (new->be_f_offset >= ext_f_end(be)) { in __ext_tree_insert()
158 if (merge_ok && ext_can_merge(be, new)) { in __ext_tree_insert()
159 be->be_length += new->be_length; in __ext_tree_insert()
160 be = ext_try_to_merge_right(root, be); in __ext_tree_insert()
181 struct pnfs_block_extent *be; in __ext_tree_remove() local
186 be = __ext_tree_search(root, start); in __ext_tree_remove()
187 if (!be) in __ext_tree_remove()
189 if (be->be_f_offset >= end) in __ext_tree_remove()
192 orig_v_offset = be->be_v_offset; in __ext_tree_remove()
193 orig_len = be->be_length; in __ext_tree_remove()
195 if (start > be->be_f_offset) in __ext_tree_remove()
196 len1 = start - be->be_f_offset; in __ext_tree_remove()
197 if (ext_f_end(be) > end) in __ext_tree_remove()
198 len2 = ext_f_end(be) - end; in __ext_tree_remove()
208 be->be_length = len1; in __ext_tree_remove()
211 if (be->be_state != PNFS_BLOCK_NONE_DATA) { in __ext_tree_remove()
216 new->be_state = be->be_state; in __ext_tree_remove()
217 new->be_tag = be->be_tag; in __ext_tree_remove()
218 new->be_device = nfs4_get_deviceid(be->be_device); in __ext_tree_remove()
222 be->be_f_offset = end; in __ext_tree_remove()
223 if (be->be_state != PNFS_BLOCK_NONE_DATA) { in __ext_tree_remove()
224 be->be_v_offset = in __ext_tree_remove()
227 be->be_length = len2; in __ext_tree_remove()
231 be->be_length = len1; in __ext_tree_remove()
232 be = ext_tree_next(be); in __ext_tree_remove()
235 while (be && ext_f_end(be) <= end) { in __ext_tree_remove()
236 struct pnfs_block_extent *next = ext_tree_next(be); in __ext_tree_remove()
238 rb_erase(&be->be_node, root); in __ext_tree_remove()
239 list_add_tail(&be->be_list, tmp); in __ext_tree_remove()
240 be = next; in __ext_tree_remove()
243 if (be && be->be_f_offset < end) { in __ext_tree_remove()
244 len1 = ext_f_end(be) - end; in __ext_tree_remove()
245 be->be_f_offset = end; in __ext_tree_remove()
246 if (be->be_state != PNFS_BLOCK_NONE_DATA) in __ext_tree_remove()
247 be->be_v_offset += be->be_length - len1; in __ext_tree_remove()
248 be->be_length = len1; in __ext_tree_remove()
258 struct pnfs_block_extent *be; in ext_tree_insert() local
278 be = __ext_tree_search(root, new->be_f_offset); in ext_tree_insert()
279 if (!be || be->be_f_offset >= ext_f_end(new)) { in ext_tree_insert()
281 } else if (new->be_f_offset >= be->be_f_offset) { in ext_tree_insert()
282 if (ext_f_end(new) <= ext_f_end(be)) { in ext_tree_insert()
286 sector_t new_len = ext_f_end(new) - ext_f_end(be); in ext_tree_insert()
294 } else if (ext_f_end(new) <= ext_f_end(be)) { in ext_tree_insert()
295 new->be_length = be->be_f_offset - new->be_f_offset; in ext_tree_insert()
299 sector_t new_len = ext_f_end(new) - ext_f_end(be); in ext_tree_insert()
308 split->be_length = be->be_f_offset - split->be_f_offset; in ext_tree_insert()
327 struct pnfs_block_extent *be; in __ext_tree_lookup() local
331 be = ext_node(node); in __ext_tree_lookup()
332 if (isect < be->be_f_offset) in __ext_tree_lookup()
334 else if (isect >= ext_f_end(be)) in __ext_tree_lookup()
337 *ret = *be; in __ext_tree_lookup()
381 ext_tree_split(struct rb_root *root, struct pnfs_block_extent *be, in ext_tree_split() argument
385 sector_t orig_len = be->be_length; in ext_tree_split()
391 be->be_length = split - be->be_f_offset; in ext_tree_split()
394 if (be->be_state != PNFS_BLOCK_NONE_DATA) in ext_tree_split()
395 new->be_v_offset = be->be_v_offset + be->be_length; in ext_tree_split()
396 new->be_length = orig_len - be->be_length; in ext_tree_split()
397 new->be_state = be->be_state; in ext_tree_split()
398 new->be_tag = be->be_tag; in ext_tree_split()
399 new->be_device = nfs4_get_deviceid(be->be_device); in ext_tree_split()
411 struct pnfs_block_extent *be; in ext_tree_mark_written() local
426 for (be = __ext_tree_search(root, start); be; be = ext_tree_next(be)) { in ext_tree_mark_written()
427 if (be->be_f_offset >= end) in ext_tree_mark_written()
430 if (be->be_state != PNFS_BLOCK_INVALID_DATA || be->be_tag) in ext_tree_mark_written()
433 if (be->be_f_offset < start) { in ext_tree_mark_written()
434 struct pnfs_block_extent *left = ext_tree_prev(be); in ext_tree_mark_written()
436 if (left && ext_can_merge(left, be)) { in ext_tree_mark_written()
437 sector_t diff = start - be->be_f_offset; in ext_tree_mark_written()
441 be->be_f_offset += diff; in ext_tree_mark_written()
442 be->be_v_offset += diff; in ext_tree_mark_written()
443 be->be_length -= diff; in ext_tree_mark_written()
445 err = ext_tree_split(root, be, start); in ext_tree_mark_written()
451 if (ext_f_end(be) > end) { in ext_tree_mark_written()
452 struct pnfs_block_extent *right = ext_tree_next(be); in ext_tree_mark_written()
454 if (right && ext_can_merge(be, right)) { in ext_tree_mark_written()
455 sector_t diff = end - be->be_f_offset; in ext_tree_mark_written()
457 be->be_length -= diff; in ext_tree_mark_written()
463 err = ext_tree_split(root, be, end); in ext_tree_mark_written()
469 if (be->be_f_offset >= start && ext_f_end(be) <= end) { in ext_tree_mark_written()
470 be->be_tag = EXTENT_WRITTEN; in ext_tree_mark_written()
471 be = ext_try_to_merge_left(root, be); in ext_tree_mark_written()
472 be = ext_try_to_merge_right(root, be); in ext_tree_mark_written()
507 static __be32 *encode_block_extent(struct pnfs_block_extent *be, __be32 *p) in encode_block_extent() argument
509 p = xdr_encode_opaque_fixed(p, be->be_device->deviceid.data, in encode_block_extent()
511 p = xdr_encode_hyper(p, be->be_f_offset << SECTOR_SHIFT); in encode_block_extent()
512 p = xdr_encode_hyper(p, be->be_length << SECTOR_SHIFT); in encode_block_extent()
518 static __be32 *encode_scsi_range(struct pnfs_block_extent *be, __be32 *p) in encode_scsi_range() argument
520 p = xdr_encode_hyper(p, be->be_f_offset << SECTOR_SHIFT); in encode_scsi_range()
521 return xdr_encode_hyper(p, be->be_length << SECTOR_SHIFT); in encode_scsi_range()
540 struct pnfs_block_extent *be; in ext_tree_try_encode_commit() local
543 for (be = ext_tree_first(&bl->bl_ext_rw); be; be = ext_tree_next(be)) { in ext_tree_try_encode_commit()
544 if (be->be_state != PNFS_BLOCK_INVALID_DATA || in ext_tree_try_encode_commit()
545 be->be_tag != EXTENT_WRITTEN) in ext_tree_try_encode_commit()
554 for (be = ext_tree_first(&bl->bl_ext_rw); be; be = ext_tree_next(be)) { in ext_tree_try_encode_commit()
555 if (be->be_state != PNFS_BLOCK_INVALID_DATA || in ext_tree_try_encode_commit()
556 be->be_tag != EXTENT_WRITTEN) in ext_tree_try_encode_commit()
560 p = encode_scsi_range(be, p); in ext_tree_try_encode_commit()
562 p = encode_block_extent(be, p); in ext_tree_try_encode_commit()
563 be->be_tag = EXTENT_COMMITTING; in ext_tree_try_encode_commit()
588 struct pnfs_block_extent *be, *be_prev; in ext_tree_encode_commit() local
592 for (be = ext_tree_first(&bl->bl_ext_rw); be; be = ext_tree_next(be)) { in ext_tree_encode_commit()
593 if (be->be_state != PNFS_BLOCK_INVALID_DATA || in ext_tree_encode_commit()
594 be->be_tag != EXTENT_WRITTEN) in ext_tree_encode_commit()
605 p = encode_scsi_range(be, p); in ext_tree_encode_commit()
607 p = encode_block_extent(be, p); in ext_tree_encode_commit()
608 be->be_tag = EXTENT_COMMITTING; in ext_tree_encode_commit()
609 be_prev = be; in ext_tree_encode_commit()
697 struct pnfs_block_extent *be; in ext_tree_mark_committed() local
704 for (be = ext_tree_first(root); be; be = ext_tree_next(be)) { in ext_tree_mark_committed()
705 if (be->be_state != PNFS_BLOCK_INVALID_DATA || in ext_tree_mark_committed()
706 be->be_tag != EXTENT_COMMITTING) in ext_tree_mark_committed()
715 be->be_tag = EXTENT_WRITTEN; in ext_tree_mark_committed()
717 be->be_state = PNFS_BLOCK_READWRITE_DATA; in ext_tree_mark_committed()
718 be->be_tag = 0; in ext_tree_mark_committed()
721 be = ext_try_to_merge_left(root, be); in ext_tree_mark_committed()
722 be = ext_try_to_merge_right(root, be); in ext_tree_mark_committed()