Fallback to pagesize transfers in dd(1)
This commit is contained in:
parent
ee5c4e4521
commit
9c7d08773f
8
dd.c
8
dd.c
@ -41,6 +41,7 @@ prepare_copy(struct dd_config *ddc, int *ifd, int *ofd)
|
|||||||
struct stat st;
|
struct stat st;
|
||||||
int fli = O_RDONLY|O_LARGEFILE|O_NOCTTY, flo = O_WRONLY|O_LARGEFILE|O_NOATIME|O_NOCTTY;
|
int fli = O_RDONLY|O_LARGEFILE|O_NOCTTY, flo = O_WRONLY|O_LARGEFILE|O_NOATIME|O_NOCTTY;
|
||||||
uid_t euid = 0;
|
uid_t euid = 0;
|
||||||
|
long pagesize;
|
||||||
|
|
||||||
if (ddc->direct) {
|
if (ddc->direct) {
|
||||||
fli |= O_DIRECT;
|
fli |= O_DIRECT;
|
||||||
@ -68,14 +69,17 @@ prepare_copy(struct dd_config *ddc, int *ifd, int *ofd)
|
|||||||
if (!ddc->bs) {
|
if (!ddc->bs) {
|
||||||
struct statfs fst;
|
struct statfs fst;
|
||||||
memset(&fst, 0, sizeof(fst));
|
memset(&fst, 0, sizeof(fst));
|
||||||
|
pagesize = sysconf(_SC_PAGESIZE);
|
||||||
|
if (pagesize <= 0)
|
||||||
|
pagesize = 0x1000;
|
||||||
if (statfs(ddc->out, &fst) < 0 || fst.f_bsize == 0)
|
if (statfs(ddc->out, &fst) < 0 || fst.f_bsize == 0)
|
||||||
fst.f_bsize = 0x1000;
|
fst.f_bsize = pagesize;
|
||||||
if ((unsigned long)fst.f_bsize > (unsigned long)st.st_blksize)
|
if ((unsigned long)fst.f_bsize > (unsigned long)st.st_blksize)
|
||||||
ddc->bs = fst.f_bsize;
|
ddc->bs = fst.f_bsize;
|
||||||
else
|
else
|
||||||
ddc->bs = st.st_blksize;
|
ddc->bs = st.st_blksize;
|
||||||
if (ddc->bs == 0)
|
if (ddc->bs == 0)
|
||||||
ddc->bs = 0x1000;
|
ddc->bs = pagesize;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check if device or regular file */
|
/* check if device or regular file */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user