mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: James Bottomley <James.Bottomley@steeleye.com>
To: torvalds@transmeta.com
Cc: linux-kernel@vger.kernel.org, Pavel Machek <pavel@ucw.cz>,
	Paul.Clements@SteelEye.com
Subject: Minor fixes for nbd for 2.5.45
Date: Fri, 01 Nov 2002 10:06:41 -0500	[thread overview]
Message-ID: <200211011506.gA1F6fL02859@localhost.localdomain> (raw)

These are the fixes steeleye makes to use nbd for block device replication in 
a production environment (they've been field tested for at least six months 
now on various 2.4 kernels):

-  make nbd daemon killable
  
-  make signals clean up the queues correctly (otherwise the queue will be in 
an
   insane state if the deamon exits normally with a signal pending)
  
-  increase the device size to 2TB

We've OK'd them with Pavel Machek, if you could apply them.

Thanks,

James Bottomley

You can import this changeset into BK by piping this whole message to:
'| bk receive [path to repository]' or apply the patch as usual.

===================================================================


ChangeSet@1.856, 2002-11-01 09:59:57-05:00, Paul.Clements@steeleye.com
  Minor fixes and cleanups to nbd:
  
  make nbd daemon killable
  
  make signals clean up the queues correctly (otherwise the queue will be in an
  insane state if the deamon exits normally with a signal pending)
  
  increase the device size to 2TB


 nbd.c |   69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
-
 1 files changed, 65 insertions(+), 4 deletions(-)


diff -Nru a/drivers/block/nbd.c b/drivers/block/nbd.c
--- a/drivers/block/nbd.c	Fri Nov  1 10:02:08 2002
+++ b/drivers/block/nbd.c	Fri Nov  1 10:02:08 2002
@@ -26,6 +26,8 @@
  *   reduce number of partial TCP segments sent. <steve@chygwyn.com>
  * 01-12-6 Fix deadlock condition by making queue locks independant of
  *   the transmit lock. <steve@chygwyn.com>
+ * 02-10-11 Allow hung xmit to be aborted via SIGKILL & various fixes.
+ *   <Paul.Clements@SteelEye.com> <James.Bottomley@SteelEye.com>
  *
  * possible FIXME: make set_sock / set_blksize / set_size / do_it one syscall
  * why not: would need verify_area and friends, would share yet another 
@@ -91,10 +93,12 @@
 
 	oldfs = get_fs();
 	set_fs(get_ds());
-
+	/* Allow interception of SIGKILL only
+	 * Don't allow other signals to interrupt the transmission */
 	spin_lock_irqsave(&current->sig->siglock, flags);
 	oldset = current->blocked;
 	sigfillset(&current->blocked);
+	sigdelsetmask(&current->blocked, sigmask(SIGKILL));
 	recalc_sigpending();
 	spin_unlock_irqrestore(&current->sig->siglock, flags);
 
@@ -117,6 +121,17 @@
 		else
 			result = sock_recvmsg(sock, &msg, size, 0);
 
