From 8c1c0becbb91e2b2346c7261dbbd6be028f5ff32 Mon Sep 17 00:00:00 2001 From: Ronnie Sahlberg 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 --- 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; + while (blksize > (1U << lu->blk_shift)) { + lu->attrs.lbppbe++; + blksize >>= 1; } + 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