[stgt] [PATCH v2 1/2] bs_rbd.c: store active_rbd info in addition to struct scsi_lu

Dan Mick dan.mick at inktank.com
Fri Oct 11 08:41:02 CEST 2013


Use bs_datasize feature to allocate bs_rbd-private data on the end
of scsi_lu, and then access it with pointer arithmetic; no need to
manage an array indexed by fd, so no fixed number of devices anymore.

Signed-off-by: Dan Mick <dan.mick at inktank.com>
---
 usr/bs_rbd.c |   35 +++++++++++++----------------------
 1 file changed, 13 insertions(+), 22 deletions(-)

diff --git a/usr/bs_rbd.c b/usr/bs_rbd.c
index f1dd77d..22818e0 100644
--- a/usr/bs_rbd.c
+++ b/usr/bs_rbd.c
@@ -56,10 +56,12 @@ struct active_rbd {
 	rbd_image_t rbd_image;
 };
 
-#define MAX_IMAGES	20
-struct active_rbd active_rbds[MAX_IMAGES];
-
-#define RBDP(fd)	(&active_rbds[fd])
+/* active_rbd is allocated just after the bs_thread_info */
+#define RBDP(lu)	((struct active_rbd *) \
+				((char *)lu + \
+				sizeof(struct scsi_lu) + \
+				sizeof(struct bs_thread_info)) \
+			)
 
 static void parse_imagepath(char *path, char **pool, char **image, char **snap)
 {
@@ -100,7 +102,7 @@ static void bs_sync_sync_range(struct scsi_cmd *cmd, uint32_t length,
 {
 	int ret;
 
-	ret = rbd_flush(RBDP(cmd->dev->fd)->rbd_image);
+	ret = rbd_flush(RBDP(cmd->dev)->rbd_image);
 	if (ret)
 		set_medium_error(result, key, asc);
 }
@@ -130,7 +132,7 @@ static void bs_rbd_request(struct scsi_cmd *cmd)
 	const char *write_buf = NULL;
 	ret = length = 0;
 	key = asc = 0;
-	struct active_rbd *rbd = RBDP(cmd->dev->fd);
+	struct active_rbd *rbd = RBDP(cmd->dev);
 
 	switch (cmd->scb[0]) {
 	case ORWRITE_16:
@@ -420,21 +422,9 @@ static int bs_rbd_open(struct scsi_lu *lu, char *path, int *fd, uint64_t *size)
 	char *poolname;
 	char *imagename;
 	char *snapname;
-	struct active_rbd *rbd = NULL;
-	int lfd;
+	struct active_rbd *rbd = RBDP(lu);
 
 	parse_imagepath(path, &poolname, &imagename, &snapname);
-	for (lfd = 0; lfd < MAX_IMAGES; lfd++) {
-		if (active_rbds[lfd].rbd_image == NULL) {
-			rbd = &active_rbds[lfd];
-			*fd = lfd;
-			break;
-		}
-	}
-	if (!rbd) {
-		*fd = -1;
-		return -EMFILE;
-	}
 
 	rbd->poolname = poolname;
 	rbd->imagename = imagename;
@@ -446,7 +436,7 @@ static int bs_rbd_open(struct scsi_lu *lu, char *path, int *fd, uint64_t *size)
 		eprintf("bs_rbd_open: rados_ioctx_create: %d\n", ret);
 		return -EIO;
 	}
-	/* null snap name */
+
 	ret = rbd_open(rbd->ioctx, imagename, &rbd->rbd_image, snapname);
 	if (ret < 0) {
 		eprintf("bs_rbd_open: rbd_open: %d\n", ret);
@@ -467,7 +457,7 @@ static int bs_rbd_open(struct scsi_lu *lu, char *path, int *fd, uint64_t *size)
 
 static void bs_rbd_close(struct scsi_lu *lu)
 {
-	struct active_rbd *rbd = RBDP(lu->fd);
+	struct active_rbd *rbd = RBDP(lu);
 
 	if (rbd->rbd_image) {
 		rbd_close(rbd->rbd_image);
@@ -520,7 +510,8 @@ static void bs_rbd_exit(struct scsi_lu *lu)
 
 static struct backingstore_template rbd_bst = {
 	.bs_name		= "rbd",
-	.bs_datasize		= sizeof(struct bs_thread_info),
+	.bs_datasize		= sizeof(struct bs_thread_info) +
+				  sizeof(struct active_rbd),
 	.bs_open		= bs_rbd_open,
 	.bs_close		= bs_rbd_close,
 	.bs_init		= bs_rbd_init,
-- 
1.7.10.4

--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html



More information about the stgt mailing list