mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 02:39:48 +00:00
![Paul Clements](/assets/img/avatar_default.png)
Allow NBD I/O to be cancelled when a network outage occurs. Previously, I/O would just hang, and if enough I/O was hung in nbd, the system (at least user-level) would completely hang until a TCP timeout (default, 15 minutes) occurred. The patch introduces a new ioctl NBD_SET_TIMEOUT that allows a transmit timeout value (in seconds) to be specified. Any network send that exceeds the timeout will be cancelled and the nbd connection will be shut down. I've tested with various timeout values and 6 seconds seems to be a good choice for the timeout. If the NBD_SET_TIMEOUT ioctl is not called, you get the old (I/O hang) behavior. Signed-off-by: Paul Clements <paul.clements@steeleye.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
105 lines
2.6 KiB
C
105 lines
2.6 KiB
C
/*
|
|
* 1999 Copyright (C) Pavel Machek, pavel@ucw.cz. This code is GPL.
|
|
* 1999/11/04 Copyright (C) 1999 VMware, Inc. (Regis "HPReg" Duchesne)
|
|
* Made nbd_end_request() use the io_request_lock
|
|
* 2001 Copyright (C) Steven Whitehouse
|
|
* New nbd_end_request() for compatibility with new linux block
|
|
* layer code.
|
|
* 2003/06/24 Louis D. Langholtz <ldl@aros.net>
|
|
* Removed unneeded blksize_bits field from nbd_device struct.
|
|
* Cleanup PARANOIA usage & code.
|
|
* 2004/02/19 Paul Clements
|
|
* Removed PARANOIA, plus various cleanup and comments
|
|
*/
|
|
|
|
#ifndef LINUX_NBD_H
|
|
#define LINUX_NBD_H
|
|
|
|
#include <linux/types.h>
|
|
|
|
#define NBD_SET_SOCK _IO( 0xab, 0 )
|
|
#define NBD_SET_BLKSIZE _IO( 0xab, 1 )
|
|
#define NBD_SET_SIZE _IO( 0xab, 2 )
|
|
#define NBD_DO_IT _IO( 0xab, 3 )
|
|
#define NBD_CLEAR_SOCK _IO( 0xab, 4 )
|
|
#define NBD_CLEAR_QUE _IO( 0xab, 5 )
|
|
#define NBD_PRINT_DEBUG _IO( 0xab, 6 )
|
|
#define NBD_SET_SIZE_BLOCKS _IO( 0xab, 7 )
|
|
#define NBD_DISCONNECT _IO( 0xab, 8 )
|
|
#define NBD_SET_TIMEOUT _IO( 0xab, 9 )
|
|
|
|
enum {
|
|
NBD_CMD_READ = 0,
|
|
NBD_CMD_WRITE = 1,
|
|
NBD_CMD_DISC = 2
|
|
};
|
|
|
|
#define nbd_cmd(req) ((req)->cmd[0])
|
|
#define MAX_NBD 128
|
|
|
|
/* userspace doesn't need the nbd_device structure */
|
|
#ifdef __KERNEL__
|
|
|
|
#include <linux/wait.h>
|
|
#include <linux/mutex.h>
|
|
|
|
/* values for flags field */
|
|
#define NBD_READ_ONLY 0x0001
|
|
#define NBD_WRITE_NOCHK 0x0002
|
|
|
|
struct request;
|
|
|
|
struct nbd_device {
|
|
int flags;
|
|
int harderror; /* Code of hard error */
|
|
struct socket * sock;
|
|
struct file * file; /* If == NULL, device is not ready, yet */
|
|
int magic;
|
|
|
|
spinlock_t queue_lock;
|
|
struct list_head queue_head;/* Requests are added here... */
|
|
struct request *active_req;
|
|
wait_queue_head_t active_wq;
|
|
|
|
struct mutex tx_lock;
|
|
struct gendisk *disk;
|
|
int blksize;
|
|
u64 bytesize;
|
|
pid_t pid; /* pid of nbd-client, if attached */
|
|
int xmit_timeout;
|
|
};
|
|
|
|
#endif
|
|
|
|
/* These are sent over the network in the request/reply magic fields */
|
|
|
|
#define NBD_REQUEST_MAGIC 0x25609513
|
|
#define NBD_REPLY_MAGIC 0x67446698
|
|
/* Do *not* use magics: 0x12560953 0x96744668. */
|
|
|
|
/*
|
|
* This is the packet used for communication between client and
|
|
* server. All data are in network byte order.
|
|
*/
|
|
struct nbd_request {
|
|
__be32 magic;
|
|
__be32 type; /* == READ || == WRITE */
|
|
char handle[8];
|
|
__be64 from;
|
|
__be32 len;
|
|
}
|
|
#ifdef __GNUC__
|
|
__attribute__ ((packed))
|
|
#endif
|
|
;
|
|
|
|
/*
|
|
* This is the reply packet that nbd-server sends back to the client after
|
|
* it has completed an I/O request (or an error occurs).
|
|
*/
|
|
struct nbd_reply {
|
|
__be32 magic;
|
|
__be32 error; /* 0 = ok, else error */
|
|
char handle[8]; /* handle you got from request */
|
|
};
|
|
#endif
|