1c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o/* 2c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o * extent.c --- ext2 extent abstraction 3c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o * 4c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o * This abstraction is used to provide a compact way of representing a 5c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o * translation table, for moving multiple contiguous ranges (extents) 6c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o * of blocks or inodes. 7c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o * 80cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o * Copyright (C) 1997, 1998 by Theodore Ts'o and 90cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o * PowerQuest, Inc. 100cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o * 110cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o * Copyright (C) 1999, 2000 by Theosore Ts'o 12efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * 13c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o * %Begin-Header% 140cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o * This file may be redistributed under the terms of the GNU Public 150cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o * License. 16c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o * %End-Header% 17c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o */ 18c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o 19c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o#include "resize2fs.h" 20c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o 21c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'ostruct ext2_extent_entry { 22e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall __u64 old_loc, new_loc; 23e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall __u64 size; 24c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o}; 25c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o 26c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'ostruct _ext2_extent { 27c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o struct ext2_extent_entry *list; 28e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall __u64 cursor; 29e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall __u64 size; 30e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall __u64 num; 31e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall __u64 sorted; 32c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o}; 33c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o 34c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o/* 35c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o * Create an extent table 36c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o */ 37e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallerrcode_t ext2fs_create_extent_table(ext2_extent *ret_extent, __u64 size) 38c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o{ 39ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o ext2_extent extent; 40ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o errcode_t retval; 41efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 42c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o retval = ext2fs_get_mem(sizeof(struct _ext2_extent), &extent); 43ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o if (retval) 44ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o return retval; 45ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o memset(extent, 0, sizeof(struct _ext2_extent)); 46ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o 47ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o extent->size = size ? size : 50; 48ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o extent->cursor = 0; 49ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o extent->num = 0; 50ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o extent->sorted = 1; 51ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o 52e5aace908e9d1161a594944d9360f9f0cdd18099Theodore Ts'o retval = ext2fs_get_array(sizeof(struct ext2_extent_entry), 53c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o extent->size, &extent->list); 54ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o if (retval) { 55c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o ext2fs_free_mem(&extent); 56ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o return retval; 57c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o } 58ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o memset(extent->list, 0, 59ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o sizeof(struct ext2_extent_entry) * extent->size); 60ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o *ret_extent = extent; 61c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o return 0; 62c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o} 63c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o 64c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o/* 65c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o * Free an extent table 66c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o */ 67c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'ovoid ext2fs_free_extent_table(ext2_extent extent) 68c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o{ 69c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o if (extent->list) 70c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o ext2fs_free_mem(&extent->list); 71c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o extent->list = 0; 72c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o extent->size = 0; 73c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o extent->num = 0; 74c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o ext2fs_free_mem(&extent); 75c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o} 76c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o 77c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o/* 78c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o * Add an entry to the extent table 79c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o */ 80e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallerrcode_t ext2fs_add_extent_entry(ext2_extent extent, __u64 old_loc, __u64 new_loc) 81c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o{ 82ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o struct ext2_extent_entry *ent; 83ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o errcode_t retval; 84e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall __u64 newsize; 85e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall __u64 curr; 86c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o 87c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o if (extent->num >= extent->size) { 88c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o newsize = extent->size + 100; 89efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o retval = ext2fs_resize_mem(sizeof(struct ext2_extent_entry) * 90efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o extent->size, 91efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o sizeof(struct ext2_extent_entry) * 92c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o newsize, &extent->list); 93ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o if (retval) 94ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o return retval; 95c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o extent->size = newsize; 96c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o } 97c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o curr = extent->num; 98c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o ent = extent->list + curr; 99c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o if (curr) { 100c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o /* 101c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o * Check to see if this can be coalesced with the last 102c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o * extent 103c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o */ 104c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o ent--; 105ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o if ((ent->old_loc + ent->size == old_loc) && 106ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o (ent->new_loc + ent->size == new_loc)) { 107c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o ent->size++; 108c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o return 0; 109c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o } 110c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o /* 111c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o * Now see if we're going to ruin the sorting 112c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o */ 113ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o if (ent->old_loc + ent->size > old_loc) 114c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o extent->sorted = 0; 115c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o ent++; 116c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o } 117ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o ent->old_loc = old_loc; 118ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o ent->new_loc = new_loc; 119c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o ent->size = 1; 120c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o extent->num++; 121c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o return 0; 122c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o} 123c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o 124c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o/* 125c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o * Helper function for qsort 126c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o */ 1274c77fe50d97a773e32a4756c79dade3adbb6a601Theodore Ts'ostatic EXT2_QSORT_TYPE extent_cmp(const void *a, const void *b) 128c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o{ 129ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o const struct ext2_extent_entry *db_a; 130ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o const struct ext2_extent_entry *db_b; 131efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 1322a3013b80704b7d9128cbe2c746550e570eb5a02Theodore Ts'o db_a = (const struct ext2_extent_entry *) a; 1332a3013b80704b7d9128cbe2c746550e570eb5a02Theodore Ts'o db_b = (const struct ext2_extent_entry *) b; 134efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 135ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o return (db_a->old_loc - db_b->old_loc); 136efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o} 137c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o 138c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o/* 139c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o * Given an inode map and inode number, look up the old inode number 140ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o * and return the new inode number. 141c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o */ 142e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall__u64 ext2fs_extent_translate(ext2_extent extent, __u64 old_loc) 143c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o{ 144e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall __s64 low, high, mid; 145e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall __u64 lowval, highval; 146c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o float range; 147c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o 148c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o if (!extent->sorted) { 149c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o qsort(extent->list, extent->num, 150c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o sizeof(struct ext2_extent_entry), extent_cmp); 151c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o extent->sorted = 1; 152c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o } 153c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o low = 0; 154c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o high = extent->num-1; 155c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o while (low <= high) { 156c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o#if 0 157c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o mid = (low+high)/2; 158c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o#else 159c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o if (low == high) 160c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o mid = low; 161c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o else { 162c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o /* Interpolate for efficiency */ 163ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o lowval = extent->list[low].old_loc; 164ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o highval = extent->list[high].old_loc; 165c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o 166ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o if (old_loc < lowval) 167c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o range = 0; 168ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o else if (old_loc > highval) 169c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o range = 1; 170ac92f3cc0443f5980775e6c3e86724ed817587f6Theodore Ts'o else { 171ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o range = ((float) (old_loc - lowval)) / 172c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o (highval - lowval); 173ac92f3cc0443f5980775e6c3e86724ed817587f6Theodore Ts'o if (range > 0.9) 174ac92f3cc0443f5980775e6c3e86724ed817587f6Theodore Ts'o range = 0.9; 175ac92f3cc0443f5980775e6c3e86724ed817587f6Theodore Ts'o if (range < 0.1) 176ac92f3cc0443f5980775e6c3e86724ed817587f6Theodore Ts'o range = 0.1; 177ac92f3cc0443f5980775e6c3e86724ed817587f6Theodore Ts'o } 178e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall mid = low + ((__u64) (range * (high-low))); 179c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o } 180c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o#endif 181ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o if ((old_loc >= extent->list[mid].old_loc) && 182ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o (old_loc < extent->list[mid].old_loc + extent->list[mid].size)) 183ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o return (extent->list[mid].new_loc + 184ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o (old_loc - extent->list[mid].old_loc)); 185ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o if (old_loc < extent->list[mid].old_loc) 186c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o high = mid-1; 187c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o else 188c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o low = mid+1; 189c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o } 190c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o return 0; 191c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o} 192c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o 193c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o/* 194c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o * For debugging only 195c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o */ 196c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'ovoid ext2fs_extent_dump(ext2_extent extent, FILE *out) 197c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o{ 198e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall __u64 i; 199c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o struct ext2_extent_entry *ent; 200efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 201a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o fputs(_("# Extent dump:\n"), out); 202e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fprintf(out, _("#\tNum=%llu, Size=%llu, Cursor=%llu, Sorted=%llu\n"), 203c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o extent->num, extent->size, extent->cursor, extent->sorted); 204c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o for (i=0, ent=extent->list; i < extent->num; i++, ent++) { 205e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fprintf(out, "#\t\t %llu -> %llu (%llu)\n", ent->old_loc, 206ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o ent->new_loc, ent->size); 207c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o } 208c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o} 209c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o 210c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o/* 211c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o * Iterate over the contents of the extent table 212c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o */ 213e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallerrcode_t ext2fs_iterate_extent(ext2_extent extent, __u64 *old_loc, 214e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall __u64 *new_loc, __u64 *size) 215c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o{ 216c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o struct ext2_extent_entry *ent; 217efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 218ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o if (!old_loc) { 219c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o extent->cursor = 0; 220c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o return 0; 221c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o } 222c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o 223c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o if (extent->cursor >= extent->num) { 224ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o *old_loc = 0; 225ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o *new_loc = 0; 226c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o *size = 0; 227c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o return 0; 228c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o } 229c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o 230c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o ent = extent->list + extent->cursor++; 231c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o 232ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o *old_loc = ent->old_loc; 233ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o *new_loc = ent->new_loc; 234c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o *size = ent->size; 235c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o return 0; 236c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o} 237efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 238efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 239efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 240efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 241