Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cc0538b6 authored by Alex Elder's avatar Alex Elder
Browse files

rbd: add read_only rbd map option



Add the ability to map an rbd image read-only, by specifying either
"read_only" or "ro" as an option on the rbd "command line."  Also
allow the inverse to be explicitly specified using "read_write" or
"rw".

Signed-off-by: default avatarAlex Elder <elder@inktank.com>
Reviewed-by: default avatarYehuda Sadeh <yehuda@inktank.com>
parent f8c38929
Loading
Loading
Loading
Loading
+24 −4
Original line number Original line Diff line number Diff line
@@ -70,6 +70,7 @@
#define MAX_INT_FORMAT_WIDTH	((5 * sizeof (int)) / 2 + 1)
#define MAX_INT_FORMAT_WIDTH	((5 * sizeof (int)) / 2 + 1)


#define RBD_NOTIFY_TIMEOUT_DEFAULT	10
#define RBD_NOTIFY_TIMEOUT_DEFAULT	10
#define RBD_READ_ONLY_DEFAULT		false


/*
/*
 * block device image metadata (in-memory version)
 * block device image metadata (in-memory version)
@@ -91,6 +92,7 @@ struct rbd_image_header {


struct rbd_options {
struct rbd_options {
	int	notify_timeout;
	int	notify_timeout;
	bool	read_only;
};
};


/*
/*
@@ -176,7 +178,7 @@ struct rbd_device {
	u64                     snap_id;	/* current snapshot id */
	u64                     snap_id;	/* current snapshot id */
	/* whether the snap_id this device reads from still exists */
	/* whether the snap_id this device reads from still exists */
	bool                    snap_exists;
	bool                    snap_exists;
	int                     read_only;
	bool			read_only;


	struct list_head	node;
	struct list_head	node;


@@ -351,12 +353,21 @@ enum {
	/* int args above */
	/* int args above */
	Opt_last_string,
	Opt_last_string,
	/* string args above */
	/* string args above */
	Opt_read_only,
	Opt_read_write,
	/* Boolean args above */
	Opt_last_bool,
};
};


static match_table_t rbd_opts_tokens = {
static match_table_t rbd_opts_tokens = {
	{Opt_notify_timeout, "notify_timeout=%d"},
	{Opt_notify_timeout, "notify_timeout=%d"},
	/* int args above */
	/* int args above */
	/* string args above */
	/* string args above */
	{Opt_read_only, "read_only"},
	{Opt_read_only, "ro"},		/* Alternate spelling */
	{Opt_read_write, "read_write"},
	{Opt_read_write, "rw"},		/* Alternate spelling */
	/* Boolean args above */
	{-1, NULL}
	{-1, NULL}
};
};


@@ -381,6 +392,8 @@ static int parse_rbd_opts_token(char *c, void *private)
	} else if (token > Opt_last_int && token < Opt_last_string) {
	} else if (token > Opt_last_int && token < Opt_last_string) {
		dout("got string token %d val %s\n", token,
		dout("got string token %d val %s\n", token,
		     argstr[0].from);
		     argstr[0].from);
	} else if (token > Opt_last_string && token < Opt_last_bool) {
		dout("got Boolean token %d\n", token);
	} else {
	} else {
		dout("got token %d\n", token);
		dout("got token %d\n", token);
	}
	}
@@ -389,6 +402,12 @@ static int parse_rbd_opts_token(char *c, void *private)
	case Opt_notify_timeout:
	case Opt_notify_timeout:
		rbd_opts->notify_timeout = intval;
		rbd_opts->notify_timeout = intval;
		break;
		break;
	case Opt_read_only:
		rbd_opts->read_only = true;
		break;
	case Opt_read_write:
		rbd_opts->read_only = false;
		break;
	default:
	default:
		BUG_ON(token);
		BUG_ON(token);
	}
	}
@@ -407,6 +426,7 @@ static int rbd_get_client(struct rbd_device *rbd_dev, const char *mon_addr,
	struct rbd_client *rbdc;
	struct rbd_client *rbdc;


	rbd_opts->notify_timeout = RBD_NOTIFY_TIMEOUT_DEFAULT;
	rbd_opts->notify_timeout = RBD_NOTIFY_TIMEOUT_DEFAULT;
	rbd_opts->read_only = RBD_READ_ONLY_DEFAULT;


	ceph_opts = ceph_parse_options(options, mon_addr,
	ceph_opts = ceph_parse_options(options, mon_addr,
					mon_addr + mon_addr_len,
					mon_addr + mon_addr_len,
@@ -620,7 +640,7 @@ static int rbd_header_set_snap(struct rbd_device *rbd_dev, u64 *size)
		    sizeof (RBD_SNAP_HEAD_NAME))) {
		    sizeof (RBD_SNAP_HEAD_NAME))) {
		rbd_dev->snap_id = CEPH_NOSNAP;
		rbd_dev->snap_id = CEPH_NOSNAP;
		rbd_dev->snap_exists = false;
		rbd_dev->snap_exists = false;
		rbd_dev->read_only = 0;
		rbd_dev->read_only = rbd_dev->rbd_opts.read_only;
		if (size)
		if (size)
			*size = rbd_dev->header.image_size;
			*size = rbd_dev->header.image_size;
	} else {
	} else {
@@ -632,7 +652,7 @@ static int rbd_header_set_snap(struct rbd_device *rbd_dev, u64 *size)
			goto done;
			goto done;
		rbd_dev->snap_id = snap_id;
		rbd_dev->snap_id = snap_id;
		rbd_dev->snap_exists = true;
		rbd_dev->snap_exists = true;
		rbd_dev->read_only = 1;
		rbd_dev->read_only = true;	/* No choice for snapshots */
	}
	}


	ret = 0;
	ret = 0;