What I would do in your case is to make an image of the disk with testdisk and after to work on the image (it will help if the disk have some physical errors or write troubles or data communication error )
testdiskand its documentation can be found here: https://www.cgsecurity.org/wiki/TestDisk
If you need a file level recover of the disk, you can use photorec from the same author
To make an image with testdisk you can use:
testdisk /log /debug /dev/sdb and after follow the menu to create an image.
Not that except if I have no choice, I would never work directly on the physical media I'm trying to recover, the idea is to always make an image (device block copy) of the disk and to work on a second copy of the extracted image (always keep an original copy of the extracted image of the disk and copy it each time you want to try something new to recover)
NB: doing this you're working on a file which reside on modern storage which work without errors and in your case, you can restart the fsck command and you will not have physical write IO errors as you're writing on a file which is on a modern and functional disk. If If you need to mount the image you can use losetup --partscan command to "be able to use the image file as a block device the kernel can use like a regular block device"