Patch "mtip32xx: Handle safe removal during IO" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
mtip32xx: Handle safe removal during IO
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
mtip32xx-handle-safe-removal-during-io.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
51c6570eb922146470c2fe660c34585414679bd6Mon Sep 17 00:00:00 2001
From: Asai Thambi SP <[email protected]>
Date: Wed, 24 Feb 2016 21:18:10 -0800
Subject: mtip32xx: Handle safe removal during IO
From: Asai Thambi SP <[email protected]>
commit 51c6570eb922146470c2fe660c34585414679bd6 upstream.
Flush inflight IOs using fsync_bdev() when the device is safely removed. Also, block further IOs in device open function.
--- drivers/block/mtip32xx/mtip32xx.c | 34 ++++++++++++++++++++++++++++++++-- drivers/block/mtip32xx/mtip32xx.h | 1 + 2 files changed, 33 insertions(+), 2 deletions(-)
drivers/block/mtip32xx/mtip32xx.c +32 -2
@@ -3602,6 +3602,28 @@ static int mtip_block_getgeo(struct blocreturn 0 ; } +static int mtip_block_open (struct block_device *dev,fmode_t mode) +{ +struct driver_data *dd; + +if (dev && dev->bd_disk) { + dd = (struct driver_data *) dev->bd_disk->private_data; + +if (dd) { +if (test_bit (MTIP_DDF_REMOVAL_BIT , + &dd->dd_flag)) { +return -ENODEV ; + } +return 0 ; + } + } +return -ENODEV ; +} + +void mtip_block_release (struct gendisk *disk,fmode_t mode) +{ +} +/* * Block device operation function. *
@@ -3609,6 +3631,8 @@ static int mtip_block_getgeo(struct bloc* layer. */ static const struct block_device_operations mtip_block_ops = { + .open = mtip_block_open, + .release = mtip_block_release, .ioctl = mtip_block_ioctl, #ifdef CONFIG_COMPAT .compat_ioctl = mtip_block_compat_ioctl,
@@ -4434,7 +4458,7 @@ static void mtip_pci_remove(struct pci_dstruct driver_data *dd =pci_get_drvdata (pdev);unsigned long flags, to; -set_bit (MTIP_DDF_REMOVE_PENDING_BIT , &dd->dd_flag); +set_bit (MTIP_DDF_REMOVAL_BIT , &dd->dd_flag);spin_lock_irqsave (&dev_lock, flags);list_del_init (&dd->online_list);
@@ -4451,12 +4475,18 @@ static void mtip_pci_remove(struct pci_d }while (atomic_read (&dd->irq_workers_active) !=0 &&time_before (jiffies, to)); +fsync_bdev (dd->bdev); +if (atomic_read (&dd->irq_workers_active) !=0 ) {dev_warn (&dd->pdev->dev,"Completion workers still active!\n" ); } -blk_mq_stop_hw_queues (dd->queue); +if (dd->sr) +blk_mq_stop_hw_queues (dd->queue); + +set_bit (MTIP_DDF_REMOVE_PENDING_BIT , &dd->dd_flag); +/* Clean up the block layer. */ mtip_block_remove (dd);
drivers/block/mtip32xx/mtip32xx.h +1 -0
@@ -158,6 +158,7 @@ enum {MTIP_DDF_RESUME_BIT =6 ,MTIP_DDF_INIT_DONE_BIT =7 ,MTIP_DDF_REBUILD_FAILED_BIT =8 , +MTIP_DDF_REMOVAL_BIT =9 , MTIP_DDF_STOP_IO = ((1 << MTIP_DDF_REMOVE_PENDING_BIT) | (1 << MTIP_DDF_SEC_LOCK_BIT) |
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/mtip32xx-print-exact-time-when-an-internal-command-is-interrupted.patch queue-4.4/mtip32xx-implement-timeout-handler.patch queue-4.4/mtip32xx-cleanup-queued-requests-after-surprise-removal.patch queue-4.4/mtip32xx-avoid-issuing-standby-immediate-cmd-during-ftl-rebuild.patch queue-4.4/mtip32xx-handle-safe-removal-during-io.patch queue-4.4/mtip32xx-remove-unwanted-code-from-taskfile-error-handler.patch queue-4.4/mtip32xx-handle-ftl-rebuild-failure-state-during-device-initialization.patch queue-4.4/mtip32xx-fix-for-rmmod-crash-when-drive-is-in-ftl-rebuild.patch queue-4.4/mtip32xx-fix-broken-service-thread-handling.patch