[SCSI] libosd: Fix bug in attr_page handling

The _osd_req_finalize_attr_page was off by a mile, when trying to
append the enc_get_attr segment instead of the proper set_attr segment.

Also properly support when we don't have any attribute to set while
getting a full page. And when clearing an attribute by setting it's
size to zero.

Reported-by: John Chandy <john.chandy@uconn.edu>
Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>

authored by Boaz Harrosh and committed by James Bottomley ec6a0a41 391cbf46

+10 -6
+10 -6
drivers/scsi/osd/osd_initiator.c
··· 1218 or->get_attr.buff = attar_page; 1219 or->get_attr.total_bytes = max_page_len; 1220 1221 - or->set_attr.buff = set_one_attr->val_ptr; 1222 - or->set_attr.total_bytes = set_one_attr->len; 1223 - 1224 cdbh->attrs_page.get_attr_page = cpu_to_be32(page_id); 1225 cdbh->attrs_page.get_attr_alloc_length = cpu_to_be32(max_page_len); 1226 - /* ocdb->attrs_page.get_attr_offset; */ 1227 1228 cdbh->attrs_page.set_attr_page = cpu_to_be32(set_one_attr->attr_page); 1229 cdbh->attrs_page.set_attr_id = cpu_to_be32(set_one_attr->attr_id); 1230 cdbh->attrs_page.set_attr_length = cpu_to_be32(set_one_attr->len); 1231 - /* ocdb->attrs_page.set_attr_offset; */ 1232 return 0; 1233 } 1234 EXPORT_SYMBOL(osd_req_add_get_attr_page); ··· 1249 if (ret) 1250 return ret; 1251 1252 /* set one value */ 1253 cdbh->attrs_page.set_attr_offset = 1254 osd_req_encode_offset(or, or->out.total_bytes, &out_padding); 1255 1256 - ret = _req_append_segment(or, out_padding, &or->enc_get_attr, NULL, 1257 &or->out); 1258 return ret; 1259 }
··· 1218 or->get_attr.buff = attar_page; 1219 or->get_attr.total_bytes = max_page_len; 1220 1221 cdbh->attrs_page.get_attr_page = cpu_to_be32(page_id); 1222 cdbh->attrs_page.get_attr_alloc_length = cpu_to_be32(max_page_len); 1223 + 1224 + if (!set_one_attr || !set_one_attr->attr_page) 1225 + return 0; /* The set is optional */ 1226 + 1227 + or->set_attr.buff = set_one_attr->val_ptr; 1228 + or->set_attr.total_bytes = set_one_attr->len; 1229 1230 cdbh->attrs_page.set_attr_page = cpu_to_be32(set_one_attr->attr_page); 1231 cdbh->attrs_page.set_attr_id = cpu_to_be32(set_one_attr->attr_id); 1232 cdbh->attrs_page.set_attr_length = cpu_to_be32(set_one_attr->len); 1233 return 0; 1234 } 1235 EXPORT_SYMBOL(osd_req_add_get_attr_page); ··· 1248 if (ret) 1249 return ret; 1250 1251 + if (or->set_attr.total_bytes == 0) 1252 + return 0; 1253 + 1254 /* set one value */ 1255 cdbh->attrs_page.set_attr_offset = 1256 osd_req_encode_offset(or, or->out.total_bytes, &out_padding); 1257 1258 + ret = _req_append_segment(or, out_padding, &or->set_attr, NULL, 1259 &or->out); 1260 return ret; 1261 }