From d853646973b96e58ef9697dc163fcba3eb972855 Mon Sep 17 00:00:00 2001 From: Peter Zijlstra Date: Thu, 20 Dec 2007 15:01:17 +0100 Subject: [PATCH] --- yaml --- r: 75108 b: refs/heads/master c: 67e2be02328b9a61a9c799fbdd4ec94d7da0c323 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/md/Kconfig | 2 +- trunk/drivers/md/dm-crypt.c | 31 +++++++++++++++-------------- trunk/drivers/md/dm-ioctl.c | 12 ++++++----- trunk/drivers/md/dm-table.c | 16 +-------------- trunk/drivers/md/dm.c | 31 +++++++---------------------- trunk/drivers/md/dm.h | 7 ------- trunk/fs/binfmt_aout.c | 1 + trunk/include/linux/device-mapper.h | 1 - trunk/kernel/sched_rt.c | 2 ++ 10 files changed, 36 insertions(+), 69 deletions(-) diff --git a/[refs] b/[refs] index aa26a264d37d..39cb0de1b666 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 17eb2c3b56afe72f76330b5db657c8b4fc98aa39 +refs/heads/master: 67e2be02328b9a61a9c799fbdd4ec94d7da0c323 diff --git a/trunk/drivers/md/Kconfig b/trunk/drivers/md/Kconfig index 3fa7c77d9bd9..9b6fbf044fd8 100644 --- a/trunk/drivers/md/Kconfig +++ b/trunk/drivers/md/Kconfig @@ -269,7 +269,7 @@ config DM_MULTIPATH_RDAC config DM_MULTIPATH_HP tristate "HP MSA multipath support (EXPERIMENTAL)" - depends on DM_MULTIPATH && BLK_DEV_DM && SCSI && EXPERIMENTAL + depends on DM_MULTIPATH && BLK_DEV_DM && EXPERIMENTAL ---help--- Multipath support for HP MSA (Active/Passive) series hardware. diff --git a/trunk/drivers/md/dm-crypt.c b/trunk/drivers/md/dm-crypt.c index 6b66ee46b87d..28c6ae095c56 100644 --- a/trunk/drivers/md/dm-crypt.c +++ b/trunk/drivers/md/dm-crypt.c @@ -398,8 +398,7 @@ static struct bio *crypt_alloc_buffer(struct dm_crypt_io *io, unsigned size) struct bio *clone; unsigned int nr_iovecs = (size + PAGE_SIZE - 1) >> PAGE_SHIFT; gfp_t gfp_mask = GFP_NOIO | __GFP_HIGHMEM; - unsigned i, len; - struct page *page; + unsigned int i; clone = bio_alloc_bioset(GFP_NOIO, nr_iovecs, cc->bs); if (!clone) @@ -408,8 +407,10 @@ static struct bio *crypt_alloc_buffer(struct dm_crypt_io *io, unsigned size) clone_init(io, clone); for (i = 0; i < nr_iovecs; i++) { - page = mempool_alloc(cc->page_pool, gfp_mask); - if (!page) + struct bio_vec *bv = bio_iovec_idx(clone, i); + + bv->bv_page = mempool_alloc(cc->page_pool, gfp_mask); + if (!bv->bv_page) break; /* @@ -420,14 +421,15 @@ static struct bio *crypt_alloc_buffer(struct dm_crypt_io *io, unsigned size) if (i == (MIN_BIO_PAGES - 1)) gfp_mask = (gfp_mask | __GFP_NOWARN) & ~__GFP_WAIT; - len = (size > PAGE_SIZE) ? PAGE_SIZE : size; - - if (!bio_add_page(clone, page, len, 0)) { - mempool_free(page, cc->page_pool); - break; - } + bv->bv_offset = 0; + if (size > PAGE_SIZE) + bv->bv_len = PAGE_SIZE; + else + bv->bv_len = size; - size -= len; + clone->bi_size += bv->bv_len; + clone->bi_vcnt++; + size -= bv->bv_len; } if (!clone->bi_size) { @@ -509,9 +511,6 @@ static void crypt_endio(struct bio *clone, int error) struct crypt_config *cc = io->target->private; unsigned read_io = bio_data_dir(clone) == READ; - if (unlikely(!bio_flagged(clone, BIO_UPTODATE) && !error)) - error = -EIO; - /* * free the processed pages */ @@ -520,8 +519,10 @@ static void crypt_endio(struct bio *clone, int error) goto out; } - if (unlikely(error)) + if (unlikely(!bio_flagged(clone, BIO_UPTODATE))) { + error = -EIO; goto out; + } bio_put(clone); kcryptd_queue_crypt(io); diff --git a/trunk/drivers/md/dm-ioctl.c b/trunk/drivers/md/dm-ioctl.c index 9627fa0f9470..138200bf5e0b 100644 --- a/trunk/drivers/md/dm-ioctl.c +++ b/trunk/drivers/md/dm-ioctl.c @@ -332,8 +332,6 @@ static int dm_hash_rename(const char *old, const char *new) dm_table_put(table); } - dm_kobject_uevent(hc->md); - dm_put(hc->md); up_write(&_hash_lock); kfree(old_name); @@ -1252,17 +1250,21 @@ static int target_message(struct dm_ioctl *param, size_t param_size) if (!table) goto out_argv; - ti = dm_table_find_target(table, tmsg->sector); - if (!dm_target_is_valid(ti)) { + if (tmsg->sector >= dm_table_get_size(table)) { DMWARN("Target message sector outside device."); r = -EINVAL; - } else if (ti->type->message) + goto out_table; + } + + ti = dm_table_find_target(table, tmsg->sector); + if (ti->type->message) r = ti->type->message(ti, argc, argv); else { DMWARN("Target type does not support messages"); r = -EINVAL; } + out_table: dm_table_put(table); out_argv: kfree(argv); diff --git a/trunk/drivers/md/dm-table.c b/trunk/drivers/md/dm-table.c index 47818d8249cb..e298d8d11f24 100644 --- a/trunk/drivers/md/dm-table.c +++ b/trunk/drivers/md/dm-table.c @@ -99,9 +99,6 @@ static void combine_restrictions_low(struct io_restrictions *lhs, lhs->max_segment_size = min_not_zero(lhs->max_segment_size, rhs->max_segment_size); - lhs->max_hw_sectors = - min_not_zero(lhs->max_hw_sectors, rhs->max_hw_sectors); - lhs->seg_boundary_mask = min_not_zero(lhs->seg_boundary_mask, rhs->seg_boundary_mask); @@ -192,10 +189,8 @@ static int alloc_targets(struct dm_table *t, unsigned int num) /* * Allocate both the target array and offset array at once. - * Append an empty entry to catch sectors beyond the end of - * the device. */ - n_highs = (sector_t *) dm_vcalloc(num + 1, sizeof(struct dm_target) + + n_highs = (sector_t *) dm_vcalloc(num, sizeof(struct dm_target) + sizeof(sector_t)); if (!n_highs) return -ENOMEM; @@ -569,9 +564,6 @@ void dm_set_device_limits(struct dm_target *ti, struct block_device *bdev) rs->max_segment_size = min_not_zero(rs->max_segment_size, q->max_segment_size); - rs->max_hw_sectors = - min_not_zero(rs->max_hw_sectors, q->max_hw_sectors); - rs->seg_boundary_mask = min_not_zero(rs->seg_boundary_mask, q->seg_boundary_mask); @@ -709,8 +701,6 @@ static void check_for_valid_limits(struct io_restrictions *rs) { if (!rs->max_sectors) rs->max_sectors = SAFE_MAX_SECTORS; - if (!rs->max_hw_sectors) - rs->max_hw_sectors = SAFE_MAX_SECTORS; if (!rs->max_phys_segments) rs->max_phys_segments = MAX_PHYS_SEGMENTS; if (!rs->max_hw_segments) @@ -877,9 +867,6 @@ struct dm_target *dm_table_get_target(struct dm_table *t, unsigned int index) /* * Search the btree for the correct target. - * - * Caller should check returned pointer with dm_target_is_valid() - * to trap I/O beyond end of device. */ struct dm_target *dm_table_find_target(struct dm_table *t, sector_t sector) { @@ -909,7 +896,6 @@ void dm_table_set_restrictions(struct dm_table *t, struct request_queue *q) q->max_hw_segments = t->limits.max_hw_segments; q->hardsect_size = t->limits.hardsect_size; q->max_segment_size = t->limits.max_segment_size; - q->max_hw_sectors = t->limits.max_hw_sectors; q->seg_boundary_mask = t->limits.seg_boundary_mask; q->bounce_pfn = t->limits.bounce_pfn; if (t->limits.no_cluster) diff --git a/trunk/drivers/md/dm.c b/trunk/drivers/md/dm.c index 88c0fd657825..07cbbb8eb3e0 100644 --- a/trunk/drivers/md/dm.c +++ b/trunk/drivers/md/dm.c @@ -672,19 +672,13 @@ static struct bio *clone_bio(struct bio *bio, sector_t sector, return clone; } -static int __clone_and_map(struct clone_info *ci) +static void __clone_and_map(struct clone_info *ci) { struct bio *clone, *bio = ci->bio; - struct dm_target *ti; - sector_t len = 0, max; + struct dm_target *ti = dm_table_find_target(ci->map, ci->sector); + sector_t len = 0, max = max_io_len(ci->md, ci->sector, ti); struct dm_target_io *tio; - ti = dm_table_find_target(ci->map, ci->sector); - if (!dm_target_is_valid(ti)) - return -EIO; - - max = max_io_len(ci->md, ci->sector, ti); - /* * Allocate a target io object. */ @@ -742,9 +736,6 @@ static int __clone_and_map(struct clone_info *ci) do { if (offset) { ti = dm_table_find_target(ci->map, ci->sector); - if (!dm_target_is_valid(ti)) - return -EIO; - max = max_io_len(ci->md, ci->sector, ti); tio = alloc_tio(ci->md); @@ -768,8 +759,6 @@ static int __clone_and_map(struct clone_info *ci) ci->idx++; } - - return 0; } /* @@ -778,7 +767,6 @@ static int __clone_and_map(struct clone_info *ci) static int __split_bio(struct mapped_device *md, struct bio *bio) { struct clone_info ci; - int error = 0; ci.map = dm_get_table(md); if (unlikely(!ci.map)) @@ -796,11 +784,11 @@ static int __split_bio(struct mapped_device *md, struct bio *bio) ci.idx = bio->bi_idx; start_io_acct(ci.io); - while (ci.sector_count && !error) - error = __clone_and_map(&ci); + while (ci.sector_count) + __clone_and_map(&ci); /* drop the extra reference count */ - dec_pending(ci.io, error); + dec_pending(ci.io, 0); dm_table_put(ci.map); return 0; @@ -1514,7 +1502,7 @@ int dm_resume(struct mapped_device *md) dm_table_unplug_all(map); - dm_kobject_uevent(md); + kobject_uevent(&md->disk->kobj, KOBJ_CHANGE); r = 0; @@ -1528,11 +1516,6 @@ int dm_resume(struct mapped_device *md) /*----------------------------------------------------------------- * Event notification. *---------------------------------------------------------------*/ -void dm_kobject_uevent(struct mapped_device *md) -{ - kobject_uevent(&md->disk->kobj, KOBJ_CHANGE); -} - uint32_t dm_next_uevent_seq(struct mapped_device *md) { return atomic_add_return(1, &md->uevent_seq); diff --git a/trunk/drivers/md/dm.h b/trunk/drivers/md/dm.h index b4584a39383b..4b3faa45277e 100644 --- a/trunk/drivers/md/dm.h +++ b/trunk/drivers/md/dm.h @@ -112,11 +112,6 @@ int dm_table_resume_targets(struct dm_table *t); int dm_table_any_congested(struct dm_table *t, int bdi_bits); void dm_table_unplug_all(struct dm_table *t); -/* - * To check the return value from dm_table_find_target(). - */ -#define dm_target_is_valid(t) ((t)->table) - /*----------------------------------------------------------------- * A registry of target types. *---------------------------------------------------------------*/ @@ -187,6 +182,4 @@ union map_info *dm_get_mapinfo(struct bio *bio); int dm_open_count(struct mapped_device *md); int dm_lock_for_deletion(struct mapped_device *md); -void dm_kobject_uevent(struct mapped_device *md); - #endif diff --git a/trunk/fs/binfmt_aout.c b/trunk/fs/binfmt_aout.c index 7596e1e94cde..e176d195e7e5 100644 --- a/trunk/fs/binfmt_aout.c +++ b/trunk/fs/binfmt_aout.c @@ -319,6 +319,7 @@ static int load_aout_binary(struct linux_binprm * bprm, struct pt_regs * regs) current->mm->free_area_cache = current->mm->mmap_base; current->mm->cached_hole_size = 0; + current->mm->mmap = NULL; compute_creds(bprm); current->flags &= ~PF_FORKNOEXEC; #ifdef __sparc__ diff --git a/trunk/include/linux/device-mapper.h b/trunk/include/linux/device-mapper.h index e765e191663d..b8b7c51389fe 100644 --- a/trunk/include/linux/device-mapper.h +++ b/trunk/include/linux/device-mapper.h @@ -115,7 +115,6 @@ struct io_restrictions { unsigned short max_hw_segments; unsigned short hardsect_size; unsigned int max_segment_size; - unsigned int max_hw_sectors; unsigned long seg_boundary_mask; unsigned long bounce_pfn; unsigned char no_cluster; /* inverted so that 0 is default */ diff --git a/trunk/kernel/sched_rt.c b/trunk/kernel/sched_rt.c index ee9c8b6529e9..9ba3daa03475 100644 --- a/trunk/kernel/sched_rt.c +++ b/trunk/kernel/sched_rt.c @@ -208,6 +208,8 @@ move_one_task_rt(struct rq *this_rq, int this_cpu, struct rq *busiest, static void task_tick_rt(struct rq *rq, struct task_struct *p) { + update_curr_rt(rq); + /* * RR tasks need a special form of timeslice management. * FIFO tasks have no timeslices.