summaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorMaurizio Lombardi <mlombard@redhat.com>2014-12-10 14:16:53 -0800
committerJens Axboe <axboe@fb.com>2014-12-11 09:11:52 -0700
commitfcbf6a087a7e4d3f03d28333678a1010810a53c3 (patch)
tree8009f078e8f8f6b96581216923b39b9e0e9bdc2c /kernel
parent06a41a99d13d8e919e9a00a4849e6b85ae492592 (diff)
downloadlinux-fcbf6a087a7e4d3f03d28333678a1010810a53c3.tar.bz2
bio: modify __bio_add_page() to accept pages that don't start a new segment
The original behaviour is to refuse to add a new page if the maximum number of segments has been reached, regardless of the fact the page we are going to add can be merged into the last segment or not. Unfortunately, when the system runs under heavy memory fragmentation conditions, a driver may try to add multiple pages to the last segment. The original code won't accept them and EBUSY will be reported to userspace. This patch modifies the function so it refuses to add a page only in case the latter starts a new segment and the maximum number of segments has already been reached. The bug can be easily reproduced with the st driver: 1) set CONFIG_SCSI_MPT2SAS_MAX_SGE or CONFIG_SCSI_MPT3SAS_MAX_SGE to 16 2) modprobe st buffer_kbs=1024 3) #dd if=/dev/zero of=/dev/st0 bs=1M count=10 dd: error writing `/dev/st0': Device or resource busy Signed-off-by: Maurizio Lombardi <mlombard@redhat.com> Signed-off-by: Ming Lei <ming.lei@canonical.com> Cc: Jet Chen <jet.chen@intel.com> Cc: Tomas Henzl <thenzl@redhat.com> Cc: Jens Axboe <axboe@kernel.dk> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'kernel')
0 files changed, 0 insertions, 0 deletions