devb-loopback
Pseudo block driver
Syntax:
devb-loopback [loopback loopback_option[,option]]
              [blk option[,option]...] 
              [fs_type options] &
Runs on:
QNX OS
Options:
,) to separate the options.
You can put the blk and loopback
groups of options in any order.
- loopback options
 - The loopback options include global and order-dependent options:
  
- Global options apply to all fd= instances. You can specify them anywhere in the loopback options.
 - Order-dependent options apply to all subsequent fd= files.
    Note:You can specify multiple occurrences of the order-dependent options with different values. For example, for read-only access for the first device, and read-write access for the second device, specify the following:
loopback ro,fd=/dev/cd0,rw,fd=/fs/hd/iso.img
 
The global options include the following:
- nio=num
 - The number of asynchronous I/O threads (which are responsible
  for executing an internal block device read/write as a normal
  read/write over the external file descriptor).
  This multithreading is useful if you've specified multiple fd=
  devices.
  
The default is 1. You can specify a value of 0 to force all I/O to be performed synchronously in the context of the filesystem caller; it can be higher to prevent this I/O from becoming a bottleneck to the filesystem layers above (appropriate only when multiple fd= paths have been specified). The pool of threads services requests to all fd= files in the order of client priority.
 - prefix=name
 - The name by which the loopback pseudo block devices are registered.
  The default is 
lo; thus each fd= entry named on the command line appears as /dev/lo0, /dev/lo1, and so on, in order. - user=UID
 - 
                  
Change to the specified user ID after setup. Default is 0.
 
The order-dependent options include the following:
- fd=path
 - Specify a filename (a path registered by your resource manager) to be
  presented as a block device by devb-loopback.
  This pathname must support
  open(),
  close(),
  read(),
  write(),
  and
  fstat();
  for more information, see
  
