Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 17 Jul 2012 10:46:16 -0600
From:      "Kenneth D. Merry" <ken@freebsd.org>
To:        Trent Nelson <trent@snakebite.org>
Cc:        "freebsd-scsi@freebsd.org" <freebsd-scsi@freebsd.org>
Subject:   Re: CAM Target Layer and dev/isp
Message-ID:  <20120717164616.GA10673@nargothrond.kdm.org>
In-Reply-To: <CC2A50D7.3264B%trent@snakebite.org>
References:  <CC2A50D7.3264B%trent@snakebite.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, Jul 16, 2012 at 20:14:31 -0700, Trent Nelson wrote:
> Hi Ken,
> 
> So, first off, nice work on CTL!  I accidentally stumbled onto this little
> gem yesterday and was shocked I hadn't heard of it before.  (Although it
> seems I'm not alone, even Google only seems to know about your original
> mailing list posts -- `+freebsd +ctladm` returns surprisingly little.)

Glad you like it!

> (Somewhat related question before I get into my main issue: `ctladm`
> should remove the need for share/examples/scsi_target, right?  The CAM
> Target Layer stuff encompasses all the original functionality exposed in
> scsi_target?)

Well, scsi_target is still useful as an example of how to create a userland
target application.

> I'm not sure how to expose LUNs via my isp devices.  Here's what I've got
> so far:
> 
> [root@s24/ttypts/1(../misc/isp/bin)#] for i in {0..3}; do; ./isp_getrole
> /dev/isp$i; done
> /dev/isp0 chan 0: role target
> /dev/isp1 chan 0: role target
> /dev/isp2 chan 0: role target
> /dev/isp3 chan 0: role target

Looks good.  What model Qlogic board is it?  I know the driver works pretty
well in target mode with 4Gb and 8Gb boards, but I don't know how well 2Gb
and older boards work.

> [root@s24/ttypts/1(../misc/isp/bin)#] ctladm devlist -v
> LUN Backend       Size (Blocks)   BS Serial Number    Device ID
>   0 ramdisk             2097152  512 MYSERIAL   0     MYDEVID   0
>       lun_type=0

That looks fine.  Note that it is a fake ramdisk that is only backed by 1MB
of memory no matter how large the reported size is.  So you can make it as
large as you want.

> [root@s24/ttypts/1(../misc/isp/bin)#] ctladm port -l
> Port Online Type     Name         pp vp WWNN               WWPN
>   
> 0    YES    IOCTL    CTL ioctl    0  0  0                  0
>   
> 1    YES    INTERNAL ctl2cam      0  0  0x5000000357375b00
> 0x5000000357375b02
> 2    YES    INTERNAL CTL internal 0  0  0                  0
>   
> 3    YES    FC       isp0         0  0  0x200000e08b146178
> 0x210000e08b146178
> 4    YES    FC       isp1         1  0  0x400000007f000009
> 0x400000007f000009
> 5    YES    FC       isp2         2  0  0x200000e08b102f5b
> 0x210000e08b102f5b
> 6    YES    FC       isp3         3  0  0x200000e08b302f5b
> 0x210100e08b302f5b

All of the ports are online, so that looks good.

> It's not obvious from the docs how to export CTL LUNs through my isp
> devices.  I tried passing -D /dev/isp[n] to `ctladm create`, but that
> returns: 'ctladm: cctl_create_lun: error issuing CTL_LUN_REQ ioctl:
> Inappropriate ioctl for device'.

The block backend only works on block devices or files.  e.g.:

ctladm create -b block -o file=/path/to/my/file
ctladm create -b block -o file=/dev/da5

If you use a block device (like a zvol) as the backing store, you'll want
to disable sending cache syncs to the disk, since that will trigger a GEOM
assertion.

ctladm realsync off

(Do that before putting the ports online.)

> Sample output from one of the switches on my fabric (s24's /dev/isp1 is
> plugged into port 8 of sf1):
> 
> sf1:admin> switchshow
> switchName:	sf1
> switchType:	17.2
> switchState:	Online
> switchMode:	Native
> switchRole:	Principal
> switchDomain:	1
> switchId:	fffc01
> switchWwn:	10:00:00:60:69:5a:1a:40
> switchBeacon:	OFF
> Zoning:      	ON (cfg_2012_07_16)
> port  0: id N2 Online         F-Port 50:06:0b:00:00:13:18:72
> port  1: id N2 No_Light
> port  2: id N2 Online         E-Port 10:00:00:60:69:5a:09:c0 "sf2"
> (downstream) 
> port  3: id N2 No_Light
> port  4: id N2 No_Light
> port  5: id N2 Online         F-Port 21:01:00:e0:8b:ab:cf:be
> port  6: id N2 Online         F-Port 21:01:00:e0:8b:a6:98:ca
> port  7: id N2 Online         F-Port 21:01:00:e0:8b:30:2f:5b
> port  8: id N1 Online         L-Port 1 public

Looks like it is in loop mode.  Can your switch make a loop mode device
visible on another port?  What are you using for an initiator?  Does it
work if you connect the initiator directly to the FreeBSD target?

> Ideally I'd like to be able to use CTL to export multiple ZFS zvols as
> separate targets (i.e. all with unique WWNN/WWPNs), such that, from the
> fabric's point of view, the port would look like just another FC-AL JBOD,
> like, say, port 11:

[ ... ]

> That'll allow me to zone the zvols just as if they were actual JBOD disks.
>  Which will be awesome.
> 
> Is that possible?

CTL will just create multiple LUNs, not multiple targets.  Each LUN will
show up on all of the ports.

If your switch has NP-IV support, you can also try creating multiple
virtual ports with the isp(4) driver if you set the hint.isp.0.vports=N
loader tunable, where N is the number of virtual ports.  I haven't tried
that in several years, though, and Matt Jacob has indicated it needs more
testing.

As for using zvols, the code that is in FreeBSD right now will lead to very
slow performance with zvols.  Justin Gibbs and Will Andrews gave a talk at
BSDCan that explained their work to eliminate COW (Copy On Write) faults
for files used as block devices and zvols.  Their slides are here:

http://www.bsdcan.org/2012/schedule/events/316.en.html

And the talk itself is here:

http://www.youtube.com/watch?v=LtY3vpX-cdM

It's fine to use zvols now, but you may want to wait until their code does
into FreeBSD/head at least to use zvols for anything that requires
reasonable performance.

Until their code goes in the tree, you'll probably get somewhat faster
performance by using files on top of ZFS, or on top of UFS.  (UFS will be
much faster at the moment, but you don't get the software RAID
functionality of ZFS.)

The first write pass through on a zvol or a ZFS file will go very quickly,
but subsequent writes will be pretty slow, especially if they are not on
exact ZFS record boundaries.

Also, Matt Jacob and I are chasing down a possible data corruption bug.
We don't know exactly where it is, and it might not be in the code that
is in FreeBSD right now.  The point is, run some data integrity tests
before using this in production.

> Also, the HA stuff sounds bad-ass.  What's the best way to stay up to date
> with CTL development?  Watch commits to sys/cam/ctl?  (There's no separate
> list or anything for this stuff, right?)

That's pretty much the best way to keep up with it, there's not a separate
mailing list.

I don't think I'm going to have time to do anything with the HA hooks in
the near future.  Hopefully other folks will be interested and do some
development in that area.  It would be nice to have a fully HA block stack,
but that will take a lot of effort.

Ken
-- 
Kenneth Merry
ken@FreeBSD.ORG



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120717164616.GA10673>