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