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