#
# Kernel configuration file for the OSD scsi protocol
#
# Copyright (C) 2008 Panasas Inc.  All rights reserved.
#
# Authors:
#   Boaz Harrosh <ooo@electrozaur.com>
#   Benny Halevy <bhalevy@panasas.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public version 2 License as
# published by the Free Software Foundation
#
config SCSI_OSD_INITIATOR
	tristate "OSD-Initiator library"
	depends on SCSI
	help
		Enable the OSD-Initiator library (libosd.ko).
		NOTE: You must also select CRYPTO_SHA1 + CRYPTO_HMAC and their
		dependencies

config SCSI_OSD_ULD
	tristate "OSD Upper Level driver"
	depends on SCSI_OSD_INITIATOR
	help
		Build a SCSI upper layer driver that exports /dev/osdX devices
		to user-mode for testing and controlling OSD devices. It is also
		needed by exofs, for mounting an OSD based file system.

config SCSI_OSD_DPRINT_SENSE
    int "(0-2) When sense is returned, DEBUG print all sense descriptors"
    default 1
    depends on SCSI_OSD_INITIATOR
    help
        When a CHECK_CONDITION status is returned from a target, and a
        sense-buffer is retrieved, turning this on will dump a full
        sense-decoding message. Setting to 2 will also print recoverable
        errors that might be regularly returned for some filesystem
        operations.

config SCSI_OSD_DEBUG
	bool "Compile All OSD modules with lots of DEBUG prints"
	default n
	depends on SCSI_OSD_INITIATOR
	help
		OSD Code is populated with lots of OSD_DEBUG(..) printouts to
		dmesg. Enable this if you found a bug and you want to help us
		track the problem (see also MAINTAINERS). Setting this will also
		force SCSI_OSD_DPRINT_SENSE=2.
