mirror of
https://github.com/armbian/linux-cix.git
synced 2026-01-06 12:30:45 -08:00
scsi: remove the SCSI OSD library
Now that all the users are gone the SCSI OSD library can be removed as well. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Jens Axboe <axboe@kernel.dk> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
committed by
Martin K. Petersen
parent
80f2121380
commit
19fcae3d4f
@@ -1,192 +0,0 @@
|
||||
The OSD Standard
|
||||
================
|
||||
OSD (Object-Based Storage Device) is a T10 SCSI command set that is designed
|
||||
to provide efficient operation of input/output logical units that manage the
|
||||
allocation, placement, and accessing of variable-size data-storage containers,
|
||||
called objects. Objects are intended to contain operating system and application
|
||||
constructs. Each object has associated attributes attached to it, which are
|
||||
integral part of the object and provide metadata about the object. The standard
|
||||
defines some common obligatory attributes, but user attributes can be added as
|
||||
needed.
|
||||
|
||||
See: http://www.t10.org/ftp/t10/drafts/osd2/ for the latest draft for OSD 2
|
||||
or search the web for "OSD SCSI"
|
||||
|
||||
OSD in the Linux Kernel
|
||||
=======================
|
||||
osd-initiator:
|
||||
The main component of OSD in Kernel is the osd-initiator library. Its main
|
||||
user is intended to be the pNFS-over-objects layout driver, which uses objects
|
||||
as its back-end data storage. Other clients are the other osd parts listed below.
|
||||
|
||||
osd-uld:
|
||||
This is a SCSI ULD that registers for OSD type devices and provides a testing
|
||||
platform, both for the in-kernel initiator as well as connected targets. It
|
||||
currently has no useful user-mode API, though it could have if need be.
|
||||
|
||||
osd target:
|
||||
There are no current plans for an OSD target implementation in kernel. For all
|
||||
needs, a user-mode target that is based on the scsi tgt target framework is
|
||||
available from Ohio Supercomputer Center (OSC) at:
|
||||
http://www.open-osd.org/bin/view/Main/OscOsdProject
|
||||
There are several other target implementations. See http://open-osd.org for more
|
||||
links.
|
||||
|
||||
Files and Folders
|
||||
=================
|
||||
This is the complete list of files included in this work:
|
||||
include/scsi/
|
||||
osd_initiator.h Main API for the initiator library
|
||||
osd_types.h Common OSD types
|
||||
osd_sec.h Security Manager API
|
||||
osd_protocol.h Wire definitions of the OSD standard protocol
|
||||
osd_attributes.h Wire definitions of OSD attributes
|
||||
|
||||
drivers/scsi/osd/
|
||||
osd_initiator.c OSD-Initiator library implementation
|
||||
osd_uld.c The OSD scsi ULD
|
||||
osd_ktest.{h,c} In-kernel test suite (called by osd_uld)
|
||||
osd_debug.h Some printk macros
|
||||
Makefile For both in-tree and out-of-tree compilation
|
||||
Kconfig Enables inclusion of the different pieces
|
||||
osd_test.c User-mode application to call the kernel tests
|
||||
|
||||
The OSD-Initiator Library
|
||||
=========================
|
||||
osd_initiator is a low level implementation of an osd initiator encoder.
|
||||
But even though, it should be intuitive and easy to use. Perhaps over time an
|
||||
higher lever will form that automates some of the more common recipes.
|
||||
|
||||
init/fini:
|
||||
- osd_dev_init() associates a scsi_device with an osd_dev structure
|
||||
and initializes some global pools. This should be done once per scsi_device
|
||||
(OSD LUN). The osd_dev structure is needed for calling osd_start_request().
|
||||
|
||||
- osd_dev_fini() cleans up before a osd_dev/scsi_device destruction.
|
||||
|
||||
OSD commands encoding, execution, and decoding of results:
|
||||
|
||||
struct osd_request's is used to iteratively encode an OSD command and carry
|
||||
its state throughout execution. Each request goes through these stages:
|
||||
|
||||
a. osd_start_request() allocates the request.
|
||||
|
||||
b. Any of the osd_req_* methods is used to encode a request of the specified
|
||||
type.
|
||||
|
||||
c. osd_req_add_{get,set}_attr_* may be called to add get/set attributes to the
|
||||
CDB. "List" or "Page" mode can be used exclusively. The attribute-list API
|
||||
can be called multiple times on the same request. However, only one
|
||||
attribute-page can be read, as mandated by the OSD standard.
|
||||
|
||||
d. osd_finalize_request() computes offsets into the data-in and data-out buffers
|
||||
and signs the request using the provided capability key and integrity-
|
||||
check parameters.
|
||||
|
||||
e. osd_execute_request() may be called to execute the request via the block
|
||||
layer and wait for its completion. The request can be executed
|
||||
asynchronously by calling the block layer API directly.
|
||||
|
||||
f. After execution, osd_req_decode_sense() can be called to decode the request's
|
||||
sense information.
|
||||
|
||||
g. osd_req_decode_get_attr() may be called to retrieve osd_add_get_attr_list()
|
||||
values.
|
||||
|
||||
h. osd_end_request() must be called to deallocate the request and any resource
|
||||
associated with it. Note that osd_end_request cleans up the request at any
|
||||
stage and it must always be called after a successful osd_start_request().
|
||||
|
||||
osd_request's structure:
|
||||
|
||||
The OSD standard defines a complex structure of IO segments pointed to by
|
||||
members in the CDB. Up to 3 segments can be deployed in the IN-Buffer and up to
|
||||
4 in the OUT-Buffer. The ASCII illustration below depicts a secure-read with
|
||||
associated get+set of attributes-lists. Other combinations very on the same
|
||||
basic theme. From no-segments-used up to all-segments-used.
|
||||
|
||||
|________OSD-CDB__________|
|
||||
| |
|
||||
|read_len (offset=0) -|---------\
|
||||
| | |
|
||||
|get_attrs_list_length | |
|
||||
|get_attrs_list_offset -|----\ |
|
||||
| | | |
|
||||
|retrieved_attrs_alloc_len| | |
|
||||
|retrieved_attrs_offset -|----|----|-\
|
||||
| | | | |
|
||||
|set_attrs_list_length | | | |
|
||||
|set_attrs_list_offset -|-\ | | |
|
||||
| | | | | |
|
||||
|in_data_integ_offset -|-|--|----|-|-\
|
||||
|out_data_integ_offset -|-|--|--\ | | |
|
||||
\_________________________/ | | | | | |
|
||||
| | | | | |
|
||||
|_______OUT-BUFFER________| | | | | | |
|
||||
| Set attr list |</ | | | | |
|
||||
| | | | | | |
|
||||
|-------------------------| | | | | |
|
||||
| Get attr descriptors |<---/ | | | |
|
||||
| | | | | |
|
||||
|-------------------------| | | | |
|
||||
| Out-data integrity |<------/ | | |
|
||||
| | | | |
|
||||
\_________________________/ | | |
|
||||
| | |
|
||||
|________IN-BUFFER________| | | |
|
||||
| In-Data read |<--------/ | |
|
||||
| | | |
|
||||
|-------------------------| | |
|
||||
| Get attr list |<----------/ |
|
||||
| | |
|
||||
|-------------------------| |
|
||||
| In-data integrity |<------------/
|
||||
| |
|
||||
\_________________________/
|
||||
|
||||
A block device request can carry bidirectional payload by means of associating
|
||||
a bidi_read request with a main write-request. Each in/out request is described
|
||||
by a chain of BIOs associated with each request.
|
||||
The CDB is of a SCSI VARLEN CDB format, as described by OSD standard.
|
||||
The OSD standard also mandates alignment restrictions at start of each segment.
|
||||
|
||||
In the code, in struct osd_request, there are two _osd_io_info structures to
|
||||
describe the IN/OUT buffers above, two BIOs for the data payload and up to five
|
||||
_osd_req_data_segment structures to hold the different segments allocation and
|
||||
information.
|
||||
|
||||
Important: We have chosen to disregard the assumption that a BIO-chain (and
|
||||
the resulting sg-list) describes a linear memory buffer. Meaning only first and
|
||||
last scatter chain can be incomplete and all the middle chains are of PAGE_SIZE.
|
||||
For us, a scatter-gather-list, as its name implies and as used by the Networking
|
||||
layer, is to describe a vector of buffers that will be transferred to/from the
|
||||
wire. It works very well with current iSCSI transport. iSCSI is currently the
|
||||
only deployed OSD transport. In the future we anticipate SAS and FC attached OSD
|
||||
devices as well.
|
||||
|
||||
The OSD Testing ULD
|
||||
===================
|
||||
TODO: More user-mode control on tests.
|
||||
|
||||
Authors, Mailing list
|
||||
=====================
|
||||
Please communicate with us on any deployment of osd, whether using this code
|
||||
or not.
|
||||
|
||||
Any problems, questions, bug reports, lonely OSD nights, please email:
|
||||
OSD Dev List <osd-dev@open-osd.org>
|
||||
|
||||
More up-to-date information can be found on:
|
||||
http://open-osd.org
|
||||
|
||||
Boaz Harrosh <ooo@electrozaur.com>
|
||||
|
||||
References
|
||||
==========
|
||||
Weber, R., "SCSI Object-Based Storage Device Commands",
|
||||
T10/1355-D ANSI/INCITS 400-2004,
|
||||
http://www.t10.org/ftp/t10/drafts/osd/osd-r10.pdf
|
||||
|
||||
Weber, R., "SCSI Object-Based Storage Device Commands -2 (OSD-2)"
|
||||
T10/1729-D, Working Draft, rev. 3
|
||||
http://www.t10.org/ftp/t10/drafts/osd2/osd2r03.pdf
|
||||
@@ -11385,12 +11385,6 @@ W: http://www.nongnu.org/orinoco/
|
||||
S: Orphan
|
||||
F: drivers/net/wireless/intersil/orinoco/
|
||||
|
||||
OSD LIBRARY and FILESYSTEM
|
||||
M: Boaz Harrosh <ooo@electrozaur.com>
|
||||
S: Maintained
|
||||
F: drivers/scsi/osd/
|
||||
F: include/scsi/osd_*
|
||||
|
||||
OV2659 OMNIVISION SENSOR DRIVER
|
||||
M: "Lad, Prabhakar" <prabhakar.csengg@gmail.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
|
||||
@@ -1515,6 +1515,4 @@ source "drivers/scsi/pcmcia/Kconfig"
|
||||
|
||||
source "drivers/scsi/device_handler/Kconfig"
|
||||
|
||||
source "drivers/scsi/osd/Kconfig"
|
||||
|
||||
endmenu
|
||||
|
||||
@@ -150,7 +150,6 @@ obj-$(CONFIG_CHR_DEV_SG) += sg.o
|
||||
obj-$(CONFIG_CHR_DEV_SCH) += ch.o
|
||||
obj-$(CONFIG_SCSI_ENCLOSURE) += ses.o
|
||||
|
||||
obj-$(CONFIG_SCSI_OSD_INITIATOR) += osd/
|
||||
obj-$(CONFIG_SCSI_HISI_SAS) += hisi_sas/
|
||||
|
||||
# This goes last, so that "real" scsi devices probe earlier
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
#
|
||||
# Kbuild for the OSD modules
|
||||
#
|
||||
# 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 License version 2
|
||||
#
|
||||
|
||||
# libosd.ko - osd-initiator library
|
||||
libosd-y := osd_initiator.o
|
||||
obj-$(CONFIG_SCSI_OSD_INITIATOR) += libosd.o
|
||||
|
||||
# osd.ko - SCSI ULD and char-device
|
||||
osd-y := osd_uld.o
|
||||
obj-$(CONFIG_SCSI_OSD_ULD) += osd.o
|
||||
@@ -1,49 +0,0 @@
|
||||
#
|
||||
# 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.
|
||||
@@ -1,30 +0,0 @@
|
||||
/*
|
||||
* osd_debug.h - Some kprintf macros
|
||||
*
|
||||
* 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 License version 2
|
||||
*
|
||||
*/
|
||||
#ifndef __OSD_DEBUG_H__
|
||||
#define __OSD_DEBUG_H__
|
||||
|
||||
#define OSD_ERR(fmt, a...) printk(KERN_ERR "osd: " fmt, ##a)
|
||||
#define OSD_INFO(fmt, a...) printk(KERN_NOTICE "osd: " fmt, ##a)
|
||||
|
||||
#ifdef CONFIG_SCSI_OSD_DEBUG
|
||||
#define OSD_DEBUG(fmt, a...) \
|
||||
printk(KERN_NOTICE "osd @%s:%d: " fmt, __func__, __LINE__, ##a)
|
||||
#else
|
||||
#define OSD_DEBUG(fmt, a...) do {} while (0)
|
||||
#endif
|
||||
|
||||
/* u64 has problems with printk this will cast it to unsigned long long */
|
||||
#define _LLU(x) (unsigned long long)(x)
|
||||
|
||||
#endif /* ndef __OSD_DEBUG_H__ */
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,201 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2011
|
||||
* Boaz Harrosh <ooo@electrozaur.com>
|
||||
*
|
||||
* Public Declarations of the ORE API
|
||||
*
|
||||
* This file is part of the ORE (Object Raid Engine) library.
|
||||
*
|
||||
* ORE is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as published
|
||||
* by the Free Software Foundation. (GPL v2)
|
||||
*
|
||||
* ORE is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with the ORE; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
#ifndef __ORE_H__
|
||||
#define __ORE_H__
|
||||
|
||||
#include <scsi/osd_initiator.h>
|
||||
#include <scsi/osd_attributes.h>
|
||||
#include <scsi/osd_sec.h>
|
||||
#include <linux/pnfs_osd_xdr.h>
|
||||
#include <linux/bug.h>
|
||||
|
||||
struct ore_comp {
|
||||
struct osd_obj_id obj;
|
||||
u8 cred[OSD_CAP_LEN];
|
||||
};
|
||||
|
||||
struct ore_layout {
|
||||
/* Our way of looking at the data_map */
|
||||
enum pnfs_osd_raid_algorithm4
|
||||
raid_algorithm;
|
||||
unsigned stripe_unit;
|
||||
unsigned mirrors_p1;
|
||||
|
||||
unsigned group_width;
|
||||
unsigned parity;
|
||||
u64 group_depth;
|
||||
unsigned group_count;
|
||||
|
||||
/* Cached often needed calculations filled in by
|
||||
* ore_verify_layout
|
||||
*/
|
||||
unsigned long max_io_length; /* Max length that should be passed to
|
||||
* ore_get_rw_state
|
||||
*/
|
||||
};
|
||||
|
||||
struct ore_dev {
|
||||
struct osd_dev *od;
|
||||
};
|
||||
|
||||
struct ore_components {
|
||||
unsigned first_dev; /* First logical device no */
|
||||
unsigned numdevs; /* Num of devices in array */
|
||||
/* If @single_comp == EC_SINGLE_COMP, @comps points to a single
|
||||
* component. else there are @numdevs components
|
||||
*/
|
||||
enum EC_COMP_USAGE {
|
||||
EC_SINGLE_COMP = 0, EC_MULTPLE_COMPS = 0xffffffff
|
||||
} single_comp;
|
||||
struct ore_comp *comps;
|
||||
|
||||
/* Array of pointers to ore_dev-* . User will usually have these pointed
|
||||
* too a bigger struct which contain an "ore_dev ored" member and use
|
||||
* container_of(oc->ods[i], struct foo_dev, ored) to access the bigger
|
||||
* structure.
|
||||
*/
|
||||
struct ore_dev **ods;
|
||||
};
|
||||
|
||||
/* ore_comp_dev Recievies a logical device index */
|
||||
static inline struct osd_dev *ore_comp_dev(
|
||||
const struct ore_components *oc, unsigned i)
|
||||
{
|
||||
BUG_ON((i < oc->first_dev) || (oc->first_dev + oc->numdevs <= i));
|
||||
return oc->ods[i - oc->first_dev]->od;
|
||||
}
|
||||
|
||||
static inline void ore_comp_set_dev(
|
||||
struct ore_components *oc, unsigned i, struct osd_dev *od)
|
||||
{
|
||||
oc->ods[i - oc->first_dev]->od = od;
|
||||
}
|
||||
|
||||
struct ore_striping_info {
|
||||
u64 offset;
|
||||
u64 obj_offset;
|
||||
u64 length;
|
||||
u64 first_stripe_start; /* only used in raid writes */
|
||||
u64 M; /* for truncate */
|
||||
unsigned bytes_in_stripe;
|
||||
unsigned dev;
|
||||
unsigned par_dev;
|
||||
unsigned unit_off;
|
||||
unsigned cur_pg;
|
||||
unsigned cur_comp;
|
||||
unsigned maxdevUnits;
|
||||
};
|
||||
|
||||
struct ore_io_state;
|
||||
typedef void (*ore_io_done_fn)(struct ore_io_state *ios, void *private);
|
||||
struct _ore_r4w_op {
|
||||
/* @Priv given here is passed ios->private */
|
||||
struct page * (*get_page)(void *priv, u64 page_index, bool *uptodate);
|
||||
void (*put_page)(void *priv, struct page *page);
|
||||
};
|
||||
|
||||
struct ore_io_state {
|
||||
struct kref kref;
|
||||
struct ore_striping_info si;
|
||||
|
||||
void *private;
|
||||
ore_io_done_fn done;
|
||||
|
||||
struct ore_layout *layout;
|
||||
struct ore_components *oc;
|
||||
|
||||
/* Global read/write IO*/
|
||||
loff_t offset;
|
||||
unsigned long length;
|
||||
void *kern_buff;
|
||||
|
||||
struct page **pages;
|
||||
unsigned nr_pages;
|
||||
unsigned pgbase;
|
||||
unsigned pages_consumed;
|
||||
|
||||
/* Attributes */
|
||||
unsigned in_attr_len;
|
||||
struct osd_attr *in_attr;
|
||||
unsigned out_attr_len;
|
||||
struct osd_attr *out_attr;
|
||||
|
||||
bool reading;
|
||||
|
||||
/* House keeping of Parity pages */
|
||||
bool extra_part_alloc;
|
||||
struct page **parity_pages;
|
||||
unsigned max_par_pages;
|
||||
unsigned cur_par_page;
|
||||
unsigned sgs_per_dev;
|
||||
struct __stripe_pages_2d *sp2d;
|
||||
struct ore_io_state *ios_read_4_write;
|
||||
const struct _ore_r4w_op *r4w;
|
||||
|
||||
/* Variable array of size numdevs */
|
||||
unsigned numdevs;
|
||||
struct ore_per_dev_state {
|
||||
struct osd_request *or;
|
||||
struct bio *bio;
|
||||
loff_t offset;
|
||||
unsigned length;
|
||||
unsigned last_sgs_total;
|
||||
unsigned dev;
|
||||
struct osd_sg_entry *sglist;
|
||||
unsigned cur_sg;
|
||||
} per_dev[];
|
||||
};
|
||||
|
||||
static inline unsigned ore_io_state_size(unsigned numdevs)
|
||||
{
|
||||
return sizeof(struct ore_io_state) +
|
||||
sizeof(struct ore_per_dev_state) * numdevs;
|
||||
}
|
||||
|
||||
/* ore.c */
|
||||
int ore_verify_layout(unsigned total_comps, struct ore_layout *layout);
|
||||
void ore_calc_stripe_info(struct ore_layout *layout, u64 file_offset,
|
||||
u64 length, struct ore_striping_info *si);
|
||||
int ore_get_rw_state(struct ore_layout *layout, struct ore_components *comps,
|
||||
bool is_reading, u64 offset, u64 length,
|
||||
struct ore_io_state **ios);
|
||||
int ore_get_io_state(struct ore_layout *layout, struct ore_components *comps,
|
||||
struct ore_io_state **ios);
|
||||
void ore_put_io_state(struct ore_io_state *ios);
|
||||
|
||||
typedef void (*ore_on_dev_error)(struct ore_io_state *ios, struct ore_dev *od,
|
||||
unsigned dev_index, enum osd_err_priority oep,
|
||||
u64 dev_offset, u64 dev_len);
|
||||
int ore_check_io(struct ore_io_state *ios, ore_on_dev_error rep);
|
||||
|
||||
int ore_create(struct ore_io_state *ios);
|
||||
int ore_remove(struct ore_io_state *ios);
|
||||
int ore_write(struct ore_io_state *ios);
|
||||
int ore_read(struct ore_io_state *ios);
|
||||
int ore_truncate(struct ore_layout *layout, struct ore_components *comps,
|
||||
u64 size);
|
||||
|
||||
int extract_attr_from_ios(struct ore_io_state *ios, struct osd_attr *attr);
|
||||
|
||||
extern const struct osd_attr g_attr_logical_length;
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user