[stgt] [PATCHes] Updated patches for thin-provisioning support

FUJITA Tomonori fujita.tomonori at lab.ntt.co.jp
Tue Apr 17 14:56:46 CEST 2012


On Sun, 15 Apr 2012 13:48:12 +1000
ronnie sahlberg <ronniesahlberg at gmail.com> wrote:

> An updated patch to add UNMAP. Here we just try to unmap the region as
> it was given to us by the initiator
> and rely on the initiator to make sure that it only try to unmap data
> on physical block boundaries.
> 
> Second is a patch to automatically set
> LogicalBlocksPerPhysicalBlockExponent anytime we open a backing file.
> This is used in READCAPACITY16 to tell the initiators the relations
> between logical blocks and physical blocks
> on the target, and should guide the initiator to do the right thing
> when using the UNMAP CDB

> 
> From 8c1c0becbb91e2b2346c7261dbbd6be028f5ff32 Mon Sep 17 00:00:00 2001
> From: Ronnie Sahlberg <ronniesahlberg at gmail.com>
> Date: Sun, 15 Apr 2012 13:41:18 +1000
> Subject: [PATCH 2/2] SBC: When opening the backing file, check the filesystem blocksize and update LogicalBlocksPerPhysicalBlockExponent accodingly.
> 
> This is used to tell the initiator what the allignment between LBAs and the underlying storage blocksize is.
> 
> Signed-off-by: Ronnie Sahlberg <ronniesahlberg at gmail.com>
> ---
>  usr/bs_aio.c  |   19 +++++++++++++------
>  usr/bs_rdwr.c |   13 +++++++++++--
>  usr/bs_ssc.c  |    2 +-
>  usr/util.c    |    8 +++++---
>  usr/util.h    |    3 ++-
>  5 files changed, 32 insertions(+), 13 deletions(-)
> 
> diff --git a/usr/bs_aio.c b/usr/bs_aio.c
> index cbd91ba..4db5beb 100644
> --- a/usr/bs_aio.c
> +++ b/usr/bs_aio.c
> @@ -304,6 +304,7 @@ static int bs_aio_open(struct scsi_lu *lu, char *path, int *fd, uint64_t *size)
>  {
>  	struct bs_aio_info *info = BS_AIO_I(lu);
>  	int ret, afd;
> +	uint32_t blksize = 0;
>  
>  	info->iodepth = AIO_MAX_IODEPTH;
>  	eprintf("create aio context for tgt:%d lun:%"PRId64 ", max iodepth:%d\n",
> @@ -331,13 +332,13 @@ static int bs_aio_open(struct scsi_lu *lu, char *path, int *fd, uint64_t *size)
>  
>  	eprintf("open %s, RW, O_DIRECT for tgt:%d lun:%"PRId64 "\n",
>  		path, info->lu->tgt->tid, info->lu->lun);
> -	*fd = backed_file_open(path, O_RDWR|O_LARGEFILE|O_DIRECT, size);
> +	*fd = backed_file_open(path, O_RDWR|O_LARGEFILE|O_DIRECT, size, &blksize);
>  	/* If we get access denied, try opening the file in readonly mode */
>  	if (*fd == -1 && (errno == EACCES || errno == EROFS)) {
>  		eprintf("open %s, READONLY, O_DIRECT for tgt:%d lun:%"PRId64 "\n",
>  			path, info->lu->tgt->tid, info->lu->lun);
>  		*fd = backed_file_open(path, O_RDONLY|O_LARGEFILE|O_DIRECT,
> -				       size);
> +				       size, &blksize);
>  		lu->attrs.readonly = 1;
>  	}
>  	if (*fd < 0) {
> @@ -346,12 +347,18 @@ static int bs_aio_open(struct scsi_lu *lu, char *path, int *fd, uint64_t *size)
>  		ret = *fd;
>  		goto remove_tgt_evt;
>  	}
> -	else {
> -		eprintf("%s opened successfully for tgt:%d lun:%"PRId64 "\n",
> -			path, info->lu->tgt->tid, info->lu->lun);
> -		return 0;
> +
> +	eprintf("%s opened successfully for tgt:%d lun:%"PRId64 "\n",
> +		path, info->lu->tgt->tid, info->lu->lun);
> +
> +	lu->attrs.lbppbe = 0;

lbppbe should be already zero'ed.

> +	while (blksize > (1U << lu->blk_shift)) {
> +		lu->attrs.lbppbe++;
> +		blksize >>= 1;
>  	}

I think that we should not set lbppbe blindly. Only when users don't
specify lbppbe via tgtadm.

Also can we have a helper function to avoid this duplicated code?



> +	return 0;
> +
>  remove_tgt_evt:
>  	tgt_event_del(afd);
>  close_eventfd:
> diff --git a/usr/bs_rdwr.c b/usr/bs_rdwr.c
> index 9e15603..a917fab 100644
> --- a/usr/bs_rdwr.c
> +++ b/usr/bs_rdwr.c
> @@ -231,16 +231,25 @@ static void bs_rdwr_request(struct scsi_cmd *cmd)
>  
>  static int bs_rdwr_open(struct scsi_lu *lu, char *path, int *fd, uint64_t *size)
>  {
> -	*fd = backed_file_open(path, O_RDWR|O_LARGEFILE|lu->bsoflags, size);
> +	uint32_t blksize = 0;
> +
> +	*fd = backed_file_open(path, O_RDWR|O_LARGEFILE|lu->bsoflags, size,
> +				&blksize);
>  	/* If we get access denied, try opening the file in readonly mode */
>  	if (*fd == -1 && (errno == EACCES || errno == EROFS)) {
>  		*fd = backed_file_open(path, O_RDONLY|O_LARGEFILE|lu->bsoflags,
> -				       size);
> +				       size, &blksize);
>  		lu->attrs.readonly = 1;
>  	}
>  	if (*fd < 0)
>  		return *fd;
>  
> +	lu->attrs.lbppbe = 0;
> +	while (blksize > (1U << lu->blk_shift)) {
> +		lu->attrs.lbppbe++;
> +		blksize >>= 1;
> +	}
> +
>  	return 0;
>  }
>  
> diff --git a/usr/bs_ssc.c b/usr/bs_ssc.c
> index 6412972..93d08a6 100644
> --- a/usr/bs_ssc.c
> +++ b/usr/bs_ssc.c
> @@ -619,7 +619,7 @@ static int bs_ssc_open(struct scsi_lu *lu, char *path, int *fd, uint64_t *size)
>  
>  	ssc = dtype_priv(lu);
>  
> -	*fd = backed_file_open(path, O_RDWR | O_LARGEFILE, size);
> +	*fd = backed_file_open(path, O_RDWR | O_LARGEFILE, size, NULL);
>  	if (*fd < 0) {
>  		eprintf("Could not open %s %m\n", path);
>  		return *fd;
> diff --git a/usr/util.c b/usr/util.c
> index c78a999..4cf8291 100644
> --- a/usr/util.c
> +++ b/usr/util.c
> @@ -82,7 +82,7 @@ int chrdev_open(char *modname, char *devpath, uint8_t minor, int *fd)
>  	return 0;
>  }
>  
> -int backed_file_open(char *path, int oflag, uint64_t *size)
> +int backed_file_open(char *path, int oflag, uint64_t *size, uint32_t *blksize)
>  {
>  	int fd, err;
>  	struct stat64 st;
> @@ -99,9 +99,11 @@ int backed_file_open(char *path, int oflag, uint64_t *size)
>  		goto close_fd;
>  	}
>  
> -	if (S_ISREG(st.st_mode))
> +	if (S_ISREG(st.st_mode)) {
>  		*size = st.st_size;
> -	else if (S_ISBLK(st.st_mode)) {
> +		if (blksize) 
> +			*blksize = st.st_blksize;
> +	} else if (S_ISBLK(st.st_mode)) {
>  		err = ioctl(fd, BLKGETSIZE64, size);
>  		if (err < 0) {
>  			eprintf("Cannot get size, %m\n");
> diff --git a/usr/util.h b/usr/util.h
> index 4bf157d..c016e5a 100644
> --- a/usr/util.h
> +++ b/usr/util.h
> @@ -62,7 +62,8 @@
>  
>  extern int get_blk_shift(unsigned int size);
>  extern int chrdev_open(char *modname, char *devpath, uint8_t minor, int *fd);
> -extern int backed_file_open(char *path, int oflag, uint64_t *size);
> +extern int backed_file_open(char *path, int oflag, uint64_t *size,
> +				uint32_t *blksize);
>  extern int set_non_blocking(int fd);
>  extern int str_to_open_flags(char *buf);
>  extern char *open_flags_to_str(char *dest, int flags);
> -- 
> 1.7.3.1
> 
> 
> 
--
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