---------------------------------
Notes on using xfsdump/xfsrestore
---------------------------------

Contents
----------
Disclaimer
Example usage 
Testing of xfsdump 
Command Option Changes from IRIX xfsdump to Linux
Notes on tape block sizes
Restoring an IRIX dump tape onto a Linux xfs filesystem
TODO List


Disclaimer
----------
Testing of this software has been done using the Linux 
scsi tape driver only. If one is using a different tape
driver one may need to use the -m option which makes
less assumptions about the tape driver's capabilities.

Example usage 
-------------

1. Dumping a filesystem to a dump file:
   xfsdump -f dump_file -L session_label -M media_label file_system
   e.g. xfsdump -f ./mydump -L 'session1' -M 'media1" /mnt/xfs0 

2. Restoring a filesystem from a dump file:
   xfsrestore -f ./mydump -L session_label dest_dir
   e.g. xfsrestore -f ./mydump -L 'session1' ./myfilesystem 

3. Dumping a filesystem to a dump tape:
   xfsdump -f tapedevice -L session_label -M media_label file_system
   e.g. xfsdump -f /dev/st0 -L 'session1' -M 'media1" /mnt/xfs0 

4. Restoring a filesystem from a dump tape:
   xfsrestore -f tapedevice -L session_label dest_dir
   e.g. xfsrestore -f /dev/st0 -L 'session1' ./myfilesystem


Testing of xfsdump 
------------------

There are scripts in the stress directory which
verify that xfsdump and xfsrestore are working.
Use "grep xfsdump group" to see which tests they are.

Stress/common.config needs to be updated for one's host with:
   SCRATCH_DEV      - device for test filesystem
   SCRATCH_MNT      - mount point for test filesystem
   TAPE_DEV         - tape device e.g. /dev/st0
   RMT_TAPE_DEV     - remote tape device
   RMT_IRIXTAPE_DEV - remote IRIX tape device
   RMT_TAPE_USER    - remote user for tape device
The first two above are absolutely necessary.
The tape device variables are only needed if one wants
to test out that particular functionality of xfsdump/xfsrestore.
The RMT_* variables are needed for testing remote tape capability.

With the common.config updated one should be able to run
as root: 
# ./check -g xfsdump


Command Option Changes from IRIX xfsdump to Linux
-------------------------------------------------

Xfsdump on Linux has been changed (from the IRIX version)
to allow the -b option to be used without the -m option. 
In IRIX, the block size could only be specified if one selected
the minimum remote (-m) option. This means that one can now
override the block size to use for dumping and restoring 
from tape, with an upper limit of 2Mb.

The semantics of the -m option has also changed. In IRIX, this
option would only take effect for remote tape specifications.
In the Linux version, the -m option can be used for local tapes
where the tape device only has a restricted set of mt(1) commands.

The -q option has been added to tell xfsdump/xfsrestore explicitly
that a QIC tape drive is being used. In IRIX, an i/o control system
call is issued which returns the subtype of tape device being used;
for example "TPQIC*". However, there is no direct equivalent in Linux.


Notes on tape block sizes
-------------------------
The IRIX version of xfsdump has typically used 2Mb tape blocks
for writing local dumps to tape. The size is actually calculated by
getting the maximum block size supported from the tape device 
($mt blksize) and capping it at 2Mb (i.e. min(2Mb, blk-size-max)). 
On Linux, the maximum block size is not exported by the scsi tape driver,
and has been set to have a default of 1Mb.  

In some experiments with a 2Mb block size, we found that sometimes
read and writes using the scsi tape driver would fail:
    /tmp/xfsdump: tape op: writing 2097152 bytes
    /tmp/xfsdump: tape op write of 2097152 bytes failed: errno == 75 (Value too large for defined data type)
It apparently fails when scsi_init_malloc() fails with EOVERFLOW.
According to Kai Makisara, the tape drive supports scatter/gather
and has a default of 16 segments of 128K or 256K with the
first segment of only 32K. So with 128K segments we have,
15 * 128k + 32 K = 1952K (short of 2Mb). 
Thus in order to use large block buffers requires one
to increase the number of segments, "max_sg_segs".
A suggested number to use is 64 segments (it apparently depends
on the scsi adapter, but it has been suggested that most should
handle at least 64).
This can be done by either:
  - insmod st max_sg_segs=64
  - add to /etc/modules.conf:
    options st max_sg_segs=64
  - add to boot command line:
    st=max_sg_segs:64

The IRIX version of xfsdump has typically used 240K tape blocks
for writing remote dumps to tape. 

The Linux ext2 dump program and tar(1) would not have this problem
as they use 10K default blocks which can be increased using the
-b option (up to a maximum of 64K blocks for dump(1)). 

Using a smaller block size
--------------------------
Sometimes a tape device will not support large blocksizes of 1Mb.
The scsi tape driver outputs the maximum block size the tape
supports in the syslog.
For example:
  st0: Block limits 1 - 245760 bytes.
Unfortunately, the scsi tape driver does not export the maximum
block size (other than via the syslog), therefore xfsdump/xfsrestore
can not adjust the blocksize automatically.
In this case, one should specify this maximum blocksize as
the blocksize for xfsdump/xfsrestore to use with the -b option.
For example:
  xfsdump -b 245760 -f /dev/st0 -M media -L session /
Blocksizes of less than 240K have not be tested.


Restoring an IRIX dump tape onto a Linux xfs filesystem
-------------------------------------------------------

To restore an IRIX xfs dump tape, one will need to specify
the blocksize that was used by giving a -b option. 

Examples:

For 2Mb blocks:
xfsrestore -f /dev/st0 -b 2097152 -L 'session1' dest_dir

For 240K blocks (a remotely dumped tape):
xfsrestore -f /dev/st0 -b 245760 -L 'session1' dest_dir 

If errors such as:
  /tmp/xfsdump: tape op write of 2097152 bytes failed: errno == 75 (Value too large for defined data type)
occur, then one may need to increase the number of segments used
by the scsi tape driver (max_sg_segs) as mentioned above.


TODO List
---------

* fix up xfsdump/xfsrestore to run multi-threaded 
  (needs pthreads & locking code)
* complete the port of xfs_copy 
  (needs pthreads & locking code)
