[stgt] [PATCH] LBPPBE: when opening the backing file, check the blocksize of the underlying filesystem and set lbppbe automatically.
ronnie sahlberg
ronniesahlberg at gmail.com
Wed Apr 18 13:45:24 CEST 2012
On Wed, Apr 18, 2012 at 9:30 PM, FUJITA Tomonori
<fujita.tomonori at lab.ntt.co.jp> wrote:
> On Wed, 18 Apr 2012 19:26:47 +1000
> Ronnie Sahlberg <ronniesahlberg at gmail.com> wrote:
>
>> Unless the user has set an explicit value through tgtadm in which case we leave the system using the value the user has set.
>>
>> Signed-off-by: Ronnie Sahlberg <ronniesahlberg at gmail.com>
>> ---
>> doc/targets.conf.5.xml | 7 ++++++-
>> usr/bs_aio.c | 19 ++++++++++++-------
>> usr/bs_rdwr.c | 10 ++++++++--
>> usr/bs_ssc.c | 2 +-
>> usr/spc.c | 1 +
>> usr/target.c | 9 +++++++++
>> usr/tgtd.h | 5 +++++
>> usr/util.c | 8 +++++---
>> usr/util.h | 3 ++-
>> 9 files changed, 49 insertions(+), 15 deletions(-)
>>
>> diff --git a/doc/targets.conf.5.xml b/doc/targets.conf.5.xml
>> index f754df3..833e40a 100644
>> --- a/doc/targets.conf.5.xml
>> +++ b/doc/targets.conf.5.xml
>> @@ -336,7 +336,12 @@
>> <listitem>
>> <para>
>> Specify the Logical blocks per physical block
>> - exponent. This is an internal option that should not be
>> + exponent. By default TGTD will set the lbppbe to automatically
>> + match the underlying filesystem. Use this parameter to override
>> + that setting.
>> + </para>
>> + <para>
>> + This is an internal option that should not be
>> set directly.
>> </para>
>> </listitem>
>> diff --git a/usr/bs_aio.c b/usr/bs_aio.c
>> index cbd91ba..75ae66f 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,14 @@ 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,11 +348,14 @@ 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);
>> +
>> + if (!lu->attrs.no_auto_lbppbe)
>> + update_lbppbe(lu, blksize);
>
> Why can't we simply do:
>
>> + if (!lu->lbppbe)
>> + update_lbppbe(lu, blksize);
>
> ?
>
> If an user doesn't specify lbppbe via tgtadm, lu->lbppbe should be
> zero?
>
It can still be non-zero.
It is only zero first time we mount the backing file.
Since we support removable devices, a user could make a LUN/disk "offline"
which means we close the backing file.
Then a little while later the user swaps the media and makes the file
online again and we open a new file as the backing-store.
I.e.
1, create lun and open backing file /fs1/foo.img (lbppbe is
update automatically)
2, user sets lbppbe manually via tgtadm
3, user makes the file offline and close() the backing file :
tgtadm --tid 1 --lun 1 --op update --mode logicalunit --name online --value No
4, user connects the LUN to a different backing file and makes it online again :
tgtadm --tid 1 --lun 1 --op update --mode logicalunit --name path
--value /fs2/bar.img
At this stage we open() a new backing store file and lbppbe is no
longer zero. It is onlt zero for the first time we open a backing
store file for a specific LUN.
At this stage, the LUN already exist but we just open a new backing store file.
At this stage lbppbe is not zero when we open the file, so we can
not from lbppbe itself
determine
"is lbppbe non-zero because it was set for the previous backing file
we used and we swapped to a different one
or is lbppbe non-zero because a user forced a value using tgtadm?"
regards
ronnie sahlberg
--
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