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