A couple 'is that the best solution' ideas:
- Can you use a volume manager to allow you to dole out more space to the old fs?
- Can you convert the old fs to zfs and compress?
I suppose if you copy one raw partition to the next, you do not get a usable larger file system!
Using two processes as you did, not 'cp -rp `ls -A` target_dir', will usually speed things, as UNIX is single buffered. If you multiplex the file list to many pairs, you might double the speed again, but files might be a bit more page-interlaced (fragmented). Of course, if they are on the same spindle, cable or controller, that might not speed up much if at all.
If you copy by mod age of inode oldest first, the files will be defragmented, as well, and the future fragmentation tends to occur at the end, in younger files. I am still waiting the fs to end all fs, where the stuff moves and defrags in the background to be mirrored or raid N, compressed, backed up on remote nodes, possibly many, possibly compressed in all or all but one copy, some quiescent files not even copied locally, and with the files relocated so the activity of each device versus the bandwidth of the device is leveled (less active files on larger, slower devices, including CD/DVD/WORM), with old versions also preserved as backup, either mandatory or space available.