mv_ioc.donor_fd = donor->fd;
        mv_ioc.orig_start = start;
        mv_ioc.donor_start = donor->offset;
-       mv_ioc.moved_len = 0;
        mv_ioc.len = len;
 
        if (verbose)
        do {
                i++;
                errno = 0;
+               mv_ioc.moved_len = 0;
                ret = ioctl(fd, EXT4_IOC_MOVE_EXT, &mv_ioc);
                if (verbose)
                        printf("process %s  it:%d start:%lld len:%lld donor:%lld,"
                assert(mv_ioc.len >= mv_ioc.moved_len);
                mv_ioc.len -= 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;
-
        } while (mv_ioc.len);
 
-       if (ret && (errno == EBUSY || errno == ENODATA))
+       if (ret && ignore_error &&
+           (errno == EBUSY || errno == ENODATA || errno == EOPNOTSUPP))
                ret = 0;
        donor->length -= moved;
        donor->offset += moved;
                        exit(1);
                }
        }
+       if (!donor_name) {
+               usage();
+               exit(1);
+       }
        donor.fd = open(donor_name, O_RDWR);
        if (donor.fd < 0) {
                perror("can not open donor file");
                donor.offset /= st.st_blksize;
 
        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) {
 
                if (line[read -1] == '\n')
                        ret = do_defrag_one(fd, line, 0,
                                            (st.st_size  + st.st_blksize-1)/
                                            st.st_blksize, &donor);
-                       if (ret && ignore_error)
+                       if (ret && !ignore_error)
                                break;
                }
        }