Skip to content

Commit

Permalink
target/user: Fix inconsistent kmap_atomic/kunmap_atomic
Browse files Browse the repository at this point in the history
Pointers that are mapped by kmap_atomic() + offset must
be unmapped without the offset. That would cause problems
if the SG element length exceeds the PAGE_SIZE limit.

Signed-off-by: Sagi Grimberg <sagig@mellanox.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
  • Loading branch information
Sagi Grimberg authored and Nicholas Bellinger committed Jun 23, 2015
1 parent 7c0d0d5 commit e2e21bd
Showing 1 changed file with 8 additions and 6 deletions.
14 changes: 8 additions & 6 deletions drivers/target/target_core_user.c
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,8 @@ static void alloc_and_scatter_data_area(struct tcmu_dev *udev,

/* Uh oh, we wrapped the buffer. Must split sg across 2 iovs. */
if (sg->length != copy_bytes) {
from += copy_bytes;
void *from_skip = from + copy_bytes;

copy_bytes = sg->length - copy_bytes;

(*iov)->iov_len = copy_bytes;
Expand All @@ -270,7 +271,7 @@ static void alloc_and_scatter_data_area(struct tcmu_dev *udev,
if (copy_data) {
to = (void *) udev->mb_addr +
udev->data_off + udev->data_head;
memcpy(to, from, copy_bytes);
memcpy(to, from_skip, copy_bytes);
tcmu_flush_dcache_range(to, copy_bytes);
}

Expand All @@ -281,7 +282,7 @@ static void alloc_and_scatter_data_area(struct tcmu_dev *udev,
copy_bytes, udev->data_size);
}

kunmap_atomic(from);
kunmap_atomic(from - sg->offset);
}
}

Expand Down Expand Up @@ -309,18 +310,19 @@ static void gather_and_free_data_area(struct tcmu_dev *udev,

/* Uh oh, wrapped the data buffer for this sg's data */
if (sg->length != copy_bytes) {
void *to_skip = to + copy_bytes;

from = (void *) udev->mb_addr +
udev->data_off + udev->data_tail;
WARN_ON(udev->data_tail);
to += copy_bytes;
copy_bytes = sg->length - copy_bytes;
tcmu_flush_dcache_range(from, copy_bytes);
memcpy(to, from, copy_bytes);
memcpy(to_skip, from, copy_bytes);

UPDATE_HEAD(udev->data_tail,
copy_bytes, udev->data_size);
}
kunmap_atomic(to);
kunmap_atomic(to - sg->offset);
}
}

Expand Down

0 comments on commit e2e21bd

Please sign in to comment.