The author of sg3_utils would like to thank the following people who
have made contributions:


Andries Brouwer <aebr at win dot tue dot nl> rewrite of isosize (original
        written by Joerg Schilling). isosize is now found in the util-linux
        package and in the archive directory of this package.

Bart Van Assche <bart dot vanassche at sandisk dot com>
        harden (improve) code in rescan-scsi-bus.sh [20160224]
        configure.ac and Makefile.am cleanup plus sgp_dd code
        to replace pthread_cancel with pthread_kill [20180102]
        sg_xcopy: fix identification CSCD descriptor's designator
        length, fix CSCD descriptor mask [20210902]

Bean Huo <beanhuo dot micron dot com>
        sg_write_buffer: patch to allow comma or period separated bytes
        (in decimal or hex) to be decoded when given as standard input.

Brian Bunker <Brian dot Bunker at netapp dot com> contributed
        sg_read_block_limits and the target reset addition to sg_reset
        [20090615]

Christophe Varoqui <christophe dot varoqui at free dot fr> original sg_rtpg
        [20041229]

Clayton Weaver <cgweav at email dot com> contributed safe_strerror().

Dan Horak <dhorak at redhat dot com> website support for this package and
        others. Lot of fixes, recently man pages [20140128]

Dave Johnson <ddj at ccv dot brown dot edu> improved disk defect list
        handling [20051218]

Dave Williams <dave at opensourcesolutions dot co dot uk> help with
        sgp_dd especially and "> 0x7fffffff" with sg*_dd [20060303]

Eric Schwartz <emschwar at debian dot org> who wrote these man pages:
        sg_readcap, sg_reset, sg_scan, sg_start, sg_test_rwbuf,
        sg_turs and sginfo

Eric Seppanen <eric @ purestorage dot com> borrowed ideas from alternate
        implementation of sg_compare_and_write [20130823]

Eric Youngdale <eric at andante dot org> author of scsi_info on which sginfo
        is based.

Fabrice Fontaine <fontaine dot fabrice at gmail dot com>
        various build fixes [20211116]

Frank Jansen <fjansen at egenera dot com>: additions to sg_scan; contributed
        code for '--alloc-length=' option in sg_persist [20090402]

Grant Grundler <grundler at parisc-linux dot org> co-author of blk512-linux
        that has become sg_format [20050201]

Greg Inozemtsev <greg at purestorage dot com>
        extensions to sg_xcopy [20130207+20130816]

Hannes Reinecke <hare at suse dot de>
        contributed sg_rdac, (and some corresponding VPD entries to
        sg_vpd_vendor), sg_stpg and sg_safte [20071013+20130110]
        sg_referrals [20100906]
        sg_inq --export option [20120220+20130109]
        sg_xcopy+sg_copy_results [20120322]
        rescan-scsi-bus.sh patches to Kurt Garloff's v1.57 [20130715]
        55-scsi-sg3_id.rules + 58-scsi-sg3_symlink.rules [20140527]
        sg_sat_read_gplog [20141107]
        sg_inq --only option plus --inhex fixes [20180102]

Hayashi Naoyuki <titan at culzean dot org>
        port to Tru64 [20060127]

Heiko Eissfeldt <heiko at colossus dot escape dot de> sg based example
        programs for the original sg driver

Ilan Steinberg <ilan dot steinberg at kaminario dot com>
        sg_xcopy: contributed --on_src and --on_dst options [20130505]

Ingo van Lil <inguin at gmx dot de>
        contributed sg_raw [20070331]

James Bottomley <jejb at parisc-linux dot org> co-author of blk512-linux
        that has become sg_format [20050201]

Jan Engelhardt <jengelh at inai dot de>
        autotools clean-up [20150216]

Joe Krahn <krahn at niehs dot nih dot gov> help with int64_t cleanup
        [20071219]

Kai Makisara <Kai dot Makisara at kolumbus dot fi> help with tape
        minor numbers in lk 2.6 plus earlier advice [20081008]

Kurt Garloff: original sg_start and sg_test_rwbuf.
        Additions to sginfo and sg_map. Author of rescan-scsi-bus.sh with
        latest update to v1.57 [20130331]

Lars Marowsky-Brée <lmb at suse dot de> contributed Unit Path Report VPD
        page decoding in sg_inq (vendor specific: EMC) and sg_emc_trespass
        utility

Luben Tuikov <ltuikov at yahoo dot com>
        help with documentation and other suggestions [20061014]
        contribution sg_read_buffer and sg_write_buffer [20061103]

Marius Konitzer <marius dot konitzer at ruhr-uni-bochum dot de
        log pages on IBM LTO Ultrium drives [20100225]

Mark Knibbs <markk at clara dot co dot uk>
        suggested and tested oflag=sparse for sg_dd

Martin Schwenke <martin at meltin dot net> added the raw switch "-r" to sg_inq

Martin Wilck <mwilck at suse dot com> contributed script files [20190425 and
        20220218]]

Nate Dailey < Nate dot Dailey at stratus dot com > extended sg_map for sparse
        disk node names (e.g. /dev/sdaaa) [20050511]

Nitin U. Yewale < nyewale at redhat dot com> sent patch via github:
        https://github.com/doug-gilbert/sg3_utils/pull/10/ to fix crash with
        rescan-scsi-bus.sh -r due to rev 867 change to sg_inq [20220103]

Pat LaVarre <p.lavarre at ieee dot org> pointed out danger of negative bpt
        values in sg_dd (and friends); also problems when reading /dev/null

Peter Allworth <linsol at zeta dot org dot au> original dd clone design used
        by sg3_utils's dd variants (e.g. sg_dd).

Roland Dreier <roland at purestorage dot com>
        extension and correction to sg_xcopy [20120205]

Ronnie Sahlberg <ronniesahlberg at gmail dot com> has written libiscsi and a
        set of external patches to add direct iSCSI support to this package.
        See README.iscsi [20110518]

Saeed Bishara contributed sg_write_long

Sean Stewart <Sean dot Stewart at netapp dot com> various improvements
        to rescan-scsi-bush.sh script [20130827]

Shahar Salzman <shahar dot salzman at kaminario dot com> contributed
        sg_compare_and_write [20121205]

Thomas Kolbe <tkolbe at partnersdata dot com>
        Solaris port help and testing [20070503]

Tim Hunt <tim at timhunt dot net> increased number of (sd and sg) devices
        that sginfo could detect.

Tom Steudten <steudten at gmx dot ch> sginfo addition: add '-Fhead' option
        to sort defect list by head.

Trent Piepho <xyzzy at speakeasy dot org> print out some "sense key specific"
        data and "-6" switch for sg_modes

Xose Vazquez Perez <xose dot vazquez at gmail dot com>
        documentation corrections [20200117]


Douglas Gilbert
18th February 2022