+		if (signal_pending(current)) {
+			siginfo_t info;
+			spin_lock_irqsave(&current->sig->siglock, flags);
+			printk(KERN_WARNING "NBD (pid %d: %s) got signal %d\n",
+				current->pid, current->comm, 
+				dequeue_signal(&current->blocked, &info));
+			spin_unlock_irqrestore(&current->sig->siglock, flags);
+			result = -EINTR;
+			break;
+		}
+
 		if (result <= 0) {
 #ifdef PARANOIA
 			printk(KERN_ERR "NBD: %s - sock=%ld at buf=%ld, size=%d returned %d.\n",
@@ -156,6 +171,10 @@
 
 	down(&lo->tx_lock);
 
+	if (!sock || !lo->sock) {
+		FAIL("Attempted sendmsg to closed socket\n");
+	}
+
 	result = nbd_xmit(1, sock, (char *) &request, sizeof(request), nbd_cmd(req) 
== NBD_CMD_WRITE ? MSG_MORE : 0);
 	if (result <= 0)
 		FAIL("Sendmsg failed for control.");
@@ -343,11 +362,31 @@
 		spin_unlock_irq(q->queue_lock);
 
 		spin_lock(&lo->queue_lock);
+
+		if (!lo->file) {
+			spin_unlock(&lo->queue_lock);
+			printk(KERN_ERR "nbd: failed between accept and semaphore, file lost\n");
+			req->errors++;
+			nbd_end_request(req);
+			spin_lock_irq(q->queue_lock);
+			continue;
+		}
+
 		list_add(&req->queuelist, &lo->queue_head);
 		spin_unlock(&lo->queue_lock);
 
 		nbd_send_req(lo, req);
 
+		if (req->errors) {
+			printk(KERN_ERR "nbd: nbd_send_req failed\n");
+			spin_lock(&lo->queue_lock);
+			list_del(&req->queuelist);
+			spin_unlock(&lo->queue_lock);
+			nbd_end_request(req);
+			spin_lock_irq(q->queue_lock);
+			continue;
+		}
+
 		spin_lock_irq(q->queue_lock);
 		continue;
 
@@ -390,12 +429,14 @@
 			printk(KERN_ERR "nbd: Some requests are in progress -> can not turn 
off.\n");
 			return -EBUSY;
 		}
-		spin_unlock(&lo->queue_lock);
 		file = lo->file;
-		if (!file)
+		if (!file) {
+			spin_unlock(&lo->queue_lock);
 			return -EINVAL;
+		}
 		lo->file = NULL;
 		lo->sock = NULL;
+		spin_unlock(&lo->queue_lock);
 		fput(file);
 		return 0;
 	case NBD_SET_SOCK:
@@ -439,6 +480,26 @@
 		if (!lo->file)
 			return -EINVAL;
 		nbd_do_it(lo);
+		/* on return tidy up in case we have a signal */
+		/* Forcibly shutdown the socket causing all listeners
+		 * to error
+		 *
+		 * FIXME: This code is duplicated from sys_shutdown, but
+		 * there should be a more generic interface rather than
+		 * calling socket ops directly here */
+		down(&lo->tx_lock);
+		printk(KERN_WARNING "nbd: shutting down socket\n");
+		lo->sock->ops->shutdown(lo->sock, SEND_SHUTDOWN|RCV_SHUTDOWN);
+		lo->sock = NULL;
+		up(&lo->tx_lock);
+		spin_lock(&lo->queue_lock);
+		file = lo->file;
+		lo->file = NULL;
+		spin_unlock(&lo->queue_lock);
+		nbd_clear_que(lo);
+		printk(KERN_WARNING "nbd: queue cleared\n");
+		if (file)
+			fput(file);
 		return lo->harderror;
 	case NBD_CLEAR_QUE:
 		nbd_clear_que(lo);
@@ -517,7 +578,7 @@
 		init_MUTEX(&nbd_dev[i].tx_lock);
 		nbd_dev[i].blksize = 1024;
 		nbd_dev[i].blksize_bits = 10;
-		nbd_dev[i].bytesize = 0x7ffffc00; /* 2GB */
+		nbd_dev[i].bytesize = ((u64)0x7ffffc00) << 10; /* 2TB */
 		disk->major = MAJOR_NR;
 		disk->first_minor = i;
 		disk->fops = &nbd_fops;

===================================================================


This BitKeeper patch contains the following changesets:
+
## Wrapped with gzip_uu ##


begin 664 bkpatch2828
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
7.&'AA<J2W8#YK<"K4><?L7%3&44.````
`
end



                 reply	other threads:[~2002-11-01 15:00 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200211011506.gA1F6fL02859@localhost.localdomain \
    --to=james.bottomley@steeleye.com \
    --cc=Paul.Clements@SteelEye.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pavel@ucw.cz \
    --cc=torvalds@transmeta.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®