[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:51:15 CEST 2012


What we could do is

When we open the backing store, we always set lbppbe based on the
blocksize of the backing file.
Then, if the user wants a different  lbppbe, he/she can set it via tgtadm.

If the user then makes the lun offline/online   this resets the lbppbe
back to the blocksize of the backing file
so the user is then responsible to use tgtadm to reset the lbppbe
value back to what he/she wants.


Then document the fact that "once you set lbppbe using tgtadm, this
only lasts until the LUN is made offline/online. lbppbe are reset
across a offline/online operation so if you really need a specific
value you have to reset it with tgtadm after every offline/online
cycle".


regards
ronnie sahlberg


On Wed, Apr 18, 2012 at 9:45 PM, ronnie sahlberg
<ronniesahlberg at gmail.com> wrote:
> 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