Commit 2f012508 authored by Paul Clements's avatar Paul Clements Committed by Linus Torvalds

nbd: add set flags ioctl

Add a set-flags ioctl, allowing various option flags to be set on an nbd
device.  This allows the nbd-client to set the device flags (to enable
read-only mode, or enable discard support, etc.).

Flags are typically specified by the nbd-server.  During the negotiation
phase of the nbd connection, the server sends its flags to the client.
The client then uses NBD_SET_FLAGS to inform the kernel of the options.

Also included is a one-line fix to debug output for the set-timeout ioctl.
Signed-off-by: default avatarPaul Clements <paul.clements@steeleye.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent de74e00a
...@@ -78,6 +78,8 @@ static const char *ioctl_cmd_to_ascii(int cmd) ...@@ -78,6 +78,8 @@ static const char *ioctl_cmd_to_ascii(int cmd)
case NBD_SET_SOCK: return "set-sock"; case NBD_SET_SOCK: return "set-sock";
case NBD_SET_BLKSIZE: return "set-blksize"; case NBD_SET_BLKSIZE: return "set-blksize";
case NBD_SET_SIZE: return "set-size"; case NBD_SET_SIZE: return "set-size";
case NBD_SET_TIMEOUT: return "set-timeout";
case NBD_SET_FLAGS: return "set-flags";
case NBD_DO_IT: return "do-it"; case NBD_DO_IT: return "do-it";
case NBD_CLEAR_SOCK: return "clear-sock"; case NBD_CLEAR_SOCK: return "clear-sock";
case NBD_CLEAR_QUE: return "clear-que"; case NBD_CLEAR_QUE: return "clear-que";
...@@ -468,7 +470,7 @@ static void nbd_handle_req(struct nbd_device *nbd, struct request *req) ...@@ -468,7 +470,7 @@ static void nbd_handle_req(struct nbd_device *nbd, struct request *req)
nbd_cmd(req) = NBD_CMD_READ; nbd_cmd(req) = NBD_CMD_READ;
if (rq_data_dir(req) == WRITE) { if (rq_data_dir(req) == WRITE) {
nbd_cmd(req) = NBD_CMD_WRITE; nbd_cmd(req) = NBD_CMD_WRITE;
if (nbd->flags & NBD_READ_ONLY) { if (nbd->flags & NBD_FLAG_READ_ONLY) {
dev_err(disk_to_dev(nbd->disk), dev_err(disk_to_dev(nbd->disk),
"Write on read-only\n"); "Write on read-only\n");
goto error_out; goto error_out;
...@@ -651,6 +653,10 @@ static int __nbd_ioctl(struct block_device *bdev, struct nbd_device *nbd, ...@@ -651,6 +653,10 @@ static int __nbd_ioctl(struct block_device *bdev, struct nbd_device *nbd,
nbd->xmit_timeout = arg * HZ; nbd->xmit_timeout = arg * HZ;
return 0; return 0;
case NBD_SET_FLAGS:
nbd->flags = arg;
return 0;
case NBD_SET_SIZE_BLOCKS: case NBD_SET_SIZE_BLOCKS:
nbd->bytesize = ((u64) arg) * nbd->blksize; nbd->bytesize = ((u64) arg) * nbd->blksize;
bdev->bd_inode->i_size = nbd->bytesize; bdev->bd_inode->i_size = nbd->bytesize;
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#define NBD_SET_SIZE_BLOCKS _IO( 0xab, 7 ) #define NBD_SET_SIZE_BLOCKS _IO( 0xab, 7 )
#define NBD_DISCONNECT _IO( 0xab, 8 ) #define NBD_DISCONNECT _IO( 0xab, 8 )
#define NBD_SET_TIMEOUT _IO( 0xab, 9 ) #define NBD_SET_TIMEOUT _IO( 0xab, 9 )
#define NBD_SET_FLAGS _IO( 0xab, 10)
enum { enum {
NBD_CMD_READ = 0, NBD_CMD_READ = 0,
...@@ -34,6 +35,10 @@ enum { ...@@ -34,6 +35,10 @@ enum {
NBD_CMD_DISC = 2 NBD_CMD_DISC = 2
}; };
/* values for flags field */
#define NBD_FLAG_HAS_FLAGS (1 << 0) /* nbd-server supports flags */
#define NBD_FLAG_READ_ONLY (1 << 1) /* device is read-only */
#define nbd_cmd(req) ((req)->cmd[0]) #define nbd_cmd(req) ((req)->cmd[0])
/* userspace doesn't need the nbd_device structure */ /* userspace doesn't need the nbd_device structure */
...@@ -42,10 +47,6 @@ enum { ...@@ -42,10 +47,6 @@ enum {
#include <linux/wait.h> #include <linux/wait.h>
#include <linux/mutex.h> #include <linux/mutex.h>
/* values for flags field */
#define NBD_READ_ONLY 0x0001
#define NBD_WRITE_NOCHK 0x0002
struct request; struct request;
struct nbd_device { struct nbd_device {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment