block updates for 2.6.30
Subsystems (8)
Hi Linus,
Nothing particularly interesting in there, see below for full diff.
git://git.kernel.dk/linux-2.6-block.git for-2.6.30
Avishay Traeger (1):
block: Repeated lines in switching-sched.txt
Boaz Harrosh (3):
bsg: add support for tail queuing
block: WARN in __blk_put_request() for potential bio leak
bsg: Remove bogus check against request_queue->max_sectors
Dave Jones (1):
cpqarray: enable bus mastering
Ingo Molnar (1):
block: cleanup bio_alloc_bioset()
Jens Axboe (7):
block: don't create bio_vec slabs of less than the inline number
cciss: add BUILD_BUG_ON() for catching bad CommandList_struct alignment
block: remove various blk_queue_*() setting functions in blk_init_queue_node()
block: get rid of unused blkdev_free_rq() define
Move the default_backing_dev_info out of readahead.c and into backing-dev.c
btrfs: get rid of current_is_pdflush() in btrfs_btree_balance_dirty Get rid of pdflush_operation() in emergency sync and remount
Martin K. Petersen (1):
block: add private bio_set for bio integrity allocations
Nikanth Karthikesan (2):
loop: support barrier writes
loop: fix circular locking in loop_clr_fd()
Petros Koutoupis (2):
block: genhd.h comment needs updating
block: genhd.h cleanup patch
Documentation/block/switching-sched.txt | 6 -- block/blk-core.c | 13 ++--- block/blk-merge.c | 2 + block/bsg.c | 12 +++-- block/scsi_ioctl.c | 21 ++------ drivers/block/cciss.c | 7 +++ drivers/block/cpqarray.c | 1 + drivers/block/loop.c | 48 ++++++++++++++++-- fs/bio-integrity.c | 85 +++++++++--------------------- fs/bio.c | 87 ++++++++++++++++-------------- fs/btrfs/disk-io.c | 2 +- fs/super.c | 11 +++- fs/sync.c | 14 +++++- include/linux/bio.h | 18 ++----- include/linux/bsg.h | 8 +++ include/linux/genhd.h | 5 +- mm/backing-dev.c | 26 +++++++++- mm/readahead.c | 25 --------- 18 files changed, 205 insertions(+), 186 deletions(-)
---
Documentation/block/switching-sched.txt +0 -6
@@ -35,9 +35,3 @@ noop anticipatory deadline [cfq] # echo anticipatory > /sys/block/hda/queue/scheduler # cat /sys/block/hda/queue/scheduler noop [anticipatory] deadline cfq - -Each io queue has a set of io scheduler tunables associated with it. These -tunables control how the io scheduler works. You can find these entries -in: - -/sys/block/<device>/queue/iosched
block/blk-core.c +6 -7
@@ -603,13 +603,10 @@ blk_init_queue_node(request_fn_proc *rfn, spinlock_t *lock, int node_id) q->queue_flags =QUEUE_FLAG_DEFAULT ; q->queue_lock = lock; -blk_queue_segment_boundary (q,BLK_SEG_BOUNDARY_MASK ); - +/* +* This also sets hw/phys segments, boundary and size +*/ blk_queue_make_request (q, __make_request); -blk_queue_max_segment_size (q,MAX_SEGMENT_SIZE ); - -blk_queue_max_hw_segments (q,MAX_HW_SEGMENTS ); -blk_queue_max_phys_segments (q,MAX_PHYS_SEGMENTS ); q->sg_reserved_size =INT_MAX ;
@@ -735,7 +732,6 @@ static void freed_request(struct request_queue *q, int rw, int priv)__freed_request (q, rw ^1 ); } -#define blkdev_free_rq (list) list_entry((list)->next, struct request, queuelist)/* * Get a free request, queue_lock must be held. * Returns NULL on failure, with queue_lock held.
@@ -1066,6 +1062,9 @@ void __blk_put_request(struct request_queue *q, struct request *req)elv_completed_request (q, req); +/* this is a bio leak */ +WARN_ON (req->bio !=NULL ); +/* * Request may not have originated from ll_rw_blk. if not, * it didn't come out of our reserved rq pools
block/blk-merge.c +2 -0
@@ -403,6 +403,8 @@ static int attempt_merge(struct request_queue *q, struct request *req,if (blk_rq_cpu_valid (next)) req->cpu = next->cpu; +/* owner-ship of bio passed from next to req */ + next->bio =NULL ;__blk_put_request (q, next);return 1 ; }
block/bsg.c +7 -5
@@ -218,9 +218,6 @@ bsg_validate_sgv4_hdr(struct request_queue *q, struct sg_io_v4 *hdr, int *rw)if (hdr->guard !='Q' )return -EINVAL ; -if (hdr->dout_xfer_len > (q->max_sectors <<9 ) || - hdr->din_xfer_len > (q->max_sectors <<9 )) -return -EIO ;switch (hdr->protocol) {case BSG_PROTOCOL_SCSI :
@@ -353,6 +350,8 @@ static void bsg_rq_end_io(struct request *rq, int uptodate)static void bsg_add_command (struct bsg_device *bd,struct request_queue *q,struct bsg_command *bc,struct request *rq) { +int at_head = (0 == (bc->hdr.flags &BSG_FLAG_Q_AT_TAIL )); +/* * add bc command to busy queue and submit rq for io */
@@ -368,7 +367,7 @@ static void bsg_add_command(struct bsg_device *bd, struct request_queue *q,dprintk ("%s: queueing rq %p, bc %p\n" , bd->name, rq, bc); rq->end_io_data = bc; -blk_execute_rq_nowait (q,NULL , rq,1 , bsg_rq_end_io); +blk_execute_rq_nowait (q,NULL , rq, at_head, bsg_rq_end_io); }static struct bsg_command *bsg_next_done_cmd (struct bsg_device *bd)
@@ -924,6 +923,7 @@ static long bsg_ioctl(struct file *file, unsigned int cmd, unsigned long arg)struct request *rq;struct bio *bio, *bidi_bio =NULL ;struct sg_io_v4 hdr; +int at_head;u8 sense[SCSI_SENSE_BUFFERSIZE ];if (copy_from_user (&hdr, uarg,sizeof (hdr)))
@@ -936,7 +936,9 @@ static long bsg_ioctl(struct file *file, unsigned int cmd, unsigned long arg) bio = rq->bio;if (rq->next_rq) bidi_bio = rq->next_rq->bio; -blk_execute_rq (bd->queue,NULL , rq,0 ); + + at_head = (0 == (hdr.flags &BSG_FLAG_Q_AT_TAIL )); +blk_execute_rq (bd->queue,NULL , rq, at_head); ret =blk_complete_sgv4_hdr_rq (rq, &hdr, bio, bidi_bio);if (copy_to_user (uarg, &hdr,sizeof (hdr)))
block/scsi_ioctl.c +4 -17
@@ -214,21 +214,10 @@ static int blk_fill_sghdr_rq(struct request_queue *q, struct request *rq,return 0 ; } -/* -* unmap a request that was previously mapped to this sg_io_hdr. handles -* both sg and non-sg sg_io_hdr. -*/ -static int blk_unmap_sghdr_rq (struct request *rq,struct sg_io_hdr *hdr) -{ -blk_rq_unmap_user (rq->bio); -blk_put_request (rq); -return 0 ; -} -static int blk_complete_sghdr_rq (struct request *rq,struct sg_io_hdr *hdr,struct bio *bio) { -int r, ret =0 ; +int ret =0 ;/* * fill in all the output members
@@ -253,12 +242,10 @@ static int blk_complete_sghdr_rq(struct request *rq, struct sg_io_hdr *hdr, ret = -EFAULT ; } - rq->bio = bio; - r =blk_unmap_sghdr_rq (rq, hdr); -if (ret) - r = ret; +blk_rq_unmap_user (bio); +blk_put_request (rq); -return r; +return ret; } static int sg_io(struct request_queue *q, struct gendisk *bd_disk,
drivers/block/cciss.c +7 -0
@@ -3898,6 +3898,13 @@ static struct pci_driver cciss_pci_driver = {*/ static int __init cciss_init (void ) { +/* +* The hardware requires that commands are aligned on a 64-bit +* boundary. Given that we use pci_alloc_consistent() to allocate an +* array of them, the size must be a multiple of 8 bytes. +*/ +BUILD_BUG_ON (sizeof (CommandList_struct) %8 ); + printk(KERN_INFO DRIVER_NAME "\n");/* Register for our PCI devices */
drivers/block/cpqarray.c +1 -0
@@ -617,6 +617,7 @@ static int cpqarray_pci_init(ctlr_info_t *c, struct pci_dev *pdev)int i; c->pci_dev = pdev; +pci_set_master (pdev);if (pci_enable_device (pdev)) {printk (KERN_ERR "cpqarray: Unable to Enable PCI device\n" );return -1 ;
drivers/block/loop.c +44 -4
91 lines not on this page · raw message
fs/bio-integrity.c +26 -59
165 lines not on this page · raw message
fs/bio.c +46 -41
137 lines not on this page · raw message
fs/btrfs/disk-io.c +1 -1
@@ -2385,7 +2385,7 @@ void btrfs_btree_balance_dirty(struct btrfs_root *root, unsigned long nr)unsigned long thresh =32 *1024 *1024 ; tree = &BTRFS_I (root->fs_info->btree_inode)->io_tree; -if (current_is_pdflush () || current->flags &PF_MEMALLOC ) +if (current->flags &PF_MEMALLOC )return ; num_dirty = count_range_bits(tree, &start, (u64)-1,
fs/super.c +9 -2
@@ -674,7 +674,7 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force)return 0 ; } -static void do_emergency_remount (unsigned long foo) +static void do_emergency_remount (struct work_struct *work) {struct super_block *sb;
@@ -697,12 +697,19 @@ static void do_emergency_remount(unsigned long foo)spin_lock (&sb_lock); }spin_unlock (&sb_lock); +kfree (work);printk ("Emergency Remount complete\n" ); }void emergency_remount (void ) { -pdflush_operation (do_emergency_remount,0 ); +struct work_struct *work; + + work =kmalloc (sizeof (*work),GFP_ATOMIC ); +if (work) { +INIT_WORK (work, do_emergency_remount); +schedule_work (work); + } }/*
fs/sync.c +13 -1
@@ -42,9 +42,21 @@ SYSCALL_DEFINE0(sync)return 0 ; } +static void do_sync_work (struct work_struct *work) +{ +do_sync (0 ); +kfree (work); +} +void emergency_sync (void ) { -pdflush_operation (do_sync,0 ); +struct work_struct *work; + + work =kmalloc (sizeof (*work),GFP_ATOMIC ); +if (work) { +INIT_WORK (work, do_sync_work); +schedule_work (work); + } }/*
include/linux/bio.h +4 -14
@@ -426,9 +426,6 @@ struct bio_set {unsigned int front_pad;mempool_t *bio_pool; -#if defined(CONFIG_BLK_DEV_INTEGRITY ) -mempool_t *bio_integrity_pool; -#endif mempool_t *bvec_pool; };
@@ -519,9 +516,8 @@ static inline int bio_has_data(struct bio *bio)#define bio_integrity (bio) (bio->bi_integrity != NULL) -extern struct bio_integrity_payload *bio_integrity_alloc_bioset (struct bio *,gfp_t ,unsigned int ,struct bio_set *);extern struct bio_integrity_payload *bio_integrity_alloc (struct bio *,gfp_t ,unsigned int ); -extern void bio_integrity_free (struct bio *,struct bio_set *); +extern void bio_integrity_free (struct bio *);extern int bio_integrity_add_page (struct bio *,struct page *,unsigned int ,unsigned int );extern int bio_integrity_enabled (struct bio *bio);extern int bio_integrity_set_tag (struct bio *,void *,unsigned int );
@@ -531,27 +527,21 @@ extern void bio_integrity_endio(struct bio *, int);extern void bio_integrity_advance (struct bio *,unsigned int );extern void bio_integrity_trim (struct bio *,unsigned int ,unsigned int );extern void bio_integrity_split (struct bio *,struct bio_pair *,int ); -extern int bio_integrity_clone (struct bio *,struct bio *,gfp_t ,struct bio_set *); -extern int bioset_integrity_create (struct bio_set *,int ); -extern void bioset_integrity_free (struct bio_set *); -extern void bio_integrity_init_slab (void ); +extern int bio_integrity_clone (struct bio *,struct bio *,gfp_t );#else /* CONFIG_BLK_DEV_INTEGRITY */ #define bio_integrity (a) (0) -#define bioset_integrity_create (a, b) (0)#define bio_integrity_prep (a) (0)#define bio_integrity_enabled (a) (0) -#define bio_integrity_clone (a, b, c,d ) (0) -#define bioset_integrity_free (a) do { } while (0) -#define bio_integrity_free (a, b) do { } while (0) +#define bio_integrity_clone (a, b, c) (0) +#define bio_integrity_free (a) do { } while (0)#define bio_integrity_endio (a, b) do { } while (0)#define bio_integrity_advance (a, b) do { } while (0)#define bio_integrity_trim (a, b, c) do { } while (0)#define bio_integrity_split (a, b, c) do { } while (0)#define bio_integrity_set_tag (a, b, c) do { } while (0)#define bio_integrity_get_tag (a, b, c) do { } while (0) -#define bio_integrity_init_slab (a) do { } while (0)#endif /* CONFIG_BLK_DEV_INTEGRITY */
include/linux/bsg.h +8 -0
@@ -7,6 +7,14 @@#define BSG_SUB_PROTOCOL_SCSI_TMF 1#define BSG_SUB_PROTOCOL_SCSI_TRANSPORT 2 +/* +* For flags member below +* sg.h sg_io_hdr also has bits defined for it's flags member. However +* none of these bits are implemented/used by bsg. The bits below are +* allocated to not conflict with sg.h ones anyway. +*/ +#define BSG_FLAG_Q_AT_TAIL 0x10/* default, == 0 at this bit, is Q_AT_HEAD */ +struct sg_io_v4 {__s32 guard;/* [i] 'Q' to differentiate from v3 */ __u32 protocol;/* [i] 0 -> SCSI , .... */
include/linux/genhd.h +2 -3
@@ -333,11 +333,10 @@ static inline void part_dec_in_flight(struct hd_struct *part)part_to_disk (part)->part0.in_flight--; } -/* drivers/block/ll_rw_blk.c */ +/* block/blk-core.c */ extern void part_round_stats (int cpu,struct hd_struct *part); -/* drivers/block/genhd.c */ -extern int get_blkdev_list (char *,int ); +/* block/genhd.c */ extern void add_disk (struct gendisk *disk);extern void del_gendisk (struct gendisk *gp);extern void unlink_gendisk (struct gendisk *gp);
mm/backing-dev.c +25 -1
@@ -2,11 +2,24 @@#include <linux/wait.h> #include <linux/backing-dev.h> #include <linux/fs.h> +#include <linux/pagemap.h> #include <linux/sched.h> #include <linux/module.h> #include <linux/writeback.h> #include <linux/device.h> +void default_unplug_io_fn (struct backing_dev_info *bdi,struct page *page) +{ +} +EXPORT_SYMBOL (default_unplug_io_fn); + +struct backing_dev_info default_backing_dev_info = { + .ra_pages =VM_MAX_READAHEAD *1024 /PAGE_CACHE_SIZE , + .state =0 , + .capabilities =BDI_CAP_MAP_COPY , + .unplug_io_fn = default_unplug_io_fn, +}; +EXPORT_SYMBOL_GPL (default_backing_dev_info);static struct class *bdi_class;
@@ -166,9 +179,20 @@ static __init int bdi_class_init(void)bdi_debug_init ();return 0 ; } -postcore_initcall (bdi_class_init); +static int __init default_bdi_init (void ) +{ +int err; + + err =bdi_init (&default_backing_dev_info); +if (!err) +bdi_register (&default_backing_dev_info,NULL ,"default" ); + +return err; +} +subsys_initcall (default_bdi_init); +int bdi_register (struct backing_dev_info *bdi,struct device *parent,const char *fmt, ...) {
mm/readahead.c +0 -25
@@ -17,19 +17,6 @@#include <linux/pagevec.h> #include <linux/pagemap.h> -void default_unplug_io_fn (struct backing_dev_info *bdi,struct page *page) -{ -} -EXPORT_SYMBOL (default_unplug_io_fn); - -struct backing_dev_info default_backing_dev_info = { - .ra_pages =VM_MAX_READAHEAD *1024 /PAGE_CACHE_SIZE , - .state =0 , - .capabilities =BDI_CAP_MAP_COPY , - .unplug_io_fn = default_unplug_io_fn, -}; -EXPORT_SYMBOL_GPL (default_backing_dev_info); -/* * Initialise a struct file's readahead state. Assumes that the caller has * memset *ra to zero.
@@ -233,18 +220,6 @@ unsigned long max_sane_readahead(unsigned long nr) + node_page_state(numa_node_id(), NR_FREE_PAGES)) / 2); } -static int __init readahead_init (void ) -{ -int err; - - err =bdi_init (&default_backing_dev_info); -if (!err) -bdi_register (&default_backing_dev_info,NULL ,"default" ); - -return err; -} -subsys_initcall (readahead_init); -/* * Submit IO for the read-ahead request in file_ra_state. */
Signature · 1 line
Jens Axboe