Skip to content

Commit a5ee71e

Browse files
committed
fsremap/src/io/extent_posix.cc: replaced TABs with spaces
1 parent d352311 commit a5ee71e

File tree

2 files changed

+120
-101
lines changed

2 files changed

+120
-101
lines changed

TODO

+22-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,29 @@
11
TODO
22

3-
* fstransform, fsmove: add persistence, i.e. the ability to resume a transformation
4-
after CTRL-C, power failure or similar interruptions
3+
* all: test on more file systems
4+
5+
nilfs: ok as target.
6+
as source it gets practically full very quickly, free space fluctuates
7+
between zero and 1GB while the GC works to avoid "disk full" errors.
8+
But it works :)
9+
10+
ntfs: ntfs-3g is VERY slow both as source and target because it's userspace.
11+
it supports only UTF-8 filenames, not arbitrary bytes in the range 128-255.
12+
fsmove must check beforehand!
13+
use mount.ntfs option big_writes... enough or still too slow?
14+
15+
logfs: as target: "mkfs -t logfs" does NOT accept option -q,
16+
fsmove and umount crash with kernel bugs (see tests/)
17+
18+
others: btrfs, gfs, gfs2, hfs, jffs2, ocfs2, qnx4, qnx6, ubifs...
19+
20+
not yet: tux3
21+
22+
* fstransform, fsmove: add fsremap-like persistence, i.e. the ability to resume
23+
a transformation after CTRL-C, power failure or similar interruptions
524

625
* fsmove: use a larger buffer (1MB) to speed up backward copy.
7-
Worth it? beware of low free space...
26+
Worth it? beware of low free space...
827

928
* fsremap: add a graphical interface ? probably not so worth it...
1029

fsremap/src/io/extent_posix.cc

