diff options
Diffstat (limited to 'drivers/block')
| -rw-r--r-- | drivers/block/cciss.c | 90 | ||||
| -rw-r--r-- | drivers/block/cpqarray.c | 16 | ||||
| -rw-r--r-- | drivers/block/drbd/drbd_req.c | 2 | ||||
| -rw-r--r-- | drivers/block/drbd/drbd_req.h | 1 | ||||
| -rw-r--r-- | drivers/block/drbd/drbd_state.c | 7 | ||||
| -rw-r--r-- | drivers/block/mtip32xx/mtip32xx.c | 24 | ||||
| -rw-r--r-- | drivers/block/nvme.c | 17 | ||||
| -rw-r--r-- | drivers/block/ps3disk.c | 2 | ||||
| -rw-r--r-- | drivers/block/ps3vram.c | 4 | ||||
| -rw-r--r-- | drivers/block/sunvdc.c | 11 | ||||
| -rw-r--r-- | drivers/block/swim.c | 11 | ||||
| -rw-r--r-- | drivers/block/swim3.c | 3 | ||||
| -rw-r--r-- | drivers/block/umem.c | 3 | ||||
| -rw-r--r-- | drivers/block/virtio_blk.c | 20 | ||||
| -rw-r--r-- | drivers/block/xen-blkback/blkback.c | 18 | ||||
| -rw-r--r-- | drivers/block/xen-blkfront.c | 10 | ||||
| -rw-r--r-- | drivers/block/xsysace.c | 19 | 
17 files changed, 138 insertions, 120 deletions
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index 6526157edaf..ade58bc8f3c 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c @@ -181,8 +181,8 @@ static void cciss_geometry_inquiry(ctlr_info_t *h, int logvol,  			sector_t total_size,  			unsigned int block_size, InquiryData_struct *inq_buff,  				   drive_info_struct *drv); -static void __devinit cciss_interrupt_mode(ctlr_info_t *); -static int __devinit cciss_enter_simple_mode(struct ctlr_info *h); +static void cciss_interrupt_mode(ctlr_info_t *); +static int cciss_enter_simple_mode(struct ctlr_info *h);  static void start_io(ctlr_info_t *h);  static int sendcmd_withirq(ctlr_info_t *h, __u8 cmd, void *buff, size_t size,  			__u8 page_code, unsigned char scsi3addr[], @@ -199,14 +199,13 @@ static void cciss_device_release(struct device *dev);  static void cciss_free_gendisk(ctlr_info_t *h, int drv_index);  static void cciss_free_drive_info(ctlr_info_t *h, int drv_index);  static inline u32 next_command(ctlr_info_t *h); -static int __devinit cciss_find_cfg_addrs(struct pci_dev *pdev, -	void __iomem *vaddr, u32 *cfg_base_addr, u64 *cfg_base_addr_index, -	u64 *cfg_offset); -static int __devinit cciss_pci_find_memory_BAR(struct pci_dev *pdev, -	unsigned long *memory_bar); +static int cciss_find_cfg_addrs(struct pci_dev *pdev, void __iomem *vaddr, +				u32 *cfg_base_addr, u64 *cfg_base_addr_index, +				u64 *cfg_offset); +static int cciss_pci_find_memory_BAR(struct pci_dev *pdev, +				     unsigned long *memory_bar);  static inline u32 cciss_tag_discard_error_bits(ctlr_info_t *h, u32 tag); -static __devinit int write_driver_ver_to_cfgtable( -	CfgTable_struct __iomem *cfgtable); +static int write_driver_ver_to_cfgtable(CfgTable_struct __iomem *cfgtable);  /* performant mode helper functions */  static void  calc_bucket_map(int *bucket, int num_buckets, int nsgs, @@ -550,7 +549,7 @@ static const struct file_operations cciss_proc_fops = {  	.write	 = cciss_proc_write,  }; -static void __devinit cciss_procinit(ctlr_info_t *h) +static void cciss_procinit(ctlr_info_t *h)  {  	struct proc_dir_entry *pde; @@ -2663,8 +2662,8 @@ static int fill_cmd(ctlr_info_t *h, CommandList_struct *c, __u8 cmd, void *buff,  	return status;  } -static int __devinit cciss_send_reset(ctlr_info_t *h, unsigned char *scsi3addr, -	u8 reset_type) +static int cciss_send_reset(ctlr_info_t *h, unsigned char *scsi3addr, +			    u8 reset_type)  {  	CommandList_struct *c;  	int return_status; @@ -3919,7 +3918,7 @@ static void  calc_bucket_map(int bucket[], int num_buckets,  	}  } -static void __devinit cciss_wait_for_mode_change_ack(ctlr_info_t *h) +static void cciss_wait_for_mode_change_ack(ctlr_info_t *h)  {  	int i; @@ -3933,8 +3932,7 @@ static void __devinit cciss_wait_for_mode_change_ack(ctlr_info_t *h)  	}  } -static __devinit void cciss_enter_performant_mode(ctlr_info_t *h, -	u32 use_short_tags) +static void cciss_enter_performant_mode(ctlr_info_t *h, u32 use_short_tags)  {  	/* This is a bit complicated.  There are 8 registers on  	 * the controller which we write to to tell it 8 different @@ -4000,7 +3998,7 @@ static __devinit void cciss_enter_performant_mode(ctlr_info_t *h,  					" performant mode\n");  } -static void __devinit cciss_put_controller_into_performant_mode(ctlr_info_t *h) +static void cciss_put_controller_into_performant_mode(ctlr_info_t *h)  {  	__u32 trans_support; @@ -4062,7 +4060,7 @@ clean_up:   * controllers that are capable. If not, we use IO-APIC mode.   */ -static void __devinit cciss_interrupt_mode(ctlr_info_t *h) +static void cciss_interrupt_mode(ctlr_info_t *h)  {  #ifdef CONFIG_PCI_MSI  	int err; @@ -4108,7 +4106,7 @@ default_int_mode:  	return;  } -static int __devinit cciss_lookup_board_id(struct pci_dev *pdev, u32 *board_id) +static int cciss_lookup_board_id(struct pci_dev *pdev, u32 *board_id)  {  	int i;  	u32 subsystem_vendor_id, subsystem_device_id; @@ -4134,8 +4132,8 @@ static inline bool cciss_board_disabled(ctlr_info_t *h)  	return ((command & PCI_COMMAND_MEMORY) == 0);  } -static int __devinit cciss_pci_find_memory_BAR(struct pci_dev *pdev, -	unsigned long *memory_bar) +static int cciss_pci_find_memory_BAR(struct pci_dev *pdev, +				     unsigned long *memory_bar)  {  	int i; @@ -4151,8 +4149,8 @@ static int __devinit cciss_pci_find_memory_BAR(struct pci_dev *pdev,  	return -ENODEV;  } -static int __devinit cciss_wait_for_board_state(struct pci_dev *pdev, -	void __iomem *vaddr, int wait_for_ready) +static int cciss_wait_for_board_state(struct pci_dev *pdev, +				      void __iomem *vaddr, int wait_for_ready)  #define BOARD_READY 1  #define BOARD_NOT_READY 0  { @@ -4179,9 +4177,9 @@ static int __devinit cciss_wait_for_board_state(struct pci_dev *pdev,  	return -ENODEV;  } -static int __devinit cciss_find_cfg_addrs(struct pci_dev *pdev, -	void __iomem *vaddr, u32 *cfg_base_addr, u64 *cfg_base_addr_index, -	u64 *cfg_offset) +static int cciss_find_cfg_addrs(struct pci_dev *pdev, void __iomem *vaddr, +				u32 *cfg_base_addr, u64 *cfg_base_addr_index, +				u64 *cfg_offset)  {  	*cfg_base_addr = readl(vaddr + SA5_CTCFG_OFFSET);  	*cfg_offset = readl(vaddr + SA5_CTMEM_OFFSET); @@ -4195,7 +4193,7 @@ static int __devinit cciss_find_cfg_addrs(struct pci_dev *pdev,  	return 0;  } -static int __devinit cciss_find_cfgtables(ctlr_info_t *h) +static int cciss_find_cfgtables(ctlr_info_t *h)  {  	u64 cfg_offset;  	u32 cfg_base_addr; @@ -4224,7 +4222,7 @@ static int __devinit cciss_find_cfgtables(ctlr_info_t *h)  	return 0;  } -static void __devinit cciss_get_max_perf_mode_cmds(struct ctlr_info *h) +static void cciss_get_max_perf_mode_cmds(struct ctlr_info *h)  {  	h->max_commands = readl(&(h->cfgtable->MaxPerformantModeCommands)); @@ -4245,7 +4243,7 @@ static void __devinit cciss_get_max_perf_mode_cmds(struct ctlr_info *h)   * max commands, max SG elements without chaining, and with chaining,   * SG chain block size, etc.   */ -static void __devinit cciss_find_board_params(ctlr_info_t *h) +static void cciss_find_board_params(ctlr_info_t *h)  {  	cciss_get_max_perf_mode_cmds(h);  	h->nr_cmds = h->max_commands - 4 - cciss_tape_cmds; @@ -4304,7 +4302,7 @@ static inline void cciss_p600_dma_prefetch_quirk(ctlr_info_t *h)  	pci_write_config_dword(h->pdev, PCI_COMMAND_PARITY, dma_refetch);  } -static int __devinit cciss_pci_init(ctlr_info_t *h) +static int cciss_pci_init(ctlr_info_t *h)  {  	int prod_index, err; @@ -4424,7 +4422,8 @@ static void free_hba(ctlr_info_t *h)  }  /* Send a message CDB to the firmware. */ -static __devinit int cciss_message(struct pci_dev *pdev, unsigned char opcode, unsigned char type) +static int cciss_message(struct pci_dev *pdev, unsigned char opcode, +			 unsigned char type)  {  	typedef struct {  		CommandListHeader_struct CommandHeader; @@ -4571,14 +4570,13 @@ static int cciss_controller_hard_reset(struct pci_dev *pdev,  	return 0;  } -static __devinit void init_driver_version(char *driver_version, int len) +static void init_driver_version(char *driver_version, int len)  {  	memset(driver_version, 0, len);  	strncpy(driver_version, "cciss " DRIVER_NAME, len - 1);  } -static __devinit int write_driver_ver_to_cfgtable( -	CfgTable_struct __iomem *cfgtable) +static int write_driver_ver_to_cfgtable(CfgTable_struct __iomem *cfgtable)  {  	char *driver_version;  	int i, size = sizeof(cfgtable->driver_version); @@ -4594,8 +4592,8 @@ static __devinit int write_driver_ver_to_cfgtable(  	return 0;  } -static __devinit void read_driver_ver_from_cfgtable( -	CfgTable_struct __iomem *cfgtable, unsigned char *driver_ver) +static void read_driver_ver_from_cfgtable(CfgTable_struct __iomem *cfgtable, +					  unsigned char *driver_ver)  {  	int i; @@ -4603,8 +4601,7 @@ static __devinit void read_driver_ver_from_cfgtable(  		driver_ver[i] = readb(&cfgtable->driver_version[i]);  } -static __devinit int controller_reset_failed( -	CfgTable_struct __iomem *cfgtable) +static int controller_reset_failed(CfgTable_struct __iomem *cfgtable)  {  	char *driver_ver, *old_driver_ver; @@ -4627,7 +4624,7 @@ static __devinit int controller_reset_failed(  /* This does a hard reset of the controller using PCI power management   * states or using the doorbell register. */ -static __devinit int cciss_kdump_hard_reset_controller(struct pci_dev *pdev) +static int cciss_kdump_hard_reset_controller(struct pci_dev *pdev)  {  	u64 cfg_offset;  	u32 cfg_base_addr; @@ -4772,7 +4769,7 @@ unmap_vaddr:  	return rc;  } -static __devinit int cciss_init_reset_devices(struct pci_dev *pdev) +static int cciss_init_reset_devices(struct pci_dev *pdev)  {  	int rc, i; @@ -4806,7 +4803,7 @@ static __devinit int cciss_init_reset_devices(struct pci_dev *pdev)  	return 0;  } -static __devinit int cciss_allocate_cmd_pool(ctlr_info_t *h) +static int cciss_allocate_cmd_pool(ctlr_info_t *h)  {  	h->cmd_pool_bits = kmalloc(BITS_TO_LONGS(h->nr_cmds) *  		sizeof(unsigned long), GFP_KERNEL); @@ -4825,7 +4822,7 @@ static __devinit int cciss_allocate_cmd_pool(ctlr_info_t *h)  	return 0;  } -static __devinit int cciss_allocate_scatterlists(ctlr_info_t *h) +static int cciss_allocate_scatterlists(ctlr_info_t *h)  {  	int i; @@ -4893,7 +4890,7 @@ static int cciss_request_irq(ctlr_info_t *h,  	return -1;  } -static int __devinit cciss_kdump_soft_reset(ctlr_info_t *h) +static int cciss_kdump_soft_reset(ctlr_info_t *h)  {  	if (cciss_send_reset(h, CTLR_LUNID, CCISS_RESET_TYPE_CONTROLLER)) {  		dev_warn(&h->pdev->dev, "Resetting array controller failed.\n"); @@ -4952,8 +4949,7 @@ static void cciss_undo_allocations_after_kdump_soft_reset(ctlr_info_t *h)   *  stealing all these major device numbers.   *  returns the number of block devices registered.   */ -static int __devinit cciss_init_one(struct pci_dev *pdev, -				    const struct pci_device_id *ent) +static int cciss_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)  {  	int i;  	int j = 0; @@ -5207,7 +5203,7 @@ static void cciss_shutdown(struct pci_dev *pdev)  	free_irq(h->intr[h->intr_mode], h);  } -static int __devinit cciss_enter_simple_mode(struct ctlr_info *h) +static int cciss_enter_simple_mode(struct ctlr_info *h)  {  	u32 trans_support; @@ -5229,7 +5225,7 @@ static int __devinit cciss_enter_simple_mode(struct ctlr_info *h)  } -static void __devexit cciss_remove_one(struct pci_dev *pdev) +static void cciss_remove_one(struct pci_dev *pdev)  {  	ctlr_info_t *h;  	int i, j; @@ -5308,7 +5304,7 @@ static void __devexit cciss_remove_one(struct pci_dev *pdev)  static struct pci_driver cciss_pci_driver = {  	.name = "cciss",  	.probe = cciss_init_one, -	.remove = __devexit_p(cciss_remove_one), +	.remove = cciss_remove_one,  	.id_table = cciss_pci_device_id,	/* id_table */  	.shutdown = cciss_shutdown,  }; diff --git a/drivers/block/cpqarray.c b/drivers/block/cpqarray.c index 9125bbeacd4..3f087133a25 100644 --- a/drivers/block/cpqarray.c +++ b/drivers/block/cpqarray.c @@ -320,7 +320,7 @@ static void release_io_mem(ctlr_info_t *c)  	c->io_mem_length = 0;  } -static void __devexit cpqarray_remove_one(int i) +static void cpqarray_remove_one(int i)  {  	int j;  	char buff[4]; @@ -352,7 +352,7 @@ static void __devexit cpqarray_remove_one(int i)  	free_hba(i);  } -static void __devexit cpqarray_remove_one_pci (struct pci_dev *pdev) +static void cpqarray_remove_one_pci(struct pci_dev *pdev)  {  	int i;  	ctlr_info_t *tmp_ptr; @@ -377,7 +377,7 @@ static void __devexit cpqarray_remove_one_pci (struct pci_dev *pdev)  /* removing an instance that was not removed automatically..   * must be an eisa card.   */ -static void __devexit cpqarray_remove_one_eisa (int i) +static void cpqarray_remove_one_eisa(int i)  {  	if (hba[i] == NULL) {  		printk(KERN_ERR "cpqarray: controller %d appears to have" @@ -388,7 +388,7 @@ static void __devexit cpqarray_remove_one_eisa (int i)  }  /* pdev is NULL for eisa */ -static int __devinit cpqarray_register_ctlr( int i, struct pci_dev *pdev) +static int cpqarray_register_ctlr(int i, struct pci_dev *pdev)  {  	struct request_queue *q;  	int j; @@ -505,8 +505,8 @@ Enomem4:  	return -1;  } -static int __devinit cpqarray_init_one( struct pci_dev *pdev, -	const struct pci_device_id *ent) +static int cpqarray_init_one(struct pci_dev *pdev, +			     const struct pci_device_id *ent)  {  	int i; @@ -536,7 +536,7 @@ static int __devinit cpqarray_init_one( struct pci_dev *pdev,  static struct pci_driver cpqarray_pci_driver = {  	.name = "cpqarray",  	.probe = cpqarray_init_one, -	.remove = __devexit_p(cpqarray_remove_one_pci), +	.remove = cpqarray_remove_one_pci,  	.id_table = cpqarray_pci_device_id,  }; @@ -742,7 +742,7 @@ __setup("smart2=", cpqarray_setup);  /*   * Find an EISA controller's signature.  Set up an hba if we find it.   */ -static int __devinit cpqarray_eisa_detect(void) +static int cpqarray_eisa_detect(void)  {  	int i=0, j;  	__u32 board_id; diff --git a/drivers/block/drbd/drbd_req.c b/drivers/block/drbd/drbd_req.c index f58a4a4b4df..2b8303ad63c 100644 --- a/drivers/block/drbd/drbd_req.c +++ b/drivers/block/drbd/drbd_req.c @@ -168,7 +168,7 @@ static void wake_all_senders(struct drbd_tconn *tconn) {  }  /* must hold resource->req_lock */ -static void start_new_tl_epoch(struct drbd_tconn *tconn) +void start_new_tl_epoch(struct drbd_tconn *tconn)  {  	/* no point closing an epoch, if it is empty, anyways. */  	if (tconn->current_tle_writes == 0) diff --git a/drivers/block/drbd/drbd_req.h b/drivers/block/drbd/drbd_req.h index 016de6b8bb5..c08d22964d0 100644 --- a/drivers/block/drbd/drbd_req.h +++ b/drivers/block/drbd/drbd_req.h @@ -267,6 +267,7 @@ struct bio_and_error {  	int error;  }; +extern void start_new_tl_epoch(struct drbd_tconn *tconn);  extern void drbd_req_destroy(struct kref *kref);  extern void _req_may_be_done(struct drbd_request *req,  		struct bio_and_error *m); diff --git a/drivers/block/drbd/drbd_state.c b/drivers/block/drbd/drbd_state.c index 53bf6182bac..0fe220cfb9e 100644 --- a/drivers/block/drbd/drbd_state.c +++ b/drivers/block/drbd/drbd_state.c @@ -931,6 +931,7 @@ __drbd_set_state(struct drbd_conf *mdev, union drbd_state ns,  	enum drbd_state_rv rv = SS_SUCCESS;  	enum sanitize_state_warnings ssw;  	struct after_state_chg_work *ascw; +	bool did_remote, should_do_remote;  	os = drbd_read_state(mdev); @@ -981,11 +982,17 @@ __drbd_set_state(struct drbd_conf *mdev, union drbd_state ns,  	    (os.disk != D_DISKLESS && ns.disk == D_DISKLESS))  		atomic_inc(&mdev->local_cnt); +	did_remote = drbd_should_do_remote(mdev->state);  	mdev->state.i = ns.i; +	should_do_remote = drbd_should_do_remote(mdev->state);  	mdev->tconn->susp = ns.susp;  	mdev->tconn->susp_nod = ns.susp_nod;  	mdev->tconn->susp_fen = ns.susp_fen; +	/* put replicated vs not-replicated requests in seperate epochs */ +	if (did_remote != should_do_remote) +		start_new_tl_epoch(mdev->tconn); +  	if (os.disk == D_ATTACHING && ns.disk >= D_NEGOTIATING)  		drbd_print_uuids(mdev, "attached to UUIDs"); diff --git a/drivers/block/mtip32xx/mtip32xx.c b/drivers/block/mtip32xx/mtip32xx.c index 9694dd99bbb..3fd10099045 100644 --- a/drivers/block/mtip32xx/mtip32xx.c +++ b/drivers/block/mtip32xx/mtip32xx.c @@ -626,12 +626,13 @@ static void mtip_timeout_function(unsigned long int data)  		}  	} -	if (cmdto_cnt && !test_bit(MTIP_PF_IC_ACTIVE_BIT, &port->flags)) { +	if (cmdto_cnt) {  		print_tags(port->dd, "timed out", tagaccum, cmdto_cnt); - -		mtip_restart_port(port); +		if (!test_bit(MTIP_PF_IC_ACTIVE_BIT, &port->flags)) { +			mtip_restart_port(port); +			wake_up_interruptible(&port->svc_wait); +		}  		clear_bit(MTIP_PF_EH_ACTIVE_BIT, &port->flags); -		wake_up_interruptible(&port->svc_wait);  	}  	if (port->ic_pause_timer) { @@ -3887,7 +3888,12 @@ static int mtip_block_remove(struct driver_data *dd)  	 * Delete our gendisk structure. This also removes the device  	 * from /dev  	 */ -	del_gendisk(dd->disk); +	if (dd->disk) { +		if (dd->disk->queue) +			del_gendisk(dd->disk); +		else +			put_disk(dd->disk); +	}  	spin_lock(&rssd_index_lock);  	ida_remove(&rssd_index_ida, dd->index); @@ -3921,7 +3927,13 @@ static int mtip_block_shutdown(struct driver_data *dd)  		"Shutting down %s ...\n", dd->disk->disk_name);  	/* Delete our gendisk structure, and cleanup the blk queue. */ -	del_gendisk(dd->disk); +	if (dd->disk) { +		if (dd->disk->queue) +			del_gendisk(dd->disk); +		else +			put_disk(dd->disk); +	} +  	spin_lock(&rssd_index_lock);  	ida_remove(&rssd_index_ida, dd->index); diff --git a/drivers/block/nvme.c b/drivers/block/nvme.c index 931769e133e..07fb2dfaae1 100644 --- a/drivers/block/nvme.c +++ b/drivers/block/nvme.c @@ -975,8 +975,8 @@ static int queue_request_irq(struct nvme_dev *dev, struct nvme_queue *nvmeq,  				IRQF_DISABLED | IRQF_SHARED, name, nvmeq);  } -static __devinit struct nvme_queue *nvme_create_queue(struct nvme_dev *dev, -					int qid, int cq_size, int vector) +static struct nvme_queue *nvme_create_queue(struct nvme_dev *dev, int qid, +					    int cq_size, int vector)  {  	int result;  	struct nvme_queue *nvmeq = nvme_alloc_queue(dev, qid, cq_size, vector); @@ -1011,7 +1011,7 @@ static __devinit struct nvme_queue *nvme_create_queue(struct nvme_dev *dev,  	return ERR_PTR(result);  } -static int __devinit nvme_configure_admin_queue(struct nvme_dev *dev) +static int nvme_configure_admin_queue(struct nvme_dev *dev)  {  	int result = 0;  	u32 aqa; @@ -1408,7 +1408,7 @@ static int set_queue_count(struct nvme_dev *dev, int count)  	return min(result & 0xffff, result >> 16) + 1;  } -static int __devinit nvme_setup_io_queues(struct nvme_dev *dev) +static int nvme_setup_io_queues(struct nvme_dev *dev)  {  	int result, cpu, i, nr_io_queues, db_bar_size, q_depth; @@ -1481,7 +1481,7 @@ static void nvme_free_queues(struct nvme_dev *dev)  		nvme_free_queue(dev, i);  } -static int __devinit nvme_dev_add(struct nvme_dev *dev) +static int nvme_dev_add(struct nvme_dev *dev)  {  	int res, nn, i;  	struct nvme_ns *ns, *next; @@ -1619,8 +1619,7 @@ static void nvme_release_instance(struct nvme_dev *dev)  	spin_unlock(&dev_list_lock);  } -static int __devinit nvme_probe(struct pci_dev *pdev, -						const struct pci_device_id *id) +static int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id)  {  	int bars, result = -ENOMEM;  	struct nvme_dev *dev; @@ -1702,7 +1701,7 @@ static int __devinit nvme_probe(struct pci_dev *pdev,  	return result;  } -static void __devexit nvme_remove(struct pci_dev *pdev) +static void nvme_remove(struct pci_dev *pdev)  {  	struct nvme_dev *dev = pci_get_drvdata(pdev);  	nvme_dev_remove(dev); @@ -1747,7 +1746,7 @@ static struct pci_driver nvme_driver = {  	.name		= "nvme",  	.id_table	= nvme_id_table,  	.probe		= nvme_probe, -	.remove		= __devexit_p(nvme_remove), +	.remove		= nvme_remove,  	.suspend	= nvme_suspend,  	.resume		= nvme_resume,  	.err_handler	= &nvme_err_handler, diff --git a/drivers/block/ps3disk.c b/drivers/block/ps3disk.c index da0abc1838c..d754a88d758 100644 --- a/drivers/block/ps3disk.c +++ b/drivers/block/ps3disk.c @@ -401,7 +401,7 @@ static unsigned long ps3disk_mask;  static DEFINE_MUTEX(ps3disk_mask_mutex); -static int __devinit ps3disk_probe(struct ps3_system_bus_device *_dev) +static int ps3disk_probe(struct ps3_system_bus_device *_dev)  {  	struct ps3_storage_device *dev = to_ps3_storage_device(&_dev->core);  	struct ps3disk_private *priv; diff --git a/drivers/block/ps3vram.c b/drivers/block/ps3vram.c index f58cdcfb305..75e112d6600 100644 --- a/drivers/block/ps3vram.c +++ b/drivers/block/ps3vram.c @@ -536,7 +536,7 @@ static const struct file_operations ps3vram_proc_fops = {  	.release	= single_release,  }; -static void __devinit ps3vram_proc_init(struct ps3_system_bus_device *dev) +static void ps3vram_proc_init(struct ps3_system_bus_device *dev)  {  	struct ps3vram_priv *priv = ps3_system_bus_get_drvdata(dev);  	struct proc_dir_entry *pde; @@ -618,7 +618,7 @@ static void ps3vram_make_request(struct request_queue *q, struct bio *bio)  	} while (bio);  } -static int __devinit ps3vram_probe(struct ps3_system_bus_device *dev) +static int ps3vram_probe(struct ps3_system_bus_device *dev)  {  	struct ps3vram_priv *priv;  	int error, status; diff --git a/drivers/block/sunvdc.c b/drivers/block/sunvdc.c index 9dcf76a10bb..5814deb6963 100644 --- a/drivers/block/sunvdc.c +++ b/drivers/block/sunvdc.c @@ -25,7 +25,7 @@  #define DRV_MODULE_VERSION	"1.0"  #define DRV_MODULE_RELDATE	"June 25, 2007" -static char version[] __devinitdata = +static char version[] =  	DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";  MODULE_AUTHOR("David S. Miller (davem@davemloft.net)");  MODULE_DESCRIPTION("Sun LDOM virtual disk client driver"); @@ -461,7 +461,7 @@ static int generic_request(struct vdc_port *port, u8 op, void *buf, int len)  	int op_len, err;  	void *req_buf; -	if (!(((u64)1 << ((u64)op - 1)) & port->operations)) +	if (!(((u64)1 << (u64)op) & port->operations))  		return -EOPNOTSUPP;  	switch (op) { @@ -592,7 +592,7 @@ static int generic_request(struct vdc_port *port, u8 op, void *buf, int len)  	return err;  } -static int __devinit vdc_alloc_tx_ring(struct vdc_port *port) +static int vdc_alloc_tx_ring(struct vdc_port *port)  {  	struct vio_dring_state *dr = &port->vio.drings[VIO_DRIVER_TX_RING];  	unsigned long len, entry_size; @@ -725,7 +725,7 @@ static struct vio_driver_ops vdc_vio_ops = {  	.handshake_complete	= vdc_handshake_complete,  }; -static void __devinit print_version(void) +static void print_version(void)  {  	static int version_printed; @@ -733,8 +733,7 @@ static void __devinit print_version(void)  		printk(KERN_INFO "%s", version);  } -static int __devinit vdc_port_probe(struct vio_dev *vdev, -				    const struct vio_device_id *id) +static int vdc_port_probe(struct vio_dev *vdev, const struct vio_device_id *id)  {  	struct mdesc_handle *hp;  	struct vdc_port *port; diff --git a/drivers/block/swim.c b/drivers/block/swim.c index 6d5a914b961..765fa2b3d33 100644 --- a/drivers/block/swim.c +++ b/drivers/block/swim.c @@ -788,8 +788,7 @@ static struct kobject *floppy_find(dev_t dev, int *part, void *data)  	return get_disk(swd->unit[drive].disk);  } -static int __devinit swim_add_floppy(struct swim_priv *swd, -				     enum drive_location location) +static int swim_add_floppy(struct swim_priv *swd, enum drive_location location)  {  	struct floppy_state *fs = &swd->unit[swd->floppy_count];  	struct swim __iomem *base = swd->base; @@ -812,7 +811,7 @@ static int __devinit swim_add_floppy(struct swim_priv *swd,  	return 0;  } -static int __devinit swim_floppy_init(struct swim_priv *swd) +static int swim_floppy_init(struct swim_priv *swd)  {  	int err;  	int drive; @@ -875,7 +874,7 @@ exit_put_disks:  	return err;  } -static int __devinit swim_probe(struct platform_device *dev) +static int swim_probe(struct platform_device *dev)  {  	struct resource *res;  	struct swim __iomem *swim_base; @@ -936,7 +935,7 @@ out:  	return ret;  } -static int __devexit swim_remove(struct platform_device *dev) +static int swim_remove(struct platform_device *dev)  {  	struct swim_priv *swd = platform_get_drvdata(dev);  	int drive; @@ -972,7 +971,7 @@ static int __devexit swim_remove(struct platform_device *dev)  static struct platform_driver swim_driver = {  	.probe  = swim_probe, -	.remove = __devexit_p(swim_remove), +	.remove = swim_remove,  	.driver   = {  		.name	= CARDNAME,  		.owner	= THIS_MODULE, diff --git a/drivers/block/swim3.c b/drivers/block/swim3.c index 89ddab127e3..57763c54363 100644 --- a/drivers/block/swim3.c +++ b/drivers/block/swim3.c @@ -1194,7 +1194,8 @@ static int swim3_add_device(struct macio_dev *mdev, int index)  	return rc;  } -static int __devinit swim3_attach(struct macio_dev *mdev, const struct of_device_id *match) +static int swim3_attach(struct macio_dev *mdev, +			const struct of_device_id *match)  {  	struct gendisk *disk;  	int index, rc; diff --git a/drivers/block/umem.c b/drivers/block/umem.c index eb0d8216f55..ad70868f8a9 100644 --- a/drivers/block/umem.c +++ b/drivers/block/umem.c @@ -789,8 +789,7 @@ static const struct block_device_operations mm_fops = {  	.revalidate_disk = mm_revalidate,  }; -static int __devinit mm_pci_probe(struct pci_dev *dev, -				const struct pci_device_id *id) +static int mm_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)  {  	int ret = -ENODEV;  	struct cardinfo *card = &cards[num_cards]; diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c index 0bdde8fba39..8ad21a25bc0 100644 --- a/drivers/block/virtio_blk.c +++ b/drivers/block/virtio_blk.c @@ -696,7 +696,7 @@ static const struct device_attribute dev_attr_cache_type_rw =  	__ATTR(cache_type, S_IRUGO|S_IWUSR,  	       virtblk_cache_type_show, virtblk_cache_type_store); -static int __devinit virtblk_probe(struct virtio_device *vdev) +static int virtblk_probe(struct virtio_device *vdev)  {  	struct virtio_blk *vblk;  	struct request_queue *q; @@ -885,10 +885,11 @@ out:  	return err;  } -static void __devexit virtblk_remove(struct virtio_device *vdev) +static void virtblk_remove(struct virtio_device *vdev)  {  	struct virtio_blk *vblk = vdev->priv;  	int index = vblk->index; +	int refc;  	/* Prevent config work handler from accessing the device. */  	mutex_lock(&vblk->config_lock); @@ -903,11 +904,15 @@ static void __devexit virtblk_remove(struct virtio_device *vdev)  	flush_work(&vblk->config_work); +	refc = atomic_read(&disk_to_dev(vblk->disk)->kobj.kref.refcount);  	put_disk(vblk->disk);  	mempool_destroy(vblk->pool);  	vdev->config->del_vqs(vdev);  	kfree(vblk); -	ida_simple_remove(&vd_index_ida, index); + +	/* Only free device id if we don't have any users */ +	if (refc == 1) +		ida_simple_remove(&vd_index_ida, index);  }  #ifdef CONFIG_PM @@ -961,19 +966,14 @@ static unsigned int features[] = {  	VIRTIO_BLK_F_WCE, VIRTIO_BLK_F_TOPOLOGY, VIRTIO_BLK_F_CONFIG_WCE  }; -/* - * virtio_blk causes spurious section mismatch warning by - * simultaneously referring to a __devinit and a __devexit function. - * Use __refdata to avoid this warning. - */ -static struct virtio_driver __refdata virtio_blk = { +static struct virtio_driver virtio_blk = {  	.feature_table		= features,  	.feature_table_size	= ARRAY_SIZE(features),  	.driver.name		= KBUILD_MODNAME,  	.driver.owner		= THIS_MODULE,  	.id_table		= id_table,  	.probe			= virtblk_probe, -	.remove			= __devexit_p(virtblk_remove), +	.remove			= virtblk_remove,  	.config_changed		= virtblk_config_changed,  #ifdef CONFIG_PM  	.freeze			= virtblk_freeze, diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c index 74374fb762a..5ac841ff6cc 100644 --- a/drivers/block/xen-blkback/blkback.c +++ b/drivers/block/xen-blkback/blkback.c @@ -161,10 +161,12 @@ static int dispatch_rw_block_io(struct xen_blkif *blkif,  static void make_response(struct xen_blkif *blkif, u64 id,  			  unsigned short op, int st); -#define foreach_grant(pos, rbtree, node) \ -	for ((pos) = container_of(rb_first((rbtree)), typeof(*(pos)), node); \ +#define foreach_grant_safe(pos, n, rbtree, node) \ +	for ((pos) = container_of(rb_first((rbtree)), typeof(*(pos)), node), \ +	     (n) = rb_next(&(pos)->node); \  	     &(pos)->node != NULL; \ -	     (pos) = container_of(rb_next(&(pos)->node), typeof(*(pos)), node)) +	     (pos) = container_of(n, typeof(*(pos)), node), \ +	     (n) = (&(pos)->node != NULL) ? rb_next(&(pos)->node) : NULL)  static void add_persistent_gnt(struct rb_root *root, @@ -217,10 +219,11 @@ static void free_persistent_gnts(struct rb_root *root, unsigned int num)  	struct gnttab_unmap_grant_ref unmap[BLKIF_MAX_SEGMENTS_PER_REQUEST];  	struct page *pages[BLKIF_MAX_SEGMENTS_PER_REQUEST];  	struct persistent_gnt *persistent_gnt; +	struct rb_node *n;  	int ret = 0;  	int segs_to_unmap = 0; -	foreach_grant(persistent_gnt, root, node) { +	foreach_grant_safe(persistent_gnt, n, root, node) {  		BUG_ON(persistent_gnt->handle ==  			BLKBACK_INVALID_HANDLE);  		gnttab_set_unmap_op(&unmap[segs_to_unmap], @@ -230,9 +233,6 @@ static void free_persistent_gnts(struct rb_root *root, unsigned int num)  			persistent_gnt->handle);  		pages[segs_to_unmap] = persistent_gnt->page; -		rb_erase(&persistent_gnt->node, root); -		kfree(persistent_gnt); -		num--;  		if (++segs_to_unmap == BLKIF_MAX_SEGMENTS_PER_REQUEST ||  			!rb_next(&persistent_gnt->node)) { @@ -241,6 +241,10 @@ static void free_persistent_gnts(struct rb_root *root, unsigned int num)  			BUG_ON(ret);  			segs_to_unmap = 0;  		} + +		rb_erase(&persistent_gnt->node, root); +		kfree(persistent_gnt); +		num--;  	}  	BUG_ON(num != 0);  } diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index 96e9b00db08..11043c18ac5 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c @@ -792,6 +792,7 @@ static void blkif_free(struct blkfront_info *info, int suspend)  {  	struct llist_node *all_gnts;  	struct grant *persistent_gnt; +	struct llist_node *n;  	/* Prevent new requests being issued until we fix things up. */  	spin_lock_irq(&info->io_lock); @@ -804,7 +805,7 @@ static void blkif_free(struct blkfront_info *info, int suspend)  	/* Remove all persistent grants */  	if (info->persistent_gnts_c) {  		all_gnts = llist_del_all(&info->persistent_gnts); -		llist_for_each_entry(persistent_gnt, all_gnts, node) { +		llist_for_each_entry_safe(persistent_gnt, n, all_gnts, node) {  			gnttab_end_foreign_access(persistent_gnt->gref, 0, 0UL);  			__free_page(pfn_to_page(persistent_gnt->pfn));  			kfree(persistent_gnt); @@ -835,7 +836,7 @@ static void blkif_free(struct blkfront_info *info, int suspend)  static void blkif_completion(struct blk_shadow *s, struct blkfront_info *info,  			     struct blkif_response *bret)  { -	int i; +	int i = 0;  	struct bio_vec *bvec;  	struct req_iterator iter;  	unsigned long flags; @@ -852,7 +853,8 @@ static void blkif_completion(struct blk_shadow *s, struct blkfront_info *info,  		 */  		rq_for_each_segment(bvec, s->request, iter) {  			BUG_ON((bvec->bv_offset + bvec->bv_len) > PAGE_SIZE); -			i = offset >> PAGE_SHIFT; +			if (bvec->bv_offset < offset) +				i++;  			BUG_ON(i >= s->req.u.rw.nr_segments);  			shared_data = kmap_atomic(  				pfn_to_page(s->grants_used[i]->pfn)); @@ -861,7 +863,7 @@ static void blkif_completion(struct blk_shadow *s, struct blkfront_info *info,  				bvec->bv_len);  			bvec_kunmap_irq(bvec_data, &flags);  			kunmap_atomic(shared_data); -			offset += bvec->bv_len; +			offset = bvec->bv_offset + bvec->bv_len;  		}  	}  	/* Add the persistent grant into the list of free grants */ diff --git a/drivers/block/xsysace.c b/drivers/block/xsysace.c index 1a17e338735..1f38643173c 100644 --- a/drivers/block/xsysace.c +++ b/drivers/block/xsysace.c @@ -961,7 +961,7 @@ static const struct block_device_operations ace_fops = {  /* --------------------------------------------------------------------   * SystemACE device setup/teardown code   */ -static int __devinit ace_setup(struct ace_device *ace) +static int ace_setup(struct ace_device *ace)  {  	u16 version;  	u16 val; @@ -1074,7 +1074,7 @@ err_ioremap:  	return -ENOMEM;  } -static void __devexit ace_teardown(struct ace_device *ace) +static void ace_teardown(struct ace_device *ace)  {  	if (ace->gd) {  		del_gendisk(ace->gd); @@ -1092,9 +1092,8 @@ static void __devexit ace_teardown(struct ace_device *ace)  	iounmap(ace->baseaddr);  } -static int __devinit -ace_alloc(struct device *dev, int id, resource_size_t physaddr, -	  int irq, int bus_width) +static int ace_alloc(struct device *dev, int id, resource_size_t physaddr, +		     int irq, int bus_width)  {  	struct ace_device *ace;  	int rc; @@ -1135,7 +1134,7 @@ err_noreg:  	return rc;  } -static void __devexit ace_free(struct device *dev) +static void ace_free(struct device *dev)  {  	struct ace_device *ace = dev_get_drvdata(dev);  	dev_dbg(dev, "ace_free(%p)\n", dev); @@ -1151,7 +1150,7 @@ static void __devexit ace_free(struct device *dev)   * Platform Bus Support   */ -static int __devinit ace_probe(struct platform_device *dev) +static int ace_probe(struct platform_device *dev)  {  	resource_size_t physaddr = 0;  	int bus_width = ACE_BUS_WIDTH_16; /* FIXME: should not be hard coded */ @@ -1182,7 +1181,7 @@ static int __devinit ace_probe(struct platform_device *dev)  /*   * Platform bus remove() method   */ -static int __devexit ace_remove(struct platform_device *dev) +static int ace_remove(struct platform_device *dev)  {  	ace_free(&dev->dev);  	return 0; @@ -1190,7 +1189,7 @@ static int __devexit ace_remove(struct platform_device *dev)  #if defined(CONFIG_OF)  /* Match table for of_platform binding */ -static const struct of_device_id ace_of_match[] __devinitconst = { +static const struct of_device_id ace_of_match[] = {  	{ .compatible = "xlnx,opb-sysace-1.00.b", },  	{ .compatible = "xlnx,opb-sysace-1.00.c", },  	{ .compatible = "xlnx,xps-sysace-1.00.a", }, @@ -1204,7 +1203,7 @@ MODULE_DEVICE_TABLE(of, ace_of_match);  static struct platform_driver ace_platform_driver = {  	.probe = ace_probe, -	.remove = __devexit_p(ace_remove), +	.remove = ace_remove,  	.driver = {  		.owner = THIS_MODULE,  		.name = "xsysace",  |