Driver support,
below.Each pathname results in the creation of a corresponding block-special device (see the global prefix= option), the content of which is mirrored over the file descriptor using standard read/write calls. You can then mount traditional block filesystems (such as fs-dos.so and fs-qnx6.so) on top of these pseudo devices and use them transparently.
You can specify multiple fd= pathnames; they're managed by a single devb-loopback process.
 - rw, ro
 - Set the access mode to use when opening the underlying file descriptor (corresponds to O_RDWR or O_RDONLY). If you specify read-only, then in turn you can mount only read-only filesystems onto the corresponding devb-loopback device (the pseudo-device is advertised up as DEV_RDONLY). The default is rw.
 - sync, async
 - Set the synchronous write mode to use when opening the underlying
  file descriptor (corresponds to O_SYNC).
  The effect of this depends on the resource manager responsible for each
  file (typically it's ignored).
  Note:This option affects writes that are presented to the pseudo-device, and not the write behavior of any mounted filesystems above this (that can be controlled via mount options or blk delwri=... commit=...).
The default is sync.
 - denyno, denyrd, denywr, denyrw
 - The SH_DENY* mode to use when opening the underlying file descriptor. A deny mode stops other processes from opening the host file, thus preventing its content from being changed behind the back of the devb-loopback filesystems, which prevents coherence issues. The default is denyrw.
 - seek, xtype
 - Configure I/O onto the file descriptor using either an LSEEK+READ combined message or via a READ+XTYPE_OFFSET composite. By default, devb-loopback probes the host filesystem to determine whether it supports the pread() and pwrite() API. The default is xtype.
 - blksz=[size]
 - Override the device blocksize.
  This is typically probed from a
  stat()
  or DCMD_CAM_DEVINFO
  devctl()
  call onto the resource manager responsible for each file
  and the same value advertised up, but some resource managers don't
  advertise a useful blocksize (in particular, devf-* reports
  1-byte blocks).
  
You might also need this option in some cases where a filesystem image was originally formatted on a device with a different sector size to that of the hosting filesystem; it may be necessary for correct operation or performance reasons to mimic the original sector size.
This option applies to all subsequent instances of fd=, but you can reset it to use the probed value with an empty option (e.g. blksz=2048,fd=/F1,blksz=,fd=/F2).
 - heads=num
 - Specify the number of heads (default 1).
 - tracks=num
 - Specify the number of sectors per track (default 1).
 
 - blk options
 - The blk options are as for
  io-blk.so.
  If specified, they must follow the blk keyword.
  
Since devb-loopback loads the standard block device DLLs, which creates a buffer cache using the same default rules as for the disk filesystems, the cache is likely to be too big for devb-loopback. You can reduce the cache size using blk cache=size. Depending on the actual size of the device, and the level of caching already implemented by its driver, a value of
128kmay be sufficient. - fs_type options
 - The fs_type options control any filesystem (fs-*.so) module being loaded. Here, fs_type is the filesystem type, such as qnx6 for the Power-Safe filesystem. For the list of supported filesystem options, see the reference for the corresponding shared object. For example, for qnx6, see fs-qnx6.so.
 
Description:
The block filesystems in the QNX OS are implemented as a series of DLL modules and a set of internal APIs. Thus it's possible to mount disk-based filesystems (such as Power-Safe or DOS) only onto released QNX devb-* drivers. The devb-loopback driver implements a mapping between an arbitrary file descriptor and the block API, allowing any resource manager to be used to host a disk filesystem.
Internal function calls, normally targeted at a CAM driver, are translated into standard read() and write() calls onto the host file descriptor, and are used to populate the data content of a pseudo block device, which appears to the system as a disk.
devb-loopback fd=/devf/iso blk automount=lo0:/fs/iso:cd
Other uses might be to mount images from /dev/shmem, an image filesystem (IFS), or over NFS.
The host file needs to be pregrown.
Using devb-loopback in this case adds functionality that a disk filesystem format offers (access times, hard links, etc.) to the devf-* filesystem. In other cases, devb-loopback lets you use the caching (e.g., names and sectors) that io-blk.so supports, but that the resource manager underlying the host file might not.
Driver support
- open(), close()
 - The device must be able to open and close a file descriptor to it. The O_RDONLY and O_RDWR modes should be supported, as should the SH_DENY* share flags and O_SYNC modifier (if those options are used from the devb-loopback command line); the default libc iofunc open handler is suitable.
 - fstat()
 - The device must support a 
statmethod, which is used to determine the size and geometry of the underlying device. The default libc iofunc handler is suitable, provided there's an associated iofunc_mount_t which sets a suitableblocksize
(the default is 1 byte, which isn't appropriate for use as a block device; it must be one of 512, 1024, 2048, or 4096). See also devctl() (below) and the loopback blksz= option. - read(), write()
 - The device must support read and write callouts,
  which are used to transfer 
disk blocks
between the device and the filesystem buffer cache. I/O is in units of the advertised block size and within the bounds of the advertised device size. If the device supports the _IO_XTYPE_OFFSET modifier (corresponding to pread() and pwrite()), then that interface is used; otherwise a combined seek plus normal read/write is made. - lseek()
 - If _IO_XTYPE_OFFSET isn't supported,
  then the device must implement an 
lseekmethod. The default libc iofunc callout is suitable. - devctl()
 - The device may optionally implement the DCMD_CAM_DEVINFO devctl() command (refer to the <sys/dcmd_cam.h> and <sys/cam_device.h> header files). This allows the device to set certain low-level fields to fine-tune emulation behavior. The DCMD_ALL_GETFLAGS command is also used to probe the status of a (removable) file descriptor. However, suitable defaults for both these can be inferred from the fstat() query.
 
Mounting
devb-loopback blk cache=256k,vnode=128 \
              loopback ro,blksz=2048,fd=/mnt/EFS/tts.iso &
mount -r -t udf /dev/lo0 /mnt/tts
or via the blk automount= option:
devb-loopback blk cache=256k,vnode=128,automount=lo0:/mnt/tts:cd \
              loopback ro,blksz=2048,fd=/mnt/EFS/tts.iso &
You can use umount to unmount the filesystem. The file descriptors to the underlying host image files aren't closed, and /dev/lo* remain present, until devb-loopback is terminated.
