osd changes for 2.6.31
cover osd changes for 2.6.31
Hi James
I'm sending some patches that have accumulated for the next merge window. If they could sit in scsi-misc (and linux-next).
On top of these I will later send a couple of patches for getting rid of the use of blk_rq_append_bio, as well as support for chained-bios for Jeff's pending osdblk driver. These should go in first, as the "other work" is rebased ontop of these here.
These are the list of patches:
[PATCH 01/6] libosd: OSD2r05: Additional command enums [PATCH 02/6] libosd: OSD2r05: Attribute definitions
[PATCH 03/6] libosd: Better printout of OSD target system information
These are just small stuff that have been added after the last merge window
[PATCH 04/6] libosd: osd_req_{read,write}_kern new API
This is refactoring of common code used by a few library users
[PATCH 05/6] libosd: Let _osd_req_finalize_data_integrity receive number of out_bytes [PATCH 06/6] libosd: osd_req_{read,write} takes a length parameter
These patches are in preparation for supporting bio-chains. BIO-chains support is needed both by Jeff's osdblk stacking block device, as well as future work in exofs and pNFS-Objects layout-driver.
The support is not yet finished until acceptance of a couple of patches to the block layer and corresponding patches to osd which I will send next.
Thank you in advance
Boaz
PATCH 1/6 libosd: OSD2r05: Additional command enums
Add all constant definitions of new OSD commands added in revision 4 & 5. Mainly for creating snapshots and clones.
--- include/scsi/osd_protocol.h | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-)
include/scsi/osd_protocol.h +8 -0
@@ -303,7 +303,15 @@ enum osd_service_actions { OSD_ACT_V2(REMOVE_MEMBER_OBJECTS, 0x21) OSD_ACT_V2(GET_MEMBER_ATTRIBUTES, 0x22) OSD_ACT_V2(SET_MEMBER_ATTRIBUTES, 0x23) + + OSD_ACT_V2(CREATE_CLONE, 0x28) + OSD_ACT_V2(CREATE_SNAPSHOT, 0x29) + OSD_ACT_V2(DETACH_CLONE, 0x2A) + OSD_ACT_V2(REFRESH_SNAPSHOT_CLONE, 0x2B) + OSD_ACT_V2(RESTORE_PARTITION_FROM_SNAPSHOT, 0x2C) + OSD_ACT_V2(READ_MAP, 0x31) + OSD_ACT_V2(READ_MAPS_COMPARE, 0x32) OSD_ACT_V1_V2(PERFORM_SCSI_COMMAND, 0x8F7E, 0x8F7C)OSD_ACT_V1_V2 (SCSI_TASK_MANAGEMENT ,0x8F7F ,0x8F7D )
Signature · 1 line
1.6.2.1
PATCH 2/6 libosd: OSD2r05: Attribute definitions
In reply to Boaz HarroshSome New revision 5 Attribute definitions.
Some missing definitions of Attributes and pages
--- include/scsi/osd_attributes.h | 74 +++++++++++++++++++++++++++++++++++++++- 1 files changed, 72 insertions(+), 2 deletions(-)
include/scsi/osd_attributes.h +72 -2
@@ -29,6 +29,7 @@ enum {OSD_APAGE_PARTITION_INFORMATION =OSD_APAGE_PARTITION_FIRST +1 ,OSD_APAGE_PARTITION_QUOTAS =OSD_APAGE_PARTITION_FIRST +2 ,OSD_APAGE_PARTITION_TIMESTAMP =OSD_APAGE_PARTITION_FIRST +3 , +OSD_APAGE_PARTITION_ATTR_ACCESS =OSD_APAGE_PARTITION_FIRST +4 ,OSD_APAGE_PARTITION_SECURITY =OSD_APAGE_PARTITION_FIRST +5 , OSD_APAGE_PARTITION_LAST = 0x5FFFFFFF,
@@ -51,7 +52,9 @@ enum {OSD_APAGE_RESERVED_TYPE_LAST =0xEFFFFFFF ,OSD_APAGE_COMMON_FIRST =0xF0000000 , -OSD_APAGE_COMMON_LAST =0xFFFFFFFE , +OSD_APAGE_COMMON_LAST =0xFFFFFFFD , + +OSD_APAGE_CURRENT_COMMAND =0xFFFFFFFE , OSD_APAGE_REQUEST_ALL = 0xFFFFFFFF, };
@@ -106,10 +109,30 @@ enum {OSD_ATTR_RI_PRODUCT_REVISION_LEVEL =0x7 ,/* 4 */ OSD_ATTR_RI_PRODUCT_SERIAL_NUMBER =0x8 ,/* variable */ OSD_ATTR_RI_OSD_NAME =0x9 ,/* variable */ +OSD_ATTR_RI_MAX_CDB_CONTINUATION_LEN =0xA ,/* 4 */ OSD_ATTR_RI_TOTAL_CAPACITY =0x80 ,/* 8 */ OSD_ATTR_RI_USED_CAPACITY =0x81 ,/* 8 */ OSD_ATTR_RI_NUMBER_OF_PARTITIONS =0xC0 ,/* 8 */ OSD_ATTR_RI_CLOCK =0x100 ,/* 6 */ +OARI_DEFAULT_ISOLATION_METHOD =0X110 ,/* 1 */ +OARI_SUPPORTED_ISOLATION_METHODS =0X111 ,/* 32 */ + +OARI_DATA_ATOMICITY_GUARANTEE =0X120 ,/* 8 */ +OARI_DATA_ATOMICITY_ALIGNMENT =0X121 ,/* 8 */ +OARI_ATTRIBUTES_ATOMICITY_GUARANTEE =0X122 ,/* 8 */ +OARI_DATA_ATTRIBUTES_ATOMICITY_MULTIPLIER =0X123 ,/* 1 */ + +OARI_MAXIMUM_SNAPSHOTS_COUNT =0X1C1 ,/* 0 or 4 */ +OARI_MAXIMUM_CLONES_COUNT =0X1C2 ,/* 0 or 4 */ +OARI_MAXIMUM_BRANCH_DEPTH =0X1CC ,/* 0 or 4 */ +OARI_SUPPORTED_OBJECT_DUPLICATION_METHOD_FIRST =0X200 ,/* 0 or 4 */ +OARI_SUPPORTED_OBJECT_DUPLICATION_METHOD_LAST =0X2ff ,/* 0 or 4 */ +OARI_SUPPORTED_TIME_OF_DUPLICATION_METHOD_FIRST =0X300 ,/* 0 or 4 */ +OARI_SUPPORTED_TIME_OF_DUPLICATION_METHOD_LAST =0X30F ,/* 0 or 4 */ +OARI_SUPPORT_FOR_DUPLICATED_OBJECT_FREEZING =0X310 ,/* 0 or 4 */ +OARI_SUPPORT_FOR_SNAPSHOT_REFRESHING =0X311 ,/* 0 or 1 */ +OARI_SUPPORTED_CDB_CONTINUATION_DESC_TYPE_FIRST =0X7000001 ,/* 0 or 4 */ + OARI_SUPPORTED_CDB_CONTINUATION_DESC_TYPE_LAST = 0X700FFFF,/* 0 or 4 */ };/* Root_Information_attributes_page does not have a get_page structure */
@@ -120,7 +143,15 @@ enum {OSD_ATTR_PI_PARTITION_ID =0x1 ,/* 8 */ OSD_ATTR_PI_USERNAME =0x9 ,/* variable */ OSD_ATTR_PI_USED_CAPACITY =0x81 ,/* 8 */ +OSD_ATTR_PI_USED_CAPACITY_INCREMENT =0x84 ,/* 0 or 8 */ OSD_ATTR_PI_NUMBER_OF_OBJECTS =0xC1 ,/* 8 */ + +OSD_ATTR_PI_ACTUAL_DATA_SPACE =0xD1 ,/* 0 or 8 */ +OSD_ATTR_PI_RESERVED_DATA_SPACE =0xD2 ,/* 0 or 8 */ +OSD_ATTR_PI_DEFAULT_SNAPSHOT_DUPLICATION_METHOD =0x200 ,/* 0 or 4 */ +OSD_ATTR_PI_DEFAULT_CLONE_DUPLICATION_METHOD =0x201 ,/* 0 or 4 */ +OSD_ATTR_PI_DEFAULT_SP_TIME_OF_DUPLICATION =0x300 ,/* 0 or 4 */ + OSD_ATTR_PI_DEFAULT_CLONE_TIME_OF_DUPLICATION = 0x301,/* 0 or 4 */ };/* Partition Information attributes page does not have a get_page structure */
@@ -131,6 +162,7 @@ enum {OSD_ATTR_CI_PARTITION_ID =0x1 ,/* 8 */ OSD_ATTR_CI_COLLECTION_OBJECT_ID =0x2 ,/* 8 */ OSD_ATTR_CI_USERNAME =0x9 ,/* variable */ +OSD_ATTR_CI_COLLECTION_TYPE =0xA ,/* 1 */ OSD_ATTR_CI_USED_CAPACITY = 0x81, /* 8 */ };/* Collection Information attributes page does not have a get_page structure */
@@ -144,6 +176,8 @@ enum {OSD_ATTR_OI_USERNAME =0x9 ,/* variable */ OSD_ATTR_OI_USED_CAPACITY =0x81 ,/* 8 */ OSD_ATTR_OI_LOGICAL_LENGTH =0x82 ,/* 8 */ +SD_ATTR_OI_ACTUAL_DATA_SPACE =0XD1 ,/* 0 OR 8 */ + SD_ATTR_OI_RESERVED_DATA_SPACE = 0XD2, /* 0 OR 8 */ };/* Object Information attributes page does not have a get_page structure */
@@ -248,7 +282,18 @@ struct object_timestamps_attributes_page {struct osd_timestamp data_modified_time; } __packed; -/* 7.1.2.19 Collections attributes page */ +/* OSD2r05: 7.1.3.19 Attributes Access attributes page +* (OSD_APAGE_PARTITION_ATTR_ACCESS) +* +* each attribute is of the form below. Total array length is deduced +* from the attribute's length +* (See allowed_attributes_access of the struct osd_cap_object_descriptor) +*/ +struct attributes_access_attr { +struct osd_attributes_list_attrid attr_list[0 ]; +} __packed; + +/* OSD2r05: 7.1.2.21 Collections attributes page */ /* TBD */ /* 7.1.2.20 Root Policy/Security attributes page (OSD_APAGE_ROOT_SECURITY) */
@@ -324,4 +369,29 @@ struct object_security_attributes_page { __be32 policy_access_tag; } __packed; +/* OSD2r05: 7.1.3.31 Current Command attributes page +* (OSD_APAGE_CURRENT_COMMAND) +*/ +enum { +OSD_ATTR_CC_RESPONSE_INTEGRITY_CHECK_VALUE =0x1 ,/* 32 */ +OSD_ATTR_CC_OBJECT_TYPE =0x2 ,/* 1 */ +OSD_ATTR_CC_PARTITION_ID =0x3 ,/* 8 */ +OSD_ATTR_CC_OBJECT_ID =0x4 ,/* 8 */ +OSD_ATTR_CC_STARTING_BYTE_ADDRESS_OF_APPEND =0x5 ,/* 8 */ +OSD_ATTR_CC_CHANGE_IN_USED_CAPACITY =0x6 ,/* 8 */ +}; + +/*TBD: osdv1_current_command_attributes_page */ + +struct osdv2_current_command_attributes_page { +struct osd_attr_page_header hdr;/* id=0xFFFFFFFE, size=0x44 */ +u8 response_integrity_check_value[OSD_CRYPTO_KEYID_SIZE ]; +u8 object_type; +u8 reserved[3 ]; +__be64 partition_id; +__be64 object_id; +__be64 starting_byte_address_of_append; +__be64 change_in_used_capacity; +}; +#endif /*ndef __OSD_ATTRIBUTES_H__*/
Signature · 1 line
1.6.2.1
PATCH 3/6 libosd: Better printout of OSD target system information
In reply to Boaz HarroshShorten out the Attributes names.
Align all results on column 24.
Print system ID in a new line.
--- drivers/scsi/osd/osd_initiator.c | 23 ++++++++++++----------- 1 files changed, 12 insertions(+), 11 deletions(-)
drivers/scsi/osd/osd_initiator.c +12 -11
@@ -118,39 +118,39 @@ static int _osd_print_system_info(struct osd_dev *od, void *caps) _osd_ver_desc(or)); pFirst = get_attrs[a++].val_ptr; -OSD_INFO ("OSD_ATTR_RI_VENDOR_IDENTIFICATION [%s]\n" , +OSD_INFO ("VENDOR_IDENTIFICATION [%s]\n" , (char *)pFirst); pFirst = get_attrs[a++].val_ptr; -OSD_INFO ("OSD_ATTR_RI_PRODUCT_IDENTIFICATION [%s]\n" , +OSD_INFO ("PRODUCT_IDENTIFICATION [%s]\n" , (char *)pFirst); pFirst = get_attrs[a++].val_ptr; -OSD_INFO ("OSD_ATTR_RI_PRODUCT_MODEL [%s]\n" , +OSD_INFO ("PRODUCT_MODEL [%s]\n" , (char *)pFirst); pFirst = get_attrs[a++].val_ptr; -OSD_INFO ("OSD_ATTR_RI_PRODUCT_REVISION_LEVEL [%u]\n" , +OSD_INFO ("PRODUCT_REVISION_LEVEL [%u]\n" , pFirst ?get_unaligned_be32 (pFirst) : ~0U ); pFirst = get_attrs[a++].val_ptr; -OSD_INFO ("OSD_ATTR_RI_PRODUCT_SERIAL_NUMBER [%s]\n" , +OSD_INFO ("PRODUCT_SERIAL_NUMBER [%s]\n" , (char *)pFirst); pFirst = get_attrs[a].val_ptr; -OSD_INFO ("OSD_ATTR_RI_OSD_NAME [%s]\n" , (char *)pFirst); +OSD_INFO ("OSD_NAME [%s]\n" , (char *)pFirst); a++; pFirst = get_attrs[a++].val_ptr; -OSD_INFO ("OSD_ATTR_RI_TOTAL_CAPACITY [0x%llx]\n" , +OSD_INFO ("TOTAL_CAPACITY [0x%llx]\n" , pFirst ?_LLU (get_unaligned_be64 (pFirst)) : ~0ULL ); pFirst = get_attrs[a++].val_ptr; -OSD_INFO ("OSD_ATTR_RI_USED_CAPACITY [0x%llx]\n" , +OSD_INFO ("USED_CAPACITY [0x%llx]\n" , pFirst ?_LLU (get_unaligned_be64 (pFirst)) : ~0ULL ); pFirst = get_attrs[a++].val_ptr; -OSD_INFO ("OSD_ATTR_RI_NUMBER_OF_PARTITIONS [%llu]\n" , +OSD_INFO ("NUMBER_OF_PARTITIONS [%llu]\n" , pFirst ?_LLU (get_unaligned_be64 (pFirst)) : ~0ULL );if (a >= nelem)
@@ -158,7 +158,7 @@ static int _osd_print_system_info(struct osd_dev *od, void *caps)/* FIXME: Where are the time utilities */ pFirst = get_attrs[a++].val_ptr; -OSD_INFO ("OSD_ATTR_RI_CLOCK [0x%02x%02x%02x%02x%02x%02x]\n" , +OSD_INFO ("CLOCK [0x%02x%02x%02x%02x%02x%02x]\n" , ((char *)pFirst)[0 ], ((char *)pFirst)[1 ], ((char *)pFirst)[2 ], ((char *)pFirst)[3 ], ((char *)pFirst)[4 ], ((char *)pFirst)[5 ]);
@@ -169,7 +169,8 @@ static int _osd_print_system_info(struct osd_dev *od, void *caps)hex_dump_to_buffer (get_attrs[a].val_ptr, len,32 ,1 , sid_dump,sizeof (sid_dump), true); -OSD_INFO ("OSD_ATTR_RI_OSD_SYSTEM_ID(%d) [%s]\n" , len, sid_dump); +OSD_INFO ("OSD_SYSTEM_ID(%d)\n" +" [%s]\n" , len, sid_dump); a++; } out:
Signature · 1 line
1.6.2.1
PATCH 4/6 libosd: osd_req_{read,write}_kern new API
In reply to Boaz HarroshBy popular demand, define useful wrappers for osd_req_read/write that receive kernel pointers. All users had their own.
Also remove these from exofs
--- drivers/scsi/osd/osd_initiator.c | 28 ++++++++++++++++++++++++++++ fs/exofs/common.h | 6 ------ fs/exofs/osd.c | 26 -------------------------- include/scsi/osd_initiator.h | 4 ++++ 4 files changed, 32 insertions(+), 32 deletions(-)
drivers/scsi/osd/osd_initiator.c +28 -0
@@ -789,6 +789,20 @@ void osd_req_write(struct osd_request *or, }EXPORT_SYMBOL (osd_req_write); +int osd_req_write_kern (struct osd_request *or, +const struct osd_obj_id *obj,u64 offset,void * buff,u64 len) +{ +struct request_queue *req_q = or->osd_dev->scsi_device->request_queue; +struct bio *bio =bio_map_kern (req_q, buff, len,GFP_KERNEL ); + +if (IS_ERR (bio)) +return PTR_ERR (bio); + +osd_req_write (or, obj, bio, offset); +return 0 ; +} +EXPORT_SYMBOL (osd_req_write_kern); +/*TODO: void osd_req_append(struct osd_request *, const struct osd_obj_id *, struct bio *data_out); */ /*TODO: void osd_req_create_write(struct osd_request *,
@@ -824,6 +838,20 @@ void osd_req_read(struct osd_request *or, }EXPORT_SYMBOL (osd_req_read); +int osd_req_read_kern (struct osd_request *or, +const struct osd_obj_id *obj,u64 offset,void * buff,u64 len) +{ +struct request_queue *req_q = or->osd_dev->scsi_device->request_queue; +struct bio *bio =bio_map_kern (req_q, buff, len,GFP_KERNEL ); + +if (IS_ERR (bio)) +return PTR_ERR (bio); + +osd_req_read (or, obj, bio, offset); +return 0 ; +} +EXPORT_SYMBOL (osd_req_read_kern); +void osd_req_get_attributes (struct osd_request *or,const struct osd_obj_id *obj) {
fs/exofs/common.h +0 -6
@@ -175,10 +175,4 @@ int exofs_async_op(struct osd_request *or,int extract_attr_from_req (struct osd_request *or,struct osd_attr *attr); -int osd_req_read_kern (struct osd_request *or, -const struct osd_obj_id *obj,u64 offset,void *buff,u64 len); - -int osd_req_write_kern (struct osd_request *or, -const struct osd_obj_id *obj,u64 offset,void *buff,u64 len); -#endif /*ifndef __EXOFS_COM_H__*/
fs/exofs/osd.c +0 -26
@@ -125,29 +125,3 @@ int extract_attr_from_req(struct osd_request *or, struct osd_attr *attr)return -EIO ; } - -int osd_req_read_kern (struct osd_request *or, -const struct osd_obj_id *obj,u64 offset,void * buff,u64 len) -{ -struct request_queue *req_q = or->osd_dev->scsi_device->request_queue; -struct bio *bio =bio_map_kern (req_q, buff, len,GFP_KERNEL ); - -if (!bio) -return -ENOMEM ; - -osd_req_read (or, obj, bio, offset); -return 0 ; -} - -int osd_req_write_kern (struct osd_request *or, -const struct osd_obj_id *obj,u64 offset,void * buff,u64 len) -{ -struct request_queue *req_q = or->osd_dev->scsi_device->request_queue; -struct bio *bio =bio_map_kern (req_q, buff, len,GFP_KERNEL ); - -if (!bio) -return -ENOMEM ; - -osd_req_write (or, obj, bio, offset); -return 0 ; -}
include/scsi/osd_initiator.h +4 -0
@@ -364,6 +364,8 @@ void osd_req_remove_object(struct osd_request *or, struct osd_obj_id *);void osd_req_write (struct osd_request *or,const struct osd_obj_id *,struct bio *data_out,u64 offset); +int osd_req_write_kern (struct osd_request *or, +const struct osd_obj_id *obj,u64 offset,void *buff,u64 len);void osd_req_append (struct osd_request *or,const struct osd_obj_id *,struct bio *data_out);/* NI */ void osd_req_create_write(struct osd_request *or,
@@ -379,6 +381,8 @@ void osd_req_flush_object(struct osd_request *or,void osd_req_read (struct osd_request *or,const struct osd_obj_id *,struct bio *data_in,u64 offset); +int osd_req_read_kern (struct osd_request *or, +const struct osd_obj_id *obj,u64 offset,void *buff,u64 len);/* * Root/Partition/Collection/Object Attributes commands
Signature · 1 line
1.6.2.1
PATCH 5/6 libosd: Let _osd_req_finalize_data_integrity receive number of out_bytes
In reply to Boaz Harrosh_osd_req_finalize_data_integrity was trying to deduce the number of out_bytes from passed osd_request->out.bio. This is wrong when the bio is chained. The caller of _osd_req_finalize_data_integrity has more ready available information and should just pass it.
Also in the light of future support for CDB-continuation segment this is a better solution.
--- drivers/scsi/osd/osd_initiator.c | 9 +++++---- 1 files changed, 5 insertions(+), 4 deletions(-)
drivers/scsi/osd/osd_initiator.c +5 -4
@@ -1262,7 +1262,7 @@ static inline void osd_sec_parms_set_in_offset(bool is_v1, }static int _osd_req_finalize_data_integrity (struct osd_request *or, -bool has_in,bool has_out,const u8 *cap_key) +bool has_in,bool has_out,u64 out_data_bytes,const u8 *cap_key) {struct osd_security_parameters *sec_parms =_osd_req_sec_params (or);int ret;
@@ -1277,8 +1277,7 @@ static int _osd_req_finalize_data_integrity(struct osd_request *or, };unsigned pad; - or->out_data_integ.data_bytes =cpu_to_be64 ( - or->out.bio ? or->out.bio->bi_size :0 ); + or->out_data_integ.data_bytes =cpu_to_be64 (out_data_bytes); or->out_data_integ.set_attributes_bytes =cpu_to_be64 ( or->set_attr.total_bytes); or->out_data_integ.get_attributes_bytes = cpu_to_be64(
@@ -1370,6 +1369,7 @@ int osd_finalize_request(struct osd_request *or, {struct osd_cdb_head *cdbh =osd_cdb_head (&or->cdb);bool has_in, has_out; +u64 out_data_bytes = or->out.total_bytes;int ret;if (options &OSD_REQ_FUA )
@@ -1439,7 +1439,8 @@ int osd_finalize_request(struct osd_request *or, } } - ret =_osd_req_finalize_data_integrity (or, has_in, has_out, cap_key); + ret =_osd_req_finalize_data_integrity (or, has_in, has_out, + out_data_bytes, cap_key);if (ret)return ret;
Signature · 1 line
1.6.2.1
PATCH 6/6 libosd: osd_req_{read,write} takes a length parameter
In reply to Boaz HarroshFor supporting of chained-bios we can not inspect the first bio only, as before. Caller shall pass the total length of the request, ie. sum_bytes(bio-chain).
Also since the bio might be a chain we don't set it's direction on behalf of it's callers. The bio direction should be properly set prior to this call. So fix a couple of write users that now need to set the bio direction properly
[In this patch I change both library code and user sites at
exofs, to make it easy on integration. It should be submitted via James's scsi-misc tree.]
--- drivers/scsi/osd/osd_initiator.c | 23 +++++++++++++---------- fs/exofs/inode.c | 5 +++-- include/scsi/osd_initiator.h | 4 ++-- 3 files changed, 18 insertions(+), 14 deletions(-)
drivers/scsi/osd/osd_initiator.c +13 -10
@@ -779,13 +779,14 @@ EXPORT_SYMBOL(osd_req_remove_object);*/ void osd_req_write (struct osd_request *or, -const struct osd_obj_id *obj,struct bio *bio,u64 offset) +const struct osd_obj_id *obj,u64 offset, +struct bio *bio,u64 len) { -_osd_req_encode_common (or,OSD_ACT_WRITE , obj, offset, bio->bi_size); +_osd_req_encode_common (or,OSD_ACT_WRITE , obj, offset, len);WARN_ON (or->out.bio || or->out.total_bytes); - bio->bi_rw |= (1 <<BIO_RW ); +WARN_ON (0 ==bio_rw_flagged (bio,BIO_RW )); or->out.bio = bio; - or->out.total_bytes = bio->bi_size; + or->out.total_bytes = len; }EXPORT_SYMBOL (osd_req_write);
@@ -798,7 +799,8 @@ int osd_req_write_kern(struct osd_request *or,if (IS_ERR (bio))return PTR_ERR (bio); -osd_req_write (or, obj, bio, offset); + bio->bi_rw |= (1 <<BIO_RW );/* FIXME: bio_set_dir() */ +osd_req_write (or, obj, offset, bio, len);return 0 ; }EXPORT_SYMBOL (osd_req_write_kern);
@@ -828,13 +830,14 @@ void osd_req_flush_object(struct osd_request *or,EXPORT_SYMBOL (osd_req_flush_object);void osd_req_read (struct osd_request *or, -const struct osd_obj_id *obj,struct bio *bio,u64 offset) +const struct osd_obj_id *obj,u64 offset, +struct bio *bio,u64 len) { -_osd_req_encode_common (or,OSD_ACT_READ , obj, offset, bio->bi_size); +_osd_req_encode_common (or,OSD_ACT_READ , obj, offset, len);WARN_ON (or->in.bio || or->in.total_bytes); - bio->bi_rw &= ~(1 <<BIO_RW ); +WARN_ON (1 ==bio_rw_flagged (bio,BIO_RW )); or->in.bio = bio; - or->in.total_bytes = bio->bi_size; + or->in.total_bytes = len; }EXPORT_SYMBOL (osd_req_read);
@@ -847,7 +850,7 @@ int osd_req_read_kern(struct osd_request *or,if (IS_ERR (bio))return PTR_ERR (bio); -osd_req_read (or, obj, bio, offset); +osd_req_read (or, obj, offset, bio, len);return 0 ; }EXPORT_SYMBOL (osd_req_read_kern);
fs/exofs/inode.c +3 -2
@@ -266,7 +266,7 @@ static int read_exec(struct page_collect *pcol, bool is_sync) goto err; } -osd_req_read (or, &obj, pcol->bio, i_start); +osd_req_read (or, &obj, i_start, pcol->bio, pcol->length);if (is_sync) {exofs_sync_op (or, pcol->sbi->s_timeout, oi->i_cred);
@@ -522,7 +522,8 @@ static int write_exec(struct page_collect *pcol) *pcol_copy = *pcol; -osd_req_write (or, &obj, pcol_copy->bio, i_start); + pcol_copy->bio->bi_rw |= (1 <<BIO_RW );/* FIXME: bio_set_dir() */ +osd_req_write (or, &obj, i_start, pcol_copy->bio, pcol_copy->length); ret =exofs_async_op (or, writepages_done, pcol_copy, oi->i_cred);if (unlikely (ret)) {EXOFS_ERR ("write_exec: exofs_async_op() Faild\n" );
include/scsi/osd_initiator.h +2 -2
@@ -363,7 +363,7 @@ void osd_req_create_object(struct osd_request *or, struct osd_obj_id *);void osd_req_remove_object (struct osd_request *or,struct osd_obj_id *);void osd_req_write (struct osd_request *or, -const struct osd_obj_id *,struct bio *data_out,u64 offset); +const struct osd_obj_id *obj,u64 offset,struct bio *bio,u64 len);int osd_req_write_kern (struct osd_request *or,const struct osd_obj_id *obj,u64 offset,void *buff,u64 len); void osd_req_append(struct osd_request *or,
@@ -380,7 +380,7 @@ void osd_req_flush_object(struct osd_request *or, /*V2*/ u64 offset, /*V2*/ u64 len);void osd_req_read (struct osd_request *or, -const struct osd_obj_id *,struct bio *data_in,u64 offset); +const struct osd_obj_id *obj,u64 offset,struct bio *bio,u64 len);int osd_req_read_kern (struct osd_request *or,const struct osd_obj_id *obj,u64 offset,void *buff,u64 len);
Signature · 1 line
1.6.2.1