Merge branch 'for-linus' of git://git.kernel.dk/linux-2.6-block
* 'for-linus' of git://git.kernel.dk/linux-2.6-block: (27 commits) block: remove unused copy_io_context() Documentation: remove anticipatory scheduler info block: remove REQ_HARDBARRIER ioprio: rcu_read_lock/unlock protect find_task_by_vpid call (V2) ioprio: fix RCU locking around task dereference block: ioctl: fix information leak to userland block: read i_size with i_size_read() cciss: fix proc warning on attempt to remove non-existant directory bio: take care not overflow page count when mapping/copying user data block: limit vec count in bio_kmalloc() and bio_alloc_map_data() block: take care not to overflow when calculating total iov length block: check for proper length of iov entries in blk_rq_map_user_iov() cciss: remove controllers supported by hpsa cciss: use usleep_range not msleep for small sleeps cciss: limit commands allocated on reset_devices cciss: Use kernel provided PCI state save and restore functions cciss: fix board status waiting code drbd: Removed checks for REQ_HARDBARRIER on incomming BIOs drbd: REQ_HARDBARRIER -> REQ_FUA transition for meta data accesses drbd: Removed the BIO_RW_BARRIER support form the receiver/epoch code ...
This commit is contained in:
@@ -370,6 +370,9 @@ struct bio *bio_kmalloc(gfp_t gfp_mask, int nr_iovecs)
|
||||
{
|
||||
struct bio *bio;
|
||||
|
||||
if (nr_iovecs > UIO_MAXIOV)
|
||||
return NULL;
|
||||
|
||||
bio = kmalloc(sizeof(struct bio) + nr_iovecs * sizeof(struct bio_vec),
|
||||
gfp_mask);
|
||||
if (unlikely(!bio))
|
||||
@@ -697,8 +700,12 @@ static void bio_free_map_data(struct bio_map_data *bmd)
|
||||
static struct bio_map_data *bio_alloc_map_data(int nr_segs, int iov_count,
|
||||
gfp_t gfp_mask)
|
||||
{
|
||||
struct bio_map_data *bmd = kmalloc(sizeof(*bmd), gfp_mask);
|
||||
struct bio_map_data *bmd;
|
||||
|
||||
if (iov_count > UIO_MAXIOV)
|
||||
return NULL;
|
||||
|
||||
bmd = kmalloc(sizeof(*bmd), gfp_mask);
|
||||
if (!bmd)
|
||||
return NULL;
|
||||
|
||||
@@ -827,6 +834,12 @@ struct bio *bio_copy_user_iov(struct request_queue *q,
|
||||
end = (uaddr + iov[i].iov_len + PAGE_SIZE - 1) >> PAGE_SHIFT;
|
||||
start = uaddr >> PAGE_SHIFT;
|
||||
|
||||
/*
|
||||
* Overflow, abort
|
||||
*/
|
||||
if (end < start)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
nr_pages += end - start;
|
||||
len += iov[i].iov_len;
|
||||
}
|
||||
@@ -955,6 +968,12 @@ static struct bio *__bio_map_user_iov(struct request_queue *q,
|
||||
unsigned long end = (uaddr + len + PAGE_SIZE - 1) >> PAGE_SHIFT;
|
||||
unsigned long start = uaddr >> PAGE_SHIFT;
|
||||
|
||||
/*
|
||||
* Overflow, abort
|
||||
*/
|
||||
if (end < start)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
nr_pages += end - start;
|
||||
/*
|
||||
* buffer must be aligned to at least hardsector size for now
|
||||
@@ -982,7 +1001,7 @@ static struct bio *__bio_map_user_iov(struct request_queue *q,
|
||||
unsigned long start = uaddr >> PAGE_SHIFT;
|
||||
const int local_nr_pages = end - start;
|
||||
const int page_limit = cur_page + local_nr_pages;
|
||||
|
||||
|
||||
ret = get_user_pages_fast(uaddr, local_nr_pages,
|
||||
write_to_vm, &pages[cur_page]);
|
||||
if (ret < local_nr_pages) {
|
||||
|
||||
+16
-2
@@ -111,12 +111,14 @@ SYSCALL_DEFINE3(ioprio_set, int, which, int, who, int, ioprio)
|
||||
read_lock(&tasklist_lock);
|
||||
switch (which) {
|
||||
case IOPRIO_WHO_PROCESS:
|
||||
rcu_read_lock();
|
||||
if (!who)
|
||||
p = current;
|
||||
else
|
||||
p = find_task_by_vpid(who);
|
||||
if (p)
|
||||
ret = set_task_ioprio(p, ioprio);
|
||||
rcu_read_unlock();
|
||||
break;
|
||||
case IOPRIO_WHO_PGRP:
|
||||
if (!who)
|
||||
@@ -139,7 +141,12 @@ SYSCALL_DEFINE3(ioprio_set, int, which, int, who, int, ioprio)
|
||||
break;
|
||||
|
||||
do_each_thread(g, p) {
|
||||
if (__task_cred(p)->uid != who)
|
||||
int match;
|
||||
|
||||
rcu_read_lock();
|
||||
match = __task_cred(p)->uid == who;
|
||||
rcu_read_unlock();
|
||||
if (!match)
|
||||
continue;
|
||||
ret = set_task_ioprio(p, ioprio);
|
||||
if (ret)
|
||||
@@ -200,12 +207,14 @@ SYSCALL_DEFINE2(ioprio_get, int, which, int, who)
|
||||
read_lock(&tasklist_lock);
|
||||
switch (which) {
|
||||
case IOPRIO_WHO_PROCESS:
|
||||
rcu_read_lock();
|
||||
if (!who)
|
||||
p = current;
|
||||
else
|
||||
p = find_task_by_vpid(who);
|
||||
if (p)
|
||||
ret = get_task_ioprio(p);
|
||||
rcu_read_unlock();
|
||||
break;
|
||||
case IOPRIO_WHO_PGRP:
|
||||
if (!who)
|
||||
@@ -232,7 +241,12 @@ SYSCALL_DEFINE2(ioprio_get, int, which, int, who)
|
||||
break;
|
||||
|
||||
do_each_thread(g, p) {
|
||||
if (__task_cred(p)->uid != user->uid)
|
||||
int match;
|
||||
|
||||
rcu_read_lock();
|
||||
match = __task_cred(p)->uid == user->uid;
|
||||
rcu_read_unlock();
|
||||
if (!match)
|
||||
continue;
|
||||
tmpio = get_task_ioprio(p);
|
||||
if (tmpio < 0)
|
||||
|
||||
Reference in New Issue
Block a user