|  | /* | 
|  | * 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 | 
|  |  | 
|  | #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 ) | 
|  |  | 
|  | 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; | 
|  | }; | 
|  |  | 
|  | #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 { | 
|  | __u32 magic; | 
|  | __u32 type;	/* == READ || == WRITE 	*/ | 
|  | char handle[8]; | 
|  | __u64 from; | 
|  | __u32 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 { | 
|  | __u32 magic; | 
|  | __u32 error;		/* 0 = ok, else error	*/ | 
|  | char handle[8];		/* handle you got from request	*/ | 
|  | }; | 
|  | #endif |