+98-98
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,10 @@ FT_IO_NAMESPACE_BEGIN
7979
static int ff_posix_fibmap(int fd, ft_uoff dev_length, fr_vector<ft_uoff> & ret_list, ft_uoff & ret_block_size_bitmask)
8080
{
8181
#ifdef FIBMAP
82-
ft_uoff file_length, file_block_count, dev_block_count;
82+
ft_uoff file_length, file_block_count, dev_block_count;
8383
ft_uoff ioctl_n = 0, block_size = 0, logical_uoff, physical_uoff;
8484

85-
ft_size extent_n = ret_list.size();
85+
ft_size extent_n = ret_list.size();
8686

8787
/* lower-level API ff_posix_ioctl(FIGETBSZ) and ff_posix_ioctl(FIBMAP) need these to be int */
8888
int err = 0, block_size_int, logical, physical;
@@ -129,7 +129,7 @@ static int ff_posix_fibmap(int fd, ft_uoff dev_length, fr_vector<ft_uoff> & ret_
129129

130130
for (logical = 0; logical < n; logical++) {
131131
physical = logical;
132-
ioctl_n++;
132+
ioctl_n++;
133133
if ((err = ff_posix_ioctl(fd, FIBMAP, & physical))) {
134134
err = ff_log(FC_ERROR, err, "ff_posix_fibmap(): error in ioctl(%d, FIBMAP, %"FT_ULL")", fd, (ft_ull) logical);
135135
break;
@@ -146,15 +146,15 @@ static int ff_posix_fibmap(int fd, ft_uoff dev_length, fr_vector<ft_uoff> & ret_
146146
} while (0);
147147

148148
if (err == 0) {
149-
static ft_ull log_count = 0;
149+
static ft_ull log_count = 0;
150150

151-
if (log_count++ == 5)
151+
if (log_count++ == 5)
152152
ff_log(FC_DEBUG, 0, "decreasing to level TRACE any further DEBUG message 'ioctl(FIBMAP) successful'");
153153

154-
extent_n = ret_list.size() - extent_n;
154+
extent_n = ret_list.size() - extent_n;
155155

156156
ff_log(log_count < 5 ? FC_DEBUG : FC_TRACE, 0, "ioctl(%d, FIBMAP) successful: retrieved %"FT_ULL" extent%s in %"FT_ULL" call%s",
157-
fd, (ft_ull) extent_n, extent_n == 1 ? "" : "s", (ft_ull) ioctl_n, ioctl_n == 1 ? "" : "s");
157+
fd, (ft_ull) extent_n, extent_n == 1 ? "" : "s", (ft_ull) ioctl_n, ioctl_n == 1 ? "" : "s");
158158
/* keep track of bits used by extents. needed to compute effective block size */
159159
ret_block_size_bitmask |= block_size;
160160
}
@@ -172,22 +172,22 @@ static int ff_linux_fiemap(int fd, ft_uoff file_start, ft_uoff file_end, ft_u32
172172

173173
memset(k_map, 0, k_len);
174174

175-
k_map->fm_start = (ft_u64) file_start;
176-
k_map->fm_length = (ft_u64) (file_end - file_start);
177-
k_map->fm_flags = FIEMAP_FLAG_SYNC;
178-
k_map->fm_extent_count = extent_n;
179-
180-
int err = 0;
181-
if ((err = ff_posix_ioctl(fd, FS_IOC_FIEMAP, k_map)) != 0) {
182-
static ft_ull log_count = 0;
183-
if (log_count++ == 5)
184-
ff_log(FC_DEBUG, 0, "decreasing to level TRACE any further DEBUG message 'ioctl(FIEMAP) failed'");
185-
186-
/* do not mark the error as reported, this is just a DEBUG message */
187-
ff_log(log_count < 5 ? FC_DEBUG : FC_TRACE, 0,
188-
"ioctl(%d, FIEMAP, extents[%"FT_ULL"]) failed (%s), falling back on ioctl(FIBMAP) ...",
189-
fd, (ft_ull) extent_n, strerror(err));
190-
}
175+
k_map->fm_start = (ft_u64) file_start;
176+
k_map->fm_length = (ft_u64) (file_end - file_start);
177+
k_map->fm_flags = FIEMAP_FLAG_SYNC;
178+
k_map->fm_extent_count = extent_n;
179+
180+
int err = 0;
181+
if ((err = ff_posix_ioctl(fd, FS_IOC_FIEMAP, k_map)) != 0) {
182+
static ft_ull log_count = 0;
183+
if (log_count++ == 5)
184+
ff_log(FC_DEBUG, 0, "decreasing to level TRACE any further DEBUG message 'ioctl(FIEMAP) failed'");
185+
186+
/* do not mark the error as reported, this is just a DEBUG message */
187+
ff_log(log_count < 5 ? FC_DEBUG : FC_TRACE, 0,
188+
"ioctl(%d, FIEMAP, extents[%"FT_ULL"]) failed (%s), falling back on ioctl(FIBMAP) ...",
189+
fd, (ft_ull) extent_n, strerror(err));
190+
}
191191
return err;
192192
}
193193
#endif /* FS_IOC_FIEMAP */
@@ -208,93 +208,93 @@ static int ff_linux_fiemap(int fd, fr_vector<ft_uoff> & ret_list, ft_uoff & ret_
208208
int err;
209209

210210
if ((err = ff_posix_size(fd, & file_size)) || file_size == 0)
211-
return err;
211+
return err;
212212

213-
fr_vector<ft_uoff> tmp_list;
213+
fr_vector<ft_uoff> tmp_list;
214214

215-
enum { K_EXTENT_N = 1024, K_SIZEOF_FIEMAP = sizeof(struct fiemap) + K_EXTENT_N * sizeof(struct fiemap_extent) };
216-
char buf[K_SIZEOF_FIEMAP];
215+
enum { K_EXTENT_N = 1024, K_SIZEOF_FIEMAP = sizeof(struct fiemap) + K_EXTENT_N * sizeof(struct fiemap_extent) };
216+
char buf[K_SIZEOF_FIEMAP];
217217
struct fiemap * k_map = (struct fiemap *) buf;
218218
ft_uoff ioctl_n = 0, block_size_bitmask = ret_block_size_bitmask;
219219

220-
// call ioctl() repeatedly until we retrieve all extents
220+
// call ioctl() repeatedly until we retrieve all extents
221221
while (ioctl_n++, (err = ff_linux_fiemap(fd, file_start, file_size, K_EXTENT_N, k_map)) == 0) {
222222

223-
ft_u32 i, extent_n = k_map->fm_mapped_extents;
224-
if (extent_n == 0) {
225-
/* we did not get any extent... bail out */
226-
ff_log(FC_WARN, 0, "ioctl(%d, FS_IOC_FIEMAP) is refusing to return any extent after file offset = %"FT_ULL
227-
", falling back on ioctl(FIBMAP) ...", fd, (ft_ull) file_start);
228-
/* mark the error as reported, WARN is quite a severe level */
229-
err = -ENOSYS; /* ioctl(FS_IOC_FIEMAP) not working as expected... */
230-
break;
231-
}
232-
233-
const struct fiemap_extent & last_e = k_map->fm_extents[extent_n - 1];
234-
const ft_uoff new_file_start = (ft_uoff) last_e.fe_logical + (ft_uoff) last_e.fe_length;
235-
if (new_file_start <= file_start) {
236-
ff_log(FC_WARN, 0, "ioctl(%d, FS_IOC_FIEMAP) returned extents ending at %"FT_ULL", i.e. _before_ start of requested range [%"FT_ULL", %"FT_ULL"]"
237-
", falling back on ioctl(FIBMAP) ...", fd, (ft_ull) new_file_start, (ft_ull) file_start, (ft_ull) file_size);
238-
/* mark the error as reported, WARN is quite a severe level */
239-
err = -ENOSYS; /* ioctl(FS_IOC_FIEMAP) not working as expected... */
240-
break;
241-
}
242-
243-
tmp_list.reserve(tmp_list.size() + extent_n);
244-
245-
for (i = 0; i < extent_n; i++) {
246-
const struct fiemap_extent & e = k_map->fm_extents[i];
247-
248-
ft_u32 flag = e.fe_flags & (FIEMAP_EXTENT_UNKNOWN | FIEMAP_EXTENT_ENCODED);
249-
250-
if (flag) {
251-
ff_log(FC_DEBUG, 0, "ioctl(%d, FS_IOC_FIEMAP, extents[%"FT_ULL"]) returned unsupported %s%s%s extents, falling back on ioctl(FIBMAP) ...",
252-
fd, (ft_ull) extent_n,
253-
(flag & FIEMAP_EXTENT_UNKNOWN ? "UNKNOWN" : ""),
254-
(flag == (FIEMAP_EXTENT_UNKNOWN|FIEMAP_EXTENT_ENCODED) ? "+" : ""),
255-
(flag & FIEMAP_EXTENT_ENCODED ? "ENCODED" : "")
256-
);
257-
// do not mark the error as reported, this is just a DEBUG message
258-
err = ENOSYS;
259-
break;
260-
}
261-
/*
262-
* keep track of bits used by all physical, logical and lengths.
263-
* needed to check against block size
264-
*/
265-
block_size_bitmask |= e.fe_physical | e.fe_logical | e.fe_length;
266-
267-
// save what we retrieved
268-
tmp_list.append((ft_uoff) e.fe_physical,
269-
(ft_uoff) e.fe_logical,
270-
(ft_uoff) e.fe_length,
271-
(e.fe_flags & FIEMAP_EXTENT_UNWRITTEN) ? FC_EXTENT_ZEROED : FC_DEFAULT_USER_DATA);
272-
}
273-
if (err != 0 || (last_e.fe_flags & FIEMAP_EXTENT_LAST))
274-
break;
275-
276-
// no FIEMAP_EXTENT_LAST found, we did not get all the extents. keep trying...
277-
if (new_file_start >= file_size)
278-
// should not happen, but not too dangerous
279-
file_size = new_file_start + 1;
280-
file_start = new_file_start;
281-
}
282-
if (err != 0)
283-
return err;
284-
285-
ft_size extent_n = tmp_list.size();
223+
ft_u32 i, extent_n = k_map->fm_mapped_extents;
224+
if (extent_n == 0) {
225+
/* we did not get any extent... bail out */
226+
ff_log(FC_WARN, 0, "ioctl(%d, FS_IOC_FIEMAP) is refusing to return any extent after file offset = %"FT_ULL
227+
", falling back on ioctl(FIBMAP) ...", fd, (ft_ull) file_start);
228+
/* mark the error as reported, WARN is quite a severe level */
229+
err = -ENOSYS; /* ioctl(FS_IOC_FIEMAP) not working as expected... */
230+
break;
231+
}
232+
233+
const struct fiemap_extent & last_e = k_map->fm_extents[extent_n - 1];
234+
const ft_uoff new_file_start = (ft_uoff) last_e.fe_logical + (ft_uoff) last_e.fe_length;
235+
if (new_file_start <= file_start) {
236+
ff_log(FC_WARN, 0, "ioctl(%d, FS_IOC_FIEMAP) returned extents ending at %"FT_ULL", i.e. _before_ start of requested range [%"FT_ULL", %"FT_ULL"]"
237+
", falling back on ioctl(FIBMAP) ...", fd, (ft_ull) new_file_start, (ft_ull) file_start, (ft_ull) file_size);
238+
/* mark the error as reported, WARN is quite a severe level */
239+
err = -ENOSYS; /* ioctl(FS_IOC_FIEMAP) not working as expected... */
240+
break;
241+
}
242+
243+
tmp_list.reserve(tmp_list.size() + extent_n);
244+
245+
for (i = 0; i < extent_n; i++) {
246+
const struct fiemap_extent & e = k_map->fm_extents[i];
247+
248+
ft_u32 flag = e.fe_flags & (FIEMAP_EXTENT_UNKNOWN | FIEMAP_EXTENT_ENCODED);
249+
250+
if (flag) {
251+
ff_log(FC_DEBUG, 0, "ioctl(%d, FS_IOC_FIEMAP, extents[%"FT_ULL"]) returned unsupported %s%s%s extents, falling back on ioctl(FIBMAP) ...",
252+
fd, (ft_ull) extent_n,
253+
(flag & FIEMAP_EXTENT_UNKNOWN ? "UNKNOWN" : ""),
254+
(flag == (FIEMAP_EXTENT_UNKNOWN|FIEMAP_EXTENT_ENCODED) ? "+" : ""),
255+
(flag & FIEMAP_EXTENT_ENCODED ? "ENCODED" : "")
256+
);
257+
// do not mark the error as reported, this is just a DEBUG message
258+
err = ENOSYS;
259+
break;
260+
}
261+
/*
262+
* keep track of bits used by all physical, logical and lengths.
263+
* needed to check against block size
264+
*/
265+
block_size_bitmask |= e.fe_physical | e.fe_logical | e.fe_length;
266+
267+
// save what we retrieved
268+
tmp_list.append((ft_uoff) e.fe_physical,
269+
(ft_uoff) e.fe_logical,
270+
(ft_uoff) e.fe_length,
271+
(e.fe_flags & FIEMAP_EXTENT_UNWRITTEN) ? FC_EXTENT_ZEROED : FC_DEFAULT_USER_DATA);
272+
}
273+
if (err != 0 || (last_e.fe_flags & FIEMAP_EXTENT_LAST))
274+
break;
275+
276+
// no FIEMAP_EXTENT_LAST found, we did not get all the extents. keep trying...
277+
if (new_file_start >= file_size)
278+
// should not happen, but not too dangerous
279+
file_size = new_file_start + 1;
280+
file_start = new_file_start;
281+
}
282+
if (err != 0)
283+
return err;
284+
285+
ft_size extent_n = tmp_list.size();
286286

287287
/* ok, no strange extents: we can now add them to ret_list */
288-
ret_list.reserve(ret_list.size() + extent_n);
289-
ret_list.append_all(tmp_list);
288+
ret_list.reserve(ret_list.size() + extent_n);
289+
ret_list.append_all(tmp_list);
290290

291-
static ft_ull log_count = 0;
292-
if (log_count++ == 5)
291+
static ft_ull log_count = 0;
292+
if (log_count++ == 5)
293293
ff_log(FC_DEBUG, 0, "decreasing to level TRACE any further DEBUG message 'ioctl(FIEMAP) successful'");
294294

295-
ff_log(log_count < 5 ? FC_DEBUG : FC_TRACE, 0, "ioctl(%d, FIEMAP) successful: retrieved %"FT_ULL" extent%s in %"FT_ULL" call%s",
296-
fd, (ft_ull) extent_n, extent_n == 1 ? "" : "s", (ft_ull) ioctl_n, ioctl_n == 1 ? "" : "s");
297-
ret_block_size_bitmask = block_size_bitmask;
295+
ff_log(log_count < 5 ? FC_DEBUG : FC_TRACE, 0, "ioctl(%d, FIEMAP) successful: retrieved %"FT_ULL" extent%s in %"FT_ULL" call%s",
296+
fd, (ft_ull) extent_n, extent_n == 1 ? "" : "s", (ft_ull) ioctl_n, ioctl_n == 1 ? "" : "s");
297+
ret_block_size_bitmask = block_size_bitmask;
298298

299299
return err;
300300
#else

0 commit comments

Comments
 (0)