src/e4compact cleanup

- fix incorrect donor offset initialization.
- fix donor name logging.
- handle EOPNOTSUPP correctly

Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
Signed-off-by: Dave Chinner <david@fromorbit.com>
This commit is contained in:
Dmitry Monakhov
2014-09-08 20:49:35 +10:00
committed by Dave Chinner
parent 072a84581e
commit 3727a19020
+11 -6
View File
@@ -64,7 +64,6 @@ static int do_defrag_one(int fd, char *name,__u64 start, __u64 len, struct donor
mv_ioc.donor_fd = donor->fd; mv_ioc.donor_fd = donor->fd;
mv_ioc.orig_start = start; mv_ioc.orig_start = start;
mv_ioc.donor_start = donor->offset; mv_ioc.donor_start = donor->offset;
mv_ioc.moved_len = 0;
mv_ioc.len = len; mv_ioc.len = len;
if (verbose) if (verbose)
@@ -77,6 +76,7 @@ static int do_defrag_one(int fd, char *name,__u64 start, __u64 len, struct donor
do { do {
i++; i++;
errno = 0; errno = 0;
mv_ioc.moved_len = 0;
ret = ioctl(fd, EXT4_IOC_MOVE_EXT, &mv_ioc); ret = ioctl(fd, EXT4_IOC_MOVE_EXT, &mv_ioc);
if (verbose) if (verbose)
printf("process %s it:%d start:%lld len:%lld donor:%lld," printf("process %s it:%d start:%lld len:%lld donor:%lld,"
@@ -102,12 +102,12 @@ static int do_defrag_one(int fd, char *name,__u64 start, __u64 len, struct donor
assert(mv_ioc.len >= mv_ioc.moved_len); assert(mv_ioc.len >= mv_ioc.moved_len);
mv_ioc.len -= mv_ioc.moved_len; mv_ioc.len -= mv_ioc.moved_len;
mv_ioc.orig_start += mv_ioc.moved_len; mv_ioc.orig_start += mv_ioc.moved_len;
mv_ioc.donor_start = mv_ioc.orig_start; mv_ioc.donor_start += mv_ioc.moved_len;
moved += mv_ioc.moved_len; moved += mv_ioc.moved_len;
} while (mv_ioc.len); } while (mv_ioc.len);
if (ret && (errno == EBUSY || errno == ENODATA)) if (ret && ignore_error &&
(errno == EBUSY || errno == ENODATA || errno == EOPNOTSUPP))
ret = 0; ret = 0;
donor->length -= moved; donor->length -= moved;
donor->offset += moved; donor->offset += moved;
@@ -154,6 +154,10 @@ int main(int argc, char **argv)
exit(1); exit(1);
} }
} }
if (!donor_name) {
usage();
exit(1);
}
donor.fd = open(donor_name, O_RDWR); donor.fd = open(donor_name, O_RDWR);
if (donor.fd < 0) { if (donor.fd < 0) {
perror("can not open donor file"); perror("can not open donor file");
@@ -168,7 +172,8 @@ int main(int argc, char **argv)
donor.offset /= st.st_blksize; donor.offset /= st.st_blksize;
if (verbose) if (verbose)
printf("Init donor :%s off:%lld len:%lld\n", argv[1], donor.offset, donor.length); printf("Init donor :%s off:%lld len:%lld\n",
donor_name, donor.offset, donor.length);
while ((read = getline(&line, &len, stdin)) != -1) { while ((read = getline(&line, &len, stdin)) != -1) {
if (line[read -1] == '\n') if (line[read -1] == '\n')
@@ -197,7 +202,7 @@ int main(int argc, char **argv)
ret = do_defrag_one(fd, line, 0, ret = do_defrag_one(fd, line, 0,
(st.st_size + st.st_blksize-1)/ (st.st_size + st.st_blksize-1)/
st.st_blksize, &donor); st.st_blksize, &donor);
if (ret && ignore_error) if (ret && !ignore_error)
break; break;
} }
} }