From 3c8667c07d8e069b98daa25b8e5cbde0956e87a7 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 4 Jun 2014 17:36:36 -0700 Subject: [PATCH] 3.4-stable patches added patches: nbd-fsync-and-kill-block-device-on-shutdown.patch --- ...nc-and-kill-block-device-on-shutdown.patch | 95 +++++++++++++++++++ queue-3.4/series | 1 + 2 files changed, 96 insertions(+) create mode 100644 queue-3.4/nbd-fsync-and-kill-block-device-on-shutdown.patch diff --git a/queue-3.4/nbd-fsync-and-kill-block-device-on-shutdown.patch b/queue-3.4/nbd-fsync-and-kill-block-device-on-shutdown.patch new file mode 100644 index 00000000000..6effc97e544 --- /dev/null +++ b/queue-3.4/nbd-fsync-and-kill-block-device-on-shutdown.patch @@ -0,0 +1,95 @@ +From 3a2d63f87989e01437ba994df5f297528c353d7d Mon Sep 17 00:00:00 2001 +From: Paolo Bonzini +Date: Wed, 27 Feb 2013 17:05:25 -0800 +Subject: nbd: fsync and kill block device on shutdown + +From: Paolo Bonzini + +commit 3a2d63f87989e01437ba994df5f297528c353d7d upstream. + +There are two problems with shutdown in the NBD driver. + +1: Receiving the NBD_DISCONNECT ioctl does not sync the filesystem. + + This patch adds the sync operation into __nbd_ioctl()'s + NBD_DISCONNECT handler. This is useful because BLKFLSBUF is restricted + to processes that have CAP_SYS_ADMIN, and the NBD client may not + possess it (fsync of the block device does not sync the filesystem, + either). + +2: Once we clear the socket we have no guarantee that later reads will + come from the same backing storage. + + The patch adds calls to kill_bdev() in __nbd_ioctl()'s socket + clearing code so the page cache is cleaned, lest reads that hit on the + page cache will return stale data from the previously-accessible disk. + +Example: + + # qemu-nbd -r -c/dev/nbd0 /dev/sr0 + # file -s /dev/nbd0 + /dev/stdin: # UDF filesystem data (version 1.5) etc. + # qemu-nbd -d /dev/nbd0 + # qemu-nbd -r -c/dev/nbd0 /dev/sda + # file -s /dev/nbd0 + /dev/stdin: # UDF filesystem data (version 1.5) etc. + +While /dev/sda has: + + # file -s /dev/sda + /dev/sda: x86 boot sector; etc. + +Signed-off-by: Paolo Bonzini +Acked-by: Paul Clements +Cc: Alex Bligh +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +[bwh: Backported to 3.2: + - Adjusted context + - s/\bnbd\b/lo/ + - Incorporate export of kill_bdev() from commit ff01bb483265 + ('fs: move code out of buffer.c')] +Signed-off-by: Ben Hutchings +[hq: Backported to 3.4: Adjusted context] +Signed-off-by: Qiang Huang +Signed-off-by: Greg Kroah-Hartman +--- + drivers/block/nbd.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +--- a/drivers/block/nbd.c ++++ b/drivers/block/nbd.c +@@ -584,10 +584,17 @@ static int __nbd_ioctl(struct block_devi + struct request sreq; + + dev_info(disk_to_dev(nbd->disk), "NBD_DISCONNECT\n"); ++ if (!nbd->sock) ++ return -EINVAL; + ++ mutex_unlock(&nbd->tx_lock); ++ fsync_bdev(bdev); ++ mutex_lock(&nbd->tx_lock); + blk_rq_init(NULL, &sreq); + sreq.cmd_type = REQ_TYPE_SPECIAL; + nbd_cmd(&sreq) = NBD_CMD_DISC; ++ ++ /* Check again after getting mutex back. */ + if (!nbd->sock) + return -EINVAL; + +@@ -606,6 +613,7 @@ static int __nbd_ioctl(struct block_devi + nbd_clear_que(nbd); + BUG_ON(!list_empty(&nbd->queue_head)); + BUG_ON(!list_empty(&nbd->waiting_queue)); ++ kill_bdev(bdev); + if (file) + fput(file); + return 0; +@@ -688,6 +696,7 @@ static int __nbd_ioctl(struct block_devi + nbd->file = NULL; + nbd_clear_que(nbd); + dev_warn(disk_to_dev(nbd->disk), "queue cleared\n"); ++ kill_bdev(bdev); + if (file) + fput(file); + nbd->bytesize = 0; diff --git a/queue-3.4/series b/queue-3.4/series index be3ce7f4617..35dda3a74d4 100644 --- a/queue-3.4/series +++ b/queue-3.4/series @@ -153,3 +153,4 @@ efi-export-efi_query_variable_store-for-efivars.ko.patch x86-efi-implement-efi_no_storage_paranoia-parameter.patch modify-uefi-anti-bricking-code.patch x86-efi-fix-dummy-variable-buffer-allocation.patch +nbd-fsync-and-kill-block-device-on-shutdown.patch -- 2.47.3