Add kmap_atomic in dmu_bio_copy
This is needed for 32 bit systems. Signed-off-by: Chunwei Chen <david.chen@osnexus.com>
This commit is contained in:
parent
34a3a7c660
commit
dbb48937ce
|
@ -49,6 +49,7 @@
|
||||||
#ifdef _KERNEL
|
#ifdef _KERNEL
|
||||||
#include <sys/vmsystm.h>
|
#include <sys/vmsystm.h>
|
||||||
#include <sys/zfs_znode.h>
|
#include <sys/zfs_znode.h>
|
||||||
|
#include <linux/kmap_compat.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1056,6 +1057,7 @@ dmu_bio_copy(void *arg_buf, int size, struct bio *bio, size_t bio_offset)
|
||||||
char *bv_buf;
|
char *bv_buf;
|
||||||
int tocpy, bv_len, bv_offset;
|
int tocpy, bv_len, bv_offset;
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
|
void *paddr;
|
||||||
|
|
||||||
bio_for_each_segment4(bv, bvp, bio, iter) {
|
bio_for_each_segment4(bv, bvp, bio, iter) {
|
||||||
|
|
||||||
|
@ -1080,14 +1082,15 @@ dmu_bio_copy(void *arg_buf, int size, struct bio *bio, size_t bio_offset)
|
||||||
tocpy = MIN(bv_len, size - offset);
|
tocpy = MIN(bv_len, size - offset);
|
||||||
ASSERT3S(tocpy, >=, 0);
|
ASSERT3S(tocpy, >=, 0);
|
||||||
|
|
||||||
bv_buf = page_address(bvp->bv_page) + bv_offset;
|
paddr = zfs_kmap_atomic(bvp->bv_page, KM_USER0);
|
||||||
ASSERT3P(bv_buf, !=, NULL);
|
bv_buf = paddr + bv_offset;
|
||||||
|
ASSERT3P(paddr, !=, NULL);
|
||||||
|
|
||||||
if (bio_data_dir(bio) == WRITE)
|
if (bio_data_dir(bio) == WRITE)
|
||||||
memcpy(arg_buf + offset, bv_buf, tocpy);
|
memcpy(arg_buf + offset, bv_buf, tocpy);
|
||||||
else
|
else
|
||||||
memcpy(bv_buf, arg_buf + offset, tocpy);
|
memcpy(bv_buf, arg_buf + offset, tocpy);
|
||||||
|
zfs_kunmap_atomic(paddr, KM_USER0);
|
||||||
offset += tocpy;
|
offset += tocpy;
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
|
|
Loading…
Reference in New Issue