1de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh/*
2de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * osd_initiator.h - OSD initiator API definition
3de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *
4de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * Copyright (C) 2008 Panasas Inc.  All rights reserved.
5de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *
6de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * Authors:
7aa281ac631008b9c18c405c8880007789f659c7dBoaz Harrosh *   Boaz Harrosh <ooo@electrozaur.com>
8de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *   Benny Halevy <bhalevy@panasas.com>
9de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *
10de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * This program is free software; you can redistribute it and/or modify
11de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * it under the terms of the GNU General Public License version 2
12de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *
13de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh */
14de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh#ifndef __OSD_INITIATOR_H__
15de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh#define __OSD_INITIATOR_H__
16de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
17a1ce39288e6fbefdd8d607021d02384eb4a20b99David Howells#include <scsi/osd_protocol.h>
18a1ce39288e6fbefdd8d607021d02384eb4a20b99David Howells#include <scsi/osd_types.h>
19de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
20de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh#include <linux/blkdev.h>
21fc2fac5b5f11e2bee3bf37215c8746236f5ea188Boaz Harrosh#include <scsi/scsi_device.h>
22de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
23de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh/* Note: "NI" in comments below means "Not Implemented yet" */
24de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
25c6572c983726fe3f3bb5f07e9afe3a9b8e402d1bBoaz Harrosh/* Configure of code:
26c6572c983726fe3f3bb5f07e9afe3a9b8e402d1bBoaz Harrosh * #undef if you *don't* want OSD v1 support in runtime.
27c6572c983726fe3f3bb5f07e9afe3a9b8e402d1bBoaz Harrosh * If #defined the initiator will dynamically configure to encode OSD v1
28c6572c983726fe3f3bb5f07e9afe3a9b8e402d1bBoaz Harrosh * CDB's if the target is detected to be OSD v1 only.
29c6572c983726fe3f3bb5f07e9afe3a9b8e402d1bBoaz Harrosh * OSD v2 only commands, options, and attributes will be ignored if target
30c6572c983726fe3f3bb5f07e9afe3a9b8e402d1bBoaz Harrosh * is v1 only.
31c6572c983726fe3f3bb5f07e9afe3a9b8e402d1bBoaz Harrosh * If #defined will result in bigger/slower code (OK Slower maybe not)
32c6572c983726fe3f3bb5f07e9afe3a9b8e402d1bBoaz Harrosh * Q: Should this be CONFIG_SCSI_OSD_VER1_SUPPORT and set from Kconfig?
33c6572c983726fe3f3bb5f07e9afe3a9b8e402d1bBoaz Harrosh */
34c6572c983726fe3f3bb5f07e9afe3a9b8e402d1bBoaz Harrosh#define OSD_VER1_SUPPORT y
35c6572c983726fe3f3bb5f07e9afe3a9b8e402d1bBoaz Harrosh
36c6572c983726fe3f3bb5f07e9afe3a9b8e402d1bBoaz Harroshenum osd_std_version {
37c6572c983726fe3f3bb5f07e9afe3a9b8e402d1bBoaz Harrosh	OSD_VER_NONE = 0,
38c6572c983726fe3f3bb5f07e9afe3a9b8e402d1bBoaz Harrosh	OSD_VER1 = 1,
39c6572c983726fe3f3bb5f07e9afe3a9b8e402d1bBoaz Harrosh	OSD_VER2 = 2,
40c6572c983726fe3f3bb5f07e9afe3a9b8e402d1bBoaz Harrosh};
41c6572c983726fe3f3bb5f07e9afe3a9b8e402d1bBoaz Harrosh
42de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh/*
43de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * Object-based Storage Device.
44de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * This object represents an OSD device.
45de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * It is not a full linux device in any way. It is only
46de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * a place to hang resources associated with a Linux
47de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * request Q and some default properties.
48de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh */
49de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshstruct osd_dev {
50de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	struct scsi_device *scsi_device;
51de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	unsigned def_timeout;
52c6572c983726fe3f3bb5f07e9afe3a9b8e402d1bBoaz Harrosh
53c6572c983726fe3f3bb5f07e9afe3a9b8e402d1bBoaz Harrosh#ifdef OSD_VER1_SUPPORT
54c6572c983726fe3f3bb5f07e9afe3a9b8e402d1bBoaz Harrosh	enum osd_std_version version;
55c6572c983726fe3f3bb5f07e9afe3a9b8e402d1bBoaz Harrosh#endif
56de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh};
57de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
582cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harrosh/* Unique Identification of an OSD device */
592cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harroshstruct osd_dev_info {
602cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harrosh	unsigned systemid_len;
612cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harrosh	u8 systemid[OSD_SYSTEMID_LEN];
622cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harrosh	unsigned osdname_len;
632cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harrosh	u8 *osdname;
642cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harrosh};
652cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harrosh
662cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harrosh/* Retrieve/return osd_dev(s) for use by Kernel clients
672cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harrosh * Use IS_ERR/ERR_PTR on returned "osd_dev *".
682cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harrosh */
692cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harroshstruct osd_dev *osduld_path_lookup(const char *dev_name);
702cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harroshstruct osd_dev *osduld_info_lookup(const struct osd_dev_info *odi);
71b799bc7da0ce5ba4a988c521a8fb10452eb419f0Boaz Harroshvoid osduld_put_device(struct osd_dev *od);
72b799bc7da0ce5ba4a988c521a8fb10452eb419f0Boaz Harrosh
732cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harroshconst struct osd_dev_info *osduld_device_info(struct osd_dev *od);
742cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harroshbool osduld_device_same(struct osd_dev *od, const struct osd_dev_info *odi);
752cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harrosh
7695b05a7db5865855c32e0bb8b244c3a7aac1cfebBoaz Harrosh/* Add/remove test ioctls from external modules */
7795b05a7db5865855c32e0bb8b244c3a7aac1cfebBoaz Harroshtypedef int (do_test_fn)(struct osd_dev *od, unsigned cmd, unsigned long arg);
7895b05a7db5865855c32e0bb8b244c3a7aac1cfebBoaz Harroshint osduld_register_test(unsigned ioctl, do_test_fn *do_test);
7995b05a7db5865855c32e0bb8b244c3a7aac1cfebBoaz Harroshvoid osduld_unregister_test(unsigned ioctl);
8095b05a7db5865855c32e0bb8b244c3a7aac1cfebBoaz Harrosh
8195b05a7db5865855c32e0bb8b244c3a7aac1cfebBoaz Harrosh/* These are called by uld at probe time */
82de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshvoid osd_dev_init(struct osd_dev *od, struct scsi_device *scsi_device);
83de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshvoid osd_dev_fini(struct osd_dev *od);
84de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
852cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harrosh/**
862cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harrosh * osd_auto_detect_ver - Detect the OSD version, return Unique Identification
872cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harrosh *
882cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harrosh * @od:     OSD target lun handle
892cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harrosh * @caps:   Capabilities authorizing OSD root read attributes access
902cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harrosh * @odi:    Retrieved information uniquely identifying the osd target lun
912cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harrosh *          Note: odi->osdname must be kfreed by caller.
922cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harrosh *
932cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harrosh * Auto detects the OSD version of the OSD target and sets the @od
942cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harrosh * accordingly. Meanwhile also returns the "system id" and "osd name" root
952cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harrosh * attributes which uniquely identify the OSD target. This member is usually
962cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harrosh * called by the ULD. ULD users should call osduld_device_info().
972cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harrosh * This rutine allocates osd requests and memory at GFP_KERNEL level and might
982cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harrosh * sleep.
992cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harrosh */
1002cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harroshint osd_auto_detect_ver(struct osd_dev *od,
1012cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harrosh	void *caps, struct osd_dev_info *odi);
1022cdd6410e5a1665823f2a048fc7f8f6a8384be1dBoaz Harrosh
103fc2fac5b5f11e2bee3bf37215c8746236f5ea188Boaz Harroshstatic inline struct request_queue *osd_request_queue(struct osd_dev *od)
104fc2fac5b5f11e2bee3bf37215c8746236f5ea188Boaz Harrosh{
105fc2fac5b5f11e2bee3bf37215c8746236f5ea188Boaz Harrosh	return od->scsi_device->request_queue;
106fc2fac5b5f11e2bee3bf37215c8746236f5ea188Boaz Harrosh}
1071b9dce94c8a24a3f1a01fcdf688f2d903b32acdfBoaz Harrosh
108c6572c983726fe3f3bb5f07e9afe3a9b8e402d1bBoaz Harrosh/* we might want to use function vector in the future */
109c6572c983726fe3f3bb5f07e9afe3a9b8e402d1bBoaz Harroshstatic inline void osd_dev_set_ver(struct osd_dev *od, enum osd_std_version v)
110c6572c983726fe3f3bb5f07e9afe3a9b8e402d1bBoaz Harrosh{
111c6572c983726fe3f3bb5f07e9afe3a9b8e402d1bBoaz Harrosh#ifdef OSD_VER1_SUPPORT
112c6572c983726fe3f3bb5f07e9afe3a9b8e402d1bBoaz Harrosh	od->version = v;
113c6572c983726fe3f3bb5f07e9afe3a9b8e402d1bBoaz Harrosh#endif
114c6572c983726fe3f3bb5f07e9afe3a9b8e402d1bBoaz Harrosh}
115c6572c983726fe3f3bb5f07e9afe3a9b8e402d1bBoaz Harrosh
116d531b37929f412de09e9ad711fdd5b04fa39aca1Boaz Harroshstatic inline bool osd_dev_is_ver1(struct osd_dev *od)
117d531b37929f412de09e9ad711fdd5b04fa39aca1Boaz Harrosh{
118d531b37929f412de09e9ad711fdd5b04fa39aca1Boaz Harrosh#ifdef OSD_VER1_SUPPORT
119d531b37929f412de09e9ad711fdd5b04fa39aca1Boaz Harrosh	return od->version == OSD_VER1;
120d531b37929f412de09e9ad711fdd5b04fa39aca1Boaz Harrosh#else
121d531b37929f412de09e9ad711fdd5b04fa39aca1Boaz Harrosh	return false;
122d531b37929f412de09e9ad711fdd5b04fa39aca1Boaz Harrosh#endif
123d531b37929f412de09e9ad711fdd5b04fa39aca1Boaz Harrosh}
124d531b37929f412de09e9ad711fdd5b04fa39aca1Boaz Harrosh
125de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshstruct osd_request;
126de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshtypedef void (osd_req_done_fn)(struct osd_request *or, void *private);
127de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
128de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshstruct osd_request {
129de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	struct osd_cdb cdb;
130de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	struct osd_data_out_integrity_info out_data_integ;
131de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	struct osd_data_in_integrity_info in_data_integ;
132de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
133de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	struct osd_dev *osd_dev;
134de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	struct request *request;
135de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
136de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	struct _osd_req_data_segment {
137de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh		void *buff;
138de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh		unsigned alloc_size; /* 0 here means: don't call kfree */
139de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh		unsigned total_bytes;
140e96e72c45a1e78e9266dd70113b851395a440ef3Boaz Harrosh	} cdb_cont, set_attr, enc_get_attr, get_attr;
141de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
142de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	struct _osd_io_info {
143de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh		struct bio *bio;
144de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh		u64 total_bytes;
1455d0961fd1f25e117f907f3af3aaa870637049252Boaz Harrosh		u64 residual;
146de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh		struct request *req;
147de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh		struct _osd_req_data_segment *last_seg;
148de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh		u8 *pad_buff;
149de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	} out, in;
150de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
151de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	gfp_t alloc_flags;
152de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	unsigned timeout;
153de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	unsigned retries;
1545d0961fd1f25e117f907f3af3aaa870637049252Boaz Harrosh	unsigned sense_len;
155de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	u8 sense[OSD_MAX_SENSE_LEN];
156de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	enum osd_attributes_mode attributes_mode;
157de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
158de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	osd_req_done_fn *async_done;
159de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	void *async_private;
160de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	int async_error;
1615d0961fd1f25e117f907f3af3aaa870637049252Boaz Harrosh	int req_errors;
162de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh};
163de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
164c6572c983726fe3f3bb5f07e9afe3a9b8e402d1bBoaz Harroshstatic inline bool osd_req_is_ver1(struct osd_request *or)
165c6572c983726fe3f3bb5f07e9afe3a9b8e402d1bBoaz Harrosh{
166d531b37929f412de09e9ad711fdd5b04fa39aca1Boaz Harrosh	return osd_dev_is_ver1(or->osd_dev);
167c6572c983726fe3f3bb5f07e9afe3a9b8e402d1bBoaz Harrosh}
168c6572c983726fe3f3bb5f07e9afe3a9b8e402d1bBoaz Harrosh
169de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh/*
170de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * How to use the osd library:
171de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *
172de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * osd_start_request
173de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *	Allocates a request.
174de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *
175de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * osd_req_*
176de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *	Call one of, to encode the desired operation.
177de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *
178de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * osd_add_{get,set}_attr
179de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *	Optionally add attributes to the CDB, list or page mode.
180de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *
181de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * osd_finalize_request
182de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *	Computes final data out/in offsets and signs the request,
183de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *	making it ready for execution.
184de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *
185de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * osd_execute_request
186de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *	May be called to execute it through the block layer. Other wise submit
187de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *	the associated block request in some other way.
188de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *
189de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * After execution:
190de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * osd_req_decode_sense
191de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *	Decodes sense information to verify execution results.
192de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *
193de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * osd_req_decode_get_attr
194de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *	Retrieve osd_add_get_attr_list() values if used.
195de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *
196de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * osd_end_request
197de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *	Must be called to deallocate the request.
198de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh */
199de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
200de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh/**
201de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * osd_start_request - Allocate and initialize an osd_request
202de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *
203de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * @osd_dev:    OSD device that holds the scsi-device and default values
204de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *              that the request is associated with.
205de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * @gfp:        The allocation flags to use for request allocation, and all
206de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *              subsequent allocations. This will be stored at
207de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *              osd_request->alloc_flags, can be changed by user later
208de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *
209de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * Allocate osd_request and initialize all members to the
210de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * default/initial state.
211de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh */
212de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshstruct osd_request *osd_start_request(struct osd_dev *od, gfp_t gfp);
213de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
214de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshenum osd_req_options {
215de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	OSD_REQ_FUA = 0x08,	/* Force Unit Access */
216de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	OSD_REQ_DPO = 0x10,	/* Disable Page Out */
217de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
218de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	OSD_REQ_BYPASS_TIMESTAMPS = 0x80,
219de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh};
220de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
221de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh/**
222de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * osd_finalize_request - Sign request and prepare request for execution
223de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *
224de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * @or:		osd_request to prepare
225de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * @options:	combination of osd_req_options bit flags or 0.
226de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * @cap:	A Pointer to an OSD_CAP_LEN bytes buffer that is received from
227de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *              The security manager as capabilities for this cdb.
228de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * @cap_key:	The cryptographic key used to sign the cdb/data. Can be null
229de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *              if NOSEC is used.
230de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *
231de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * The actual request and bios are only allocated here, so are the get_attr
232de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * buffers that will receive the returned attributes. Copy's @cap to cdb.
233de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * Sign the cdb/data with @cap_key.
234de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh */
235de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshint osd_finalize_request(struct osd_request *or,
236de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	u8 options, const void *cap, const u8 *cap_key);
237de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
238de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh/**
239de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * osd_execute_request - Execute the request synchronously through block-layer
240de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *
241de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * @or:		osd_request to Executed
242de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *
243de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * Calls blk_execute_rq to q the command and waits for completion.
244de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh */
245de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshint osd_execute_request(struct osd_request *or);
246de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
247de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh/**
248de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * osd_execute_request_async - Execute the request without waitting.
249de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *
250de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * @or:                      - osd_request to Executed
251de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * @done: (Optional)         - Called at end of execution
252de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * @private:                 - Will be passed to @done function
253de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *
254de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * Calls blk_execute_rq_nowait to queue the command. When execution is done
255de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * optionally calls @done with @private as parameter. @or->async_error will
256de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * have the return code
257de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh */
258de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshint osd_execute_request_async(struct osd_request *or,
259de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	osd_req_done_fn *done, void *private);
260de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
261de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh/**
26298f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh * osd_req_decode_sense_full - Decode sense information after execution.
26398f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh *
26498f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh * @or:           - osd_request to examine
265dbc6221be7a2bf556fefe75ac939143d4e82ecafJoe Perches * @osi           - Receives a more detailed error report information (optional).
26698f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh * @silent        - Do not print to dmsg (Even if enabled)
26798f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh * @bad_obj_list  - Some commands act on multiple objects. Failed objects will
26825985edcedea6396277003854657b5f3cb31a628Lucas De Marchi *                  be received here (optional)
26998f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh * @max_obj       - Size of @bad_obj_list.
27098f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh * @bad_attr_list - List of failing attributes (optional)
27198f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh * @max_attr      - Size of @bad_attr_list.
27298f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh *
273aa9fffbe2c4db4557248c5c626a85bf3c7867044Boaz Harrosh * After execution, osd_request results are analyzed using this function. The
27498f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh * return code is the final disposition on the error. So it is possible that a
27598f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh * CHECK_CONDITION was returned from target but this will return NO_ERROR, for
27698f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh * example on recovered errors. All parameters are optional if caller does
27798f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh * not need any returned information.
27898f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh * Note: This function will also dump the error to dmsg according to settings
27998f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh * of the SCSI_OSD_DPRINT_SENSE Kconfig value. Set @silent if you know the
28098f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh * command would routinely fail, to not spam the dmsg file.
28198f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh */
282aa9fffbe2c4db4557248c5c626a85bf3c7867044Boaz Harrosh
283aa9fffbe2c4db4557248c5c626a85bf3c7867044Boaz Harrosh/**
284aa9fffbe2c4db4557248c5c626a85bf3c7867044Boaz Harrosh * osd_err_priority - osd categorized return codes in ascending severity.
285aa9fffbe2c4db4557248c5c626a85bf3c7867044Boaz Harrosh *
286aa9fffbe2c4db4557248c5c626a85bf3c7867044Boaz Harrosh * The categories are borrowed from the pnfs_osd_errno enum.
287aa9fffbe2c4db4557248c5c626a85bf3c7867044Boaz Harrosh * See comments for translated Linux codes returned by osd_req_decode_sense.
288aa9fffbe2c4db4557248c5c626a85bf3c7867044Boaz Harrosh */
289aa9fffbe2c4db4557248c5c626a85bf3c7867044Boaz Harroshenum osd_err_priority {
290aa9fffbe2c4db4557248c5c626a85bf3c7867044Boaz Harrosh	OSD_ERR_PRI_NO_ERROR	= 0,
291aa9fffbe2c4db4557248c5c626a85bf3c7867044Boaz Harrosh	/* Recoverable, caller should clear_highpage() all pages */
292aa9fffbe2c4db4557248c5c626a85bf3c7867044Boaz Harrosh	OSD_ERR_PRI_CLEAR_PAGES = 1, /* -EFAULT */
293aa9fffbe2c4db4557248c5c626a85bf3c7867044Boaz Harrosh	OSD_ERR_PRI_RESOURCE	= 2, /* -ENOMEM */
294aa9fffbe2c4db4557248c5c626a85bf3c7867044Boaz Harrosh	OSD_ERR_PRI_BAD_CRED	= 3, /* -EINVAL */
295aa9fffbe2c4db4557248c5c626a85bf3c7867044Boaz Harrosh	OSD_ERR_PRI_NO_ACCESS	= 4, /* -EACCES */
296aa9fffbe2c4db4557248c5c626a85bf3c7867044Boaz Harrosh	OSD_ERR_PRI_UNREACHABLE	= 5, /* any other */
297aa9fffbe2c4db4557248c5c626a85bf3c7867044Boaz Harrosh	OSD_ERR_PRI_NOT_FOUND	= 6, /* -ENOENT */
298aa9fffbe2c4db4557248c5c626a85bf3c7867044Boaz Harrosh	OSD_ERR_PRI_NO_SPACE	= 7, /* -ENOSPC */
299aa9fffbe2c4db4557248c5c626a85bf3c7867044Boaz Harrosh	OSD_ERR_PRI_EIO		= 8, /* -EIO    */
300aa9fffbe2c4db4557248c5c626a85bf3c7867044Boaz Harrosh};
301aa9fffbe2c4db4557248c5c626a85bf3c7867044Boaz Harrosh
30298f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harroshstruct osd_sense_info {
303aa9fffbe2c4db4557248c5c626a85bf3c7867044Boaz Harrosh	enum osd_err_priority osd_err_pri;
304aa9fffbe2c4db4557248c5c626a85bf3c7867044Boaz Harrosh
30598f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh	int key;		/* one of enum scsi_sense_keys */
30698f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh	int additional_code ;	/* enum osd_additional_sense_codes */
30798f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh	union { /* Sense specific information */
30898f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh		u16 sense_info;
30998f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh		u16 cdb_field_offset; 	/* scsi_invalid_field_in_cdb */
31098f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh	};
31198f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh	union { /* Command specific information */
31298f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh		u64 command_info;
31398f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh	};
31498f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh
31598f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh	u32 not_initiated_command_functions; /* osd_command_functions_bits */
31698f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh	u32 completed_command_functions; /* osd_command_functions_bits */
31798f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh	struct osd_obj_id obj;
31898f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh	struct osd_attr attr;
31998f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh};
32098f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh
32198f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harroshint osd_req_decode_sense_full(struct osd_request *or,
32298f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh	struct osd_sense_info *osi, bool silent,
32398f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh	struct osd_obj_id *bad_obj_list, int max_obj,
32498f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh	struct osd_attr *bad_attr_list, int max_attr);
32598f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh
32698f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harroshstatic inline int osd_req_decode_sense(struct osd_request *or,
32798f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh	struct osd_sense_info *osi)
32898f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh{
32998f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh	return osd_req_decode_sense_full(or, osi, false, NULL, 0, NULL, 0);
33098f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh}
33198f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh
33298f3aea2bd4b4f9cd7a6a6479ed9410787f756fdBoaz Harrosh/**
333de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * osd_end_request - return osd_request to free store
334de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *
335de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * @or:		osd_request to free
336de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *
337de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * Deallocate all osd_request resources (struct req's, BIOs, buffers, etc.)
338de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh */
339de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshvoid osd_end_request(struct osd_request *or);
340de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
341de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh/*
342de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * CDB Encoding
343de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *
344de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * Note: call only one of the following methods.
345de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh */
346de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
347de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh/*
348de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * Device commands
349de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh */
350de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshvoid osd_req_set_master_seed_xchg(struct osd_request *or, ...);/* NI */
351de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshvoid osd_req_set_master_key(struct osd_request *or, ...);/* NI */
352de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
353de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshvoid osd_req_format(struct osd_request *or, u64 tot_capacity);
354de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
355de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh/* list all partitions
356de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * @list header must be initialized to zero on first run.
357de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *
358de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * Call osd_is_obj_list_done() to find if we got the complete list.
359de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh */
360de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshint osd_req_list_dev_partitions(struct osd_request *or,
361de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	osd_id initial_id, struct osd_obj_id_list *list, unsigned nelem);
362de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
363de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshvoid osd_req_flush_obsd(struct osd_request *or,
364de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	enum osd_options_flush_scope_values);
365de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
366de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshvoid osd_req_perform_scsi_command(struct osd_request *or,
367de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	const u8 *cdb, ...);/* NI */
368de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshvoid osd_req_task_management(struct osd_request *or, ...);/* NI */
369de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
370de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh/*
371de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * Partition commands
372de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh */
373de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshvoid osd_req_create_partition(struct osd_request *or, osd_id partition);
374de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshvoid osd_req_remove_partition(struct osd_request *or, osd_id partition);
375de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
376de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshvoid osd_req_set_partition_key(struct osd_request *or,
377de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	osd_id partition, u8 new_key_id[OSD_CRYPTO_KEYID_SIZE],
378de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	u8 seed[OSD_CRYPTO_SEED_SIZE]);/* NI */
379de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
380de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh/* list all collections in the partition
381de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * @list header must be init to zero on first run.
382de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *
383de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * Call osd_is_obj_list_done() to find if we got the complete list.
384de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh */
385de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshint osd_req_list_partition_collections(struct osd_request *or,
386de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	osd_id partition, osd_id initial_id, struct osd_obj_id_list *list,
387de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	unsigned nelem);
388de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
389de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh/* list all objects in the partition
390de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * @list header must be init to zero on first run.
391de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *
392de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * Call osd_is_obj_list_done() to find if we got the complete list.
393de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh */
394de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshint osd_req_list_partition_objects(struct osd_request *or,
395de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	osd_id partition, osd_id initial_id, struct osd_obj_id_list *list,
396de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	unsigned nelem);
397de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
398de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshvoid osd_req_flush_partition(struct osd_request *or,
399de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	osd_id partition, enum osd_options_flush_scope_values);
400de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
401de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh/*
402de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * Collection commands
403de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh */
404de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshvoid osd_req_create_collection(struct osd_request *or,
405de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	const struct osd_obj_id *);/* NI */
406de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshvoid osd_req_remove_collection(struct osd_request *or,
407de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	const struct osd_obj_id *);/* NI */
408de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
409de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh/* list all objects in the collection */
410de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshint osd_req_list_collection_objects(struct osd_request *or,
411de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	const struct osd_obj_id *, osd_id initial_id,
412de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	struct osd_obj_id_list *list, unsigned nelem);
413de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
414de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh/* V2 only filtered list of objects in the collection */
415de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshvoid osd_req_query(struct osd_request *or, ...);/* NI */
416de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
417de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshvoid osd_req_flush_collection(struct osd_request *or,
418de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	const struct osd_obj_id *, enum osd_options_flush_scope_values);
419de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
420de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshvoid osd_req_get_member_attrs(struct osd_request *or, ...);/* V2-only NI */
421de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshvoid osd_req_set_member_attrs(struct osd_request *or, ...);/* V2-only NI */
422de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
423de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh/*
424de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * Object commands
425de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh */
426de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshvoid osd_req_create_object(struct osd_request *or, struct osd_obj_id *);
427de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshvoid osd_req_remove_object(struct osd_request *or, struct osd_obj_id *);
428de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
429de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshvoid osd_req_write(struct osd_request *or,
43062f469b596dd0aadf046a69027087c18db43734eBoaz Harrosh	const struct osd_obj_id *obj, u64 offset, struct bio *bio, u64 len);
4310e35afbc8b054e04a35faa796c72abb3b82bd33bBoaz Harroshint osd_req_write_kern(struct osd_request *or,
4320e35afbc8b054e04a35faa796c72abb3b82bd33bBoaz Harrosh	const struct osd_obj_id *obj, u64 offset, void *buff, u64 len);
433de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshvoid osd_req_append(struct osd_request *or,
434de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	const struct osd_obj_id *, struct bio *data_out);/* NI */
435de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshvoid osd_req_create_write(struct osd_request *or,
436de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	const struct osd_obj_id *, struct bio *data_out, u64 offset);/* NI */
437de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshvoid osd_req_clear(struct osd_request *or,
438de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	const struct osd_obj_id *, u64 offset, u64 len);/* NI */
439de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshvoid osd_req_punch(struct osd_request *or,
440de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	const struct osd_obj_id *, u64 offset, u64 len);/* V2-only NI */
441de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
442de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshvoid osd_req_flush_object(struct osd_request *or,
443de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	const struct osd_obj_id *, enum osd_options_flush_scope_values,
444de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	/*V2*/ u64 offset, /*V2*/ u64 len);
445de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
446de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshvoid osd_req_read(struct osd_request *or,
44762f469b596dd0aadf046a69027087c18db43734eBoaz Harrosh	const struct osd_obj_id *obj, u64 offset, struct bio *bio, u64 len);
4480e35afbc8b054e04a35faa796c72abb3b82bd33bBoaz Harroshint osd_req_read_kern(struct osd_request *or,
4490e35afbc8b054e04a35faa796c72abb3b82bd33bBoaz Harrosh	const struct osd_obj_id *obj, u64 offset, void *buff, u64 len);
450de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
451e96e72c45a1e78e9266dd70113b851395a440ef3Boaz Harrosh/* Scatter/Gather write/read commands */
452e96e72c45a1e78e9266dd70113b851395a440ef3Boaz Harroshint osd_req_write_sg(struct osd_request *or,
453e96e72c45a1e78e9266dd70113b851395a440ef3Boaz Harrosh	const struct osd_obj_id *obj, struct bio *bio,
454e96e72c45a1e78e9266dd70113b851395a440ef3Boaz Harrosh	const struct osd_sg_entry *sglist, unsigned numentries);
455e96e72c45a1e78e9266dd70113b851395a440ef3Boaz Harroshint osd_req_read_sg(struct osd_request *or,
456e96e72c45a1e78e9266dd70113b851395a440ef3Boaz Harrosh	const struct osd_obj_id *obj, struct bio *bio,
457e96e72c45a1e78e9266dd70113b851395a440ef3Boaz Harrosh	const struct osd_sg_entry *sglist, unsigned numentries);
4586dd1d8a7953cdc203c6eb694ce8eafe2dcd3e9daBoaz Harroshint osd_req_write_sg_kern(struct osd_request *or,
4596dd1d8a7953cdc203c6eb694ce8eafe2dcd3e9daBoaz Harrosh	const struct osd_obj_id *obj, void **buff,
4606dd1d8a7953cdc203c6eb694ce8eafe2dcd3e9daBoaz Harrosh	const struct osd_sg_entry *sglist, unsigned numentries);
4616dd1d8a7953cdc203c6eb694ce8eafe2dcd3e9daBoaz Harroshint osd_req_read_sg_kern(struct osd_request *or,
4626dd1d8a7953cdc203c6eb694ce8eafe2dcd3e9daBoaz Harrosh	const struct osd_obj_id *obj, void **buff,
4636dd1d8a7953cdc203c6eb694ce8eafe2dcd3e9daBoaz Harrosh	const struct osd_sg_entry *sglist, unsigned numentries);
4646dd1d8a7953cdc203c6eb694ce8eafe2dcd3e9daBoaz Harrosh
465de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh/*
466de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * Root/Partition/Collection/Object Attributes commands
467de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh */
468de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
469de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh/* get before set */
470de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshvoid osd_req_get_attributes(struct osd_request *or, const struct osd_obj_id *);
471de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
472de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh/* set before get */
473de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshvoid osd_req_set_attributes(struct osd_request *or, const struct osd_obj_id *);
474de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
475de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh/*
476de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * Attributes appended to most commands
477de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh */
478de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
479de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh/* Attributes List mode (or V2 CDB) */
480de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh  /*
481de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh   * TODO: In ver2 if at finalize time only one attr was set and no gets,
482de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh   * then the Attributes CDB mode is used automatically to save IO.
483de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh   */
484de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
485de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh/* set a list of attributes. */
486de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshint osd_req_add_set_attr_list(struct osd_request *or,
487de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	const struct osd_attr *, unsigned nelem);
488de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
489de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh/* get a list of attributes */
490de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshint osd_req_add_get_attr_list(struct osd_request *or,
491de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	const struct osd_attr *, unsigned nelem);
492de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
493de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh/*
494de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * Attributes list decoding
495de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * Must be called after osd_request.request was executed
496de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * It is called in a loop to decode the returned get_attr
497de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * (see osd_add_get_attr)
498de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh */
499de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshint osd_req_decode_get_attr_list(struct osd_request *or,
500de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	struct osd_attr *, int *nelem, void **iterator);
501de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
502de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh/* Attributes Page mode */
503de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
504de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh/*
505de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * Read an attribute page and optionally set one attribute
506de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh *
507de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * Retrieves the attribute page directly to a user buffer.
508de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * @attr_page_data shall stay valid until end of execution.
509de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh * See osd_attributes.h for common page structures
510de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh */
511de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harroshint osd_req_add_get_attr_page(struct osd_request *or,
512de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	u32 page_id, void *attr_page_data, unsigned max_page_len,
513de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh	const struct osd_attr *set_one);
514de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh
515de258bf5e63863f42e0f9a7c5ffd29916a41e399Boaz Harrosh#endif /* __OSD_LIB_H__ */
516