)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"9ae04e508716105bbfc35ef212593411fd1f59d0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"fcbc2094_9380119e","updated":"2023-01-10 13:13:39.000000000","message":"Test failures are because Jenkins is borked","commit_id":"ad38757af012319a2645549eebd3140f9eafe755"}],"metropolis/pkg/scsi/dev_block.go":[{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"ca33f3811b5b89335fb8f9941e101eff923f754c","unresolved":true,"context_lines":[{"line_number":27,"context_line":"\treq[1] |\u003d byte(defectListFormat)"},{"line_number":28,"context_line":"\tbinary.BigEndian.PutUint16(req[6:8], uint16(len(data)))"},{"line_number":29,"context_line":"\tif err :\u003d d.RawCommand(\u0026CommandDataBuffer{"},{"line_number":30,"context_line":"\t\tOperationCode:         0x37,"},{"line_number":31,"context_line":"\t\tRequest:               req[:],"},{"line_number":32,"context_line":"\t\tData:                  data,"},{"line_number":33,"context_line":"\t\tDataTransferDirection: DataTransferFromDevice,"}],"source_content_type":"text/x-go","patch_set":2,"id":"06582a13_fa970ca1","line":30,"range":{"start_line":30,"start_character":25,"end_line":30,"end_character":29},"updated":"2023-01-12 12:10:58.000000000","message":"Define this, too.","commit_id":"63c6b280954971ff7608de454306add27e84cf4a"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"86dc755ab00c74d89cc22f23066a06790d5e39b7","unresolved":false,"context_lines":[{"line_number":27,"context_line":"\treq[1] |\u003d byte(defectListFormat)"},{"line_number":28,"context_line":"\tbinary.BigEndian.PutUint16(req[6:8], uint16(len(data)))"},{"line_number":29,"context_line":"\tif err :\u003d d.RawCommand(\u0026CommandDataBuffer{"},{"line_number":30,"context_line":"\t\tOperationCode:         0x37,"},{"line_number":31,"context_line":"\t\tRequest:               req[:],"},{"line_number":32,"context_line":"\t\tData:                  data,"},{"line_number":33,"context_line":"\t\tDataTransferDirection: DataTransferFromDevice,"}],"source_content_type":"text/x-go","patch_set":2,"id":"4153fae5_95d14c11","line":30,"range":{"start_line":30,"start_character":25,"end_line":30,"end_character":29},"in_reply_to":"06582a13_fa970ca1","updated":"2023-01-12 18:49:30.000000000","message":"Done","commit_id":"63c6b280954971ff7608de454306add27e84cf4a"}],"metropolis/pkg/scsi/inquiry.go":[{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"ca33f3811b5b89335fb8f9941e101eff923f754c","unresolved":true,"context_lines":[{"line_number":15,"context_line":"\tvar req [4]byte"},{"line_number":16,"context_line":"\tbinary.BigEndian.PutUint16(req[2:4], uint16(len(data)))"},{"line_number":17,"context_line":"\tif err :\u003d d.RawCommand(\u0026CommandDataBuffer{"},{"line_number":18,"context_line":"\t\tOperationCode:         0x12,"},{"line_number":19,"context_line":"\t\tRequest:               req[:],"},{"line_number":20,"context_line":"\t\tData:                  data,"},{"line_number":21,"context_line":"\t\tDataTransferDirection: DataTransferFromDevice,"}],"source_content_type":"text/x-go","patch_set":2,"id":"559cb1ae_b94a1026","line":18,"range":{"start_line":18,"start_character":25,"end_line":18,"end_character":29},"updated":"2023-01-12 12:10:58.000000000","message":"Let\u0027s define this somewhere.","commit_id":"63c6b280954971ff7608de454306add27e84cf4a"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"86dc755ab00c74d89cc22f23066a06790d5e39b7","unresolved":false,"context_lines":[{"line_number":15,"context_line":"\tvar req [4]byte"},{"line_number":16,"context_line":"\tbinary.BigEndian.PutUint16(req[2:4], uint16(len(data)))"},{"line_number":17,"context_line":"\tif err :\u003d d.RawCommand(\u0026CommandDataBuffer{"},{"line_number":18,"context_line":"\t\tOperationCode:         0x12,"},{"line_number":19,"context_line":"\t\tRequest:               req[:],"},{"line_number":20,"context_line":"\t\tData:                  data,"},{"line_number":21,"context_line":"\t\tDataTransferDirection: DataTransferFromDevice,"}],"source_content_type":"text/x-go","patch_set":2,"id":"7069e7e2_89f0e11a","line":18,"range":{"start_line":18,"start_character":25,"end_line":18,"end_character":29},"in_reply_to":"559cb1ae_b94a1026","updated":"2023-01-12 18:49:30.000000000","message":"Done","commit_id":"63c6b280954971ff7608de454306add27e84cf4a"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"ca33f3811b5b89335fb8f9941e101eff923f754c","unresolved":true,"context_lines":[{"line_number":71,"context_line":"\t\t\treturn \u0026res, nil"},{"line_number":72,"context_line":"\t\t}"},{"line_number":73,"context_line":"\t}"},{"line_number":74,"context_line":"\tfor i :\u003d 0; i \u003c 8; i++ {"},{"line_number":75,"context_line":"\t\tvar versionDesc uint16"},{"line_number":76,"context_line":"\t\tif err :\u003d binary.Read(rawReader, binary.BigEndian, \u0026versionDesc); err !\u003d nil {"},{"line_number":77,"context_line":"\t\t\tif err \u003d\u003d io.EOF || err \u003d\u003d io.ErrUnexpectedEOF {"}],"source_content_type":"text/x-go","patch_set":2,"id":"57550d78_c7903f4d","line":74,"range":{"start_line":74,"start_character":1,"end_line":74,"end_character":25},"updated":"2023-01-12 12:10:58.000000000","message":"Is it okay/expected to only have, like, 3 of these instead of the full 8?\n\nIf not, you can directly binary.Read into an array of uint16.","commit_id":"63c6b280954971ff7608de454306add27e84cf4a"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"389ba96a9fada254c2e68ad3def7a2d2e6924e8c","unresolved":false,"context_lines":[{"line_number":71,"context_line":"\t\t\treturn \u0026res, nil"},{"line_number":72,"context_line":"\t\t}"},{"line_number":73,"context_line":"\t}"},{"line_number":74,"context_line":"\tfor i :\u003d 0; i \u003c 8; i++ {"},{"line_number":75,"context_line":"\t\tvar versionDesc uint16"},{"line_number":76,"context_line":"\t\tif err :\u003d binary.Read(rawReader, binary.BigEndian, \u0026versionDesc); err !\u003d nil {"},{"line_number":77,"context_line":"\t\t\tif err \u003d\u003d io.EOF || err \u003d\u003d io.ErrUnexpectedEOF {"}],"source_content_type":"text/x-go","patch_set":2,"id":"7c35b0f0_98b5c3cc","line":74,"range":{"start_line":74,"start_character":1,"end_line":74,"end_character":25},"in_reply_to":"1b4edd4b_74517b2f","updated":"2023-01-18 10:09:21.000000000","message":"Ack","commit_id":"63c6b280954971ff7608de454306add27e84cf4a"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"86dc755ab00c74d89cc22f23066a06790d5e39b7","unresolved":true,"context_lines":[{"line_number":71,"context_line":"\t\t\treturn \u0026res, nil"},{"line_number":72,"context_line":"\t\t}"},{"line_number":73,"context_line":"\t}"},{"line_number":74,"context_line":"\tfor i :\u003d 0; i \u003c 8; i++ {"},{"line_number":75,"context_line":"\t\tvar versionDesc uint16"},{"line_number":76,"context_line":"\t\tif err :\u003d binary.Read(rawReader, binary.BigEndian, \u0026versionDesc); err !\u003d nil {"},{"line_number":77,"context_line":"\t\t\tif err \u003d\u003d io.EOF || err \u003d\u003d io.ErrUnexpectedEOF {"}],"source_content_type":"text/x-go","patch_set":2,"id":"1b4edd4b_74517b2f","line":74,"range":{"start_line":74,"start_character":1,"end_line":74,"end_character":25},"in_reply_to":"57550d78_c7903f4d","updated":"2023-01-12 18:49:30.000000000","message":"I think so? It\u0027s not entirely clear if that\u0027s legal from a standards perspective but it does make semantic sense so I allowed it.","commit_id":"63c6b280954971ff7608de454306add27e84cf4a"}],"metropolis/pkg/scsi/log.go":[{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"ca33f3811b5b89335fb8f9941e101eff923f754c","unresolved":true,"context_lines":[{"line_number":7,"context_line":"\t\"math\""},{"line_number":8,"context_line":")"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"type LogSenseRequest struct {"},{"line_number":11,"context_line":"\tPageCode         uint8"},{"line_number":12,"context_line":"\tSubpageCode      uint8"},{"line_number":13,"context_line":"\tPageControl      uint8"},{"line_number":14,"context_line":"\tParameterPointer uint16"},{"line_number":15,"context_line":"\tSaveParameters   bool"},{"line_number":16,"context_line":"\tInitialSize      uint16"},{"line_number":17,"context_line":"}"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"// LogSenseRaw requests a raw log page. For log pages with parameters"},{"line_number":20,"context_line":"// LogSenseParameters is better-suited."}],"source_content_type":"text/x-go","patch_set":2,"id":"6350fd36_6f5ad0f1","line":17,"range":{"start_line":10,"start_character":0,"end_line":17,"end_character":1},"updated":"2023-01-12 12:10:58.000000000","message":"Even if these are \u0027just\u0027 SCSI bits, if this is exported, it should be at least somewhat documented for those of us who don\u0027t have a PhD in SCSI :).","commit_id":"63c6b280954971ff7608de454306add27e84cf4a"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"86dc755ab00c74d89cc22f23066a06790d5e39b7","unresolved":false,"context_lines":[{"line_number":7,"context_line":"\t\"math\""},{"line_number":8,"context_line":")"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"type LogSenseRequest struct {"},{"line_number":11,"context_line":"\tPageCode         uint8"},{"line_number":12,"context_line":"\tSubpageCode      uint8"},{"line_number":13,"context_line":"\tPageControl      uint8"},{"line_number":14,"context_line":"\tParameterPointer uint16"},{"line_number":15,"context_line":"\tSaveParameters   bool"},{"line_number":16,"context_line":"\tInitialSize      uint16"},{"line_number":17,"context_line":"}"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"// LogSenseRaw requests a raw log page. For log pages with parameters"},{"line_number":20,"context_line":"// LogSenseParameters is better-suited."}],"source_content_type":"text/x-go","patch_set":2,"id":"5c840a93_27494961","line":17,"range":{"start_line":10,"start_character":0,"end_line":17,"end_character":1},"in_reply_to":"6350fd36_6f5ad0f1","updated":"2023-01-12 18:49:30.000000000","message":"Done","commit_id":"63c6b280954971ff7608de454306add27e84cf4a"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"ca33f3811b5b89335fb8f9941e101eff923f754c","unresolved":true,"context_lines":[{"line_number":31,"context_line":"\t\tbinary.BigEndian.PutUint16(req[4:6], r.ParameterPointer)"},{"line_number":32,"context_line":"\t\tbinary.BigEndian.PutUint16(req[6:8], uint16(len(data)))"},{"line_number":33,"context_line":"\t\tif err :\u003d d.RawCommand(\u0026CommandDataBuffer{"},{"line_number":34,"context_line":"\t\t\tOperationCode:         0x4d,"},{"line_number":35,"context_line":"\t\t\tRequest:               req[:],"},{"line_number":36,"context_line":"\t\t\tData:                  data,"},{"line_number":37,"context_line":"\t\t\tDataTransferDirection: DataTransferFromDevice,"}],"source_content_type":"text/x-go","patch_set":2,"id":"386a8d96_d55ac478","line":34,"range":{"start_line":34,"start_character":26,"end_line":34,"end_character":31},"updated":"2023-01-12 12:10:58.000000000","message":"Also define this.","commit_id":"63c6b280954971ff7608de454306add27e84cf4a"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"86dc755ab00c74d89cc22f23066a06790d5e39b7","unresolved":false,"context_lines":[{"line_number":31,"context_line":"\t\tbinary.BigEndian.PutUint16(req[4:6], r.ParameterPointer)"},{"line_number":32,"context_line":"\t\tbinary.BigEndian.PutUint16(req[6:8], uint16(len(data)))"},{"line_number":33,"context_line":"\t\tif err :\u003d d.RawCommand(\u0026CommandDataBuffer{"},{"line_number":34,"context_line":"\t\t\tOperationCode:         0x4d,"},{"line_number":35,"context_line":"\t\t\tRequest:               req[:],"},{"line_number":36,"context_line":"\t\t\tData:                  data,"},{"line_number":37,"context_line":"\t\t\tDataTransferDirection: DataTransferFromDevice,"}],"source_content_type":"text/x-go","patch_set":2,"id":"3dffa685_e56b6f1c","line":34,"range":{"start_line":34,"start_character":26,"end_line":34,"end_character":31},"in_reply_to":"386a8d96_d55ac478","updated":"2023-01-12 18:49:30.000000000","message":"Done","commit_id":"63c6b280954971ff7608de454306add27e84cf4a"}],"metropolis/pkg/scsi/scsi.go":[{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"ca33f3811b5b89335fb8f9941e101eff923f754c","unresolved":true,"context_lines":[{"line_number":15,"context_line":"}"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"// NewFromFd creates a new SCSI device handle from a system handle."},{"line_number":18,"context_line":"func NewFromFd(fd syscall.Conn) (*Device, error) {"},{"line_number":19,"context_line":"\td :\u003d \u0026Device{fd: fd}"},{"line_number":20,"context_line":"\t// There is no good way to validate that a file descriptor indeed points to"},{"line_number":21,"context_line":"\t// a SCSI device. For future compatibility let this return an error so that"}],"source_content_type":"text/x-go","patch_set":1,"id":"bb49e658_071bf6d3","line":18,"range":{"start_line":18,"start_character":5,"end_line":18,"end_character":6},"updated":"2023-01-12 12:10:58.000000000","message":"Do we need this to be exported? If not, we could simplify Close to always assume fd came from os.Open.","commit_id":"ad38757af012319a2645549eebd3140f9eafe755"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"389ba96a9fada254c2e68ad3def7a2d2e6924e8c","unresolved":true,"context_lines":[{"line_number":15,"context_line":"}"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"// NewFromFd creates a new SCSI device handle from a system handle."},{"line_number":18,"context_line":"func NewFromFd(fd syscall.Conn) (*Device, error) {"},{"line_number":19,"context_line":"\td :\u003d \u0026Device{fd: fd}"},{"line_number":20,"context_line":"\t// There is no good way to validate that a file descriptor indeed points to"},{"line_number":21,"context_line":"\t// a SCSI device. For future compatibility let this return an error so that"}],"source_content_type":"text/x-go","patch_set":1,"id":"eadbd0ba_e0fe6d6d","line":18,"range":{"start_line":18,"start_character":5,"end_line":18,"end_character":6},"in_reply_to":"51717285_97a952c0","updated":"2023-01-18 10:09:21.000000000","message":"I would apply the Golden Rule of YAGNI here: keep it unexported until we actually need it. 😊\n\nBut it\u0027s your call.","commit_id":"ad38757af012319a2645549eebd3140f9eafe755"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"86dc755ab00c74d89cc22f23066a06790d5e39b7","unresolved":true,"context_lines":[{"line_number":15,"context_line":"}"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"// NewFromFd creates a new SCSI device handle from a system handle."},{"line_number":18,"context_line":"func NewFromFd(fd syscall.Conn) (*Device, error) {"},{"line_number":19,"context_line":"\td :\u003d \u0026Device{fd: fd}"},{"line_number":20,"context_line":"\t// There is no good way to validate that a file descriptor indeed points to"},{"line_number":21,"context_line":"\t// a SCSI device. For future compatibility let this return an error so that"}],"source_content_type":"text/x-go","patch_set":1,"id":"51717285_97a952c0","line":18,"range":{"start_line":18,"start_character":5,"end_line":18,"end_character":6},"in_reply_to":"bb49e658_071bf6d3","updated":"2023-01-12 18:49:30.000000000","message":"Not strictly. But I can see this being used with existing handles, especially in block device manipulation contexts (writing some stuff, then doing some SCSI magic on the device).","commit_id":"ad38757af012319a2645549eebd3140f9eafe755"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"b53b252982b4b2707fe1929962b59e92d9d6639b","unresolved":false,"context_lines":[{"line_number":15,"context_line":"}"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"// NewFromFd creates a new SCSI device handle from a system handle."},{"line_number":18,"context_line":"func NewFromFd(fd syscall.Conn) (*Device, error) {"},{"line_number":19,"context_line":"\td :\u003d \u0026Device{fd: fd}"},{"line_number":20,"context_line":"\t// There is no good way to validate that a file descriptor indeed points to"},{"line_number":21,"context_line":"\t// a SCSI device. For future compatibility let this return an error so that"}],"source_content_type":"text/x-go","patch_set":1,"id":"30b63dbe_4248391b","line":18,"range":{"start_line":18,"start_character":5,"end_line":18,"end_character":6},"in_reply_to":"eadbd0ba_e0fe6d6d","updated":"2023-01-18 14:21:28.000000000","message":"I\u0027m going to leave it in. Otherwise we\u0027re just going to open things again by filename. It\u0027s a tiny amount of complexity.","commit_id":"ad38757af012319a2645549eebd3140f9eafe755"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"ca33f3811b5b89335fb8f9941e101eff923f754c","unresolved":true,"context_lines":[{"line_number":89,"context_line":"\t\tcopy(outBuf[1:5], c.Request)"},{"line_number":90,"context_line":"\t\toutBuf[5] \u003d c.Control"},{"line_number":91,"context_line":"\t\treturn outBuf, nil"},{"line_number":92,"context_line":"\t} else if c.OperationCode \u003c 0x60 {"},{"line_number":93,"context_line":"\t\t// Use CDB10 as defined in Table 5"},{"line_number":94,"context_line":"\t\tif len(c.Request) !\u003d 8 {"},{"line_number":95,"context_line":"\t\t\treturn nil, fmt.Errorf(\"CDB10 request size is %d bytes, needs to be 4 bytes\", len(c.Request))"}],"source_content_type":"text/x-go","patch_set":1,"id":"4413ddaa_897ffd1c","line":92,"range":{"start_line":92,"start_character":3,"end_line":92,"end_character":10},"updated":"2023-01-12 12:10:58.000000000","message":"nit: use a switch/case statement instead of this if..else if...else if... block.","commit_id":"ad38757af012319a2645549eebd3140f9eafe755"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"389ba96a9fada254c2e68ad3def7a2d2e6924e8c","unresolved":true,"context_lines":[{"line_number":89,"context_line":"\t\tcopy(outBuf[1:5], c.Request)"},{"line_number":90,"context_line":"\t\toutBuf[5] \u003d c.Control"},{"line_number":91,"context_line":"\t\treturn outBuf, nil"},{"line_number":92,"context_line":"\t} else if c.OperationCode \u003c 0x60 {"},{"line_number":93,"context_line":"\t\t// Use CDB10 as defined in Table 5"},{"line_number":94,"context_line":"\t\tif len(c.Request) !\u003d 8 {"},{"line_number":95,"context_line":"\t\t\treturn nil, fmt.Errorf(\"CDB10 request size is %d bytes, needs to be 4 bytes\", len(c.Request))"}],"source_content_type":"text/x-go","patch_set":1,"id":"8055d3b3_c329c97e","line":92,"range":{"start_line":92,"start_character":3,"end_line":92,"end_character":10},"in_reply_to":"09cdaf8c_8856b7ed","updated":"2023-01-18 10:09:21.000000000","message":"Yes, this should be the same.","commit_id":"ad38757af012319a2645549eebd3140f9eafe755"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"86dc755ab00c74d89cc22f23066a06790d5e39b7","unresolved":true,"context_lines":[{"line_number":89,"context_line":"\t\tcopy(outBuf[1:5], c.Request)"},{"line_number":90,"context_line":"\t\toutBuf[5] \u003d c.Control"},{"line_number":91,"context_line":"\t\treturn outBuf, nil"},{"line_number":92,"context_line":"\t} else if c.OperationCode \u003c 0x60 {"},{"line_number":93,"context_line":"\t\t// Use CDB10 as defined in Table 5"},{"line_number":94,"context_line":"\t\tif len(c.Request) !\u003d 8 {"},{"line_number":95,"context_line":"\t\t\treturn nil, fmt.Errorf(\"CDB10 request size is %d bytes, needs to be 4 bytes\", len(c.Request))"}],"source_content_type":"text/x-go","patch_set":1,"id":"09cdaf8c_8856b7ed","line":92,"range":{"start_line":92,"start_character":3,"end_line":92,"end_character":10},"in_reply_to":"4413ddaa_897ffd1c","updated":"2023-01-12 18:49:30.000000000","message":"What is the eval order of these case statements? With the if/else if/... blocks I can get away with only speccing the upper range end instead of both by having them in order.","commit_id":"ad38757af012319a2645549eebd3140f9eafe755"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"b53b252982b4b2707fe1929962b59e92d9d6639b","unresolved":false,"context_lines":[{"line_number":89,"context_line":"\t\tcopy(outBuf[1:5], c.Request)"},{"line_number":90,"context_line":"\t\toutBuf[5] \u003d c.Control"},{"line_number":91,"context_line":"\t\treturn outBuf, nil"},{"line_number":92,"context_line":"\t} else if c.OperationCode \u003c 0x60 {"},{"line_number":93,"context_line":"\t\t// Use CDB10 as defined in Table 5"},{"line_number":94,"context_line":"\t\tif len(c.Request) !\u003d 8 {"},{"line_number":95,"context_line":"\t\t\treturn nil, fmt.Errorf(\"CDB10 request size is %d bytes, needs to be 4 bytes\", len(c.Request))"}],"source_content_type":"text/x-go","patch_set":1,"id":"a1dfff80_71d6484a","line":92,"range":{"start_line":92,"start_character":3,"end_line":92,"end_character":10},"in_reply_to":"8055d3b3_c329c97e","updated":"2023-01-18 14:21:28.000000000","message":"Done","commit_id":"ad38757af012319a2645549eebd3140f9eafe755"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"ca33f3811b5b89335fb8f9941e101eff923f754c","unresolved":true,"context_lines":[{"line_number":204,"context_line":"}"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"// IsType checks if the ASK portion of a is the same as the ASK portion of b."},{"line_number":207,"context_line":"func (a AdditionalSenseCode) IsType(b AdditionalSenseCode) bool {"},{"line_number":208,"context_line":"\treturn a.ASK() \u003d\u003d b.ASK()"},{"line_number":209,"context_line":"}"},{"line_number":210,"context_line":""}],"source_content_type":"text/x-go","patch_set":1,"id":"fdb28873_7b0904ad","line":207,"range":{"start_line":207,"start_character":29,"end_line":207,"end_character":35},"updated":"2023-01-12 12:10:58.000000000","message":"Maybe IsKey to make it clear that this only checks the key, not qualifier part of the ASC?","commit_id":"ad38757af012319a2645549eebd3140f9eafe755"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"86dc755ab00c74d89cc22f23066a06790d5e39b7","unresolved":false,"context_lines":[{"line_number":204,"context_line":"}"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"// IsType checks if the ASK portion of a is the same as the ASK portion of b."},{"line_number":207,"context_line":"func (a AdditionalSenseCode) IsType(b AdditionalSenseCode) bool {"},{"line_number":208,"context_line":"\treturn a.ASK() \u003d\u003d b.ASK()"},{"line_number":209,"context_line":"}"},{"line_number":210,"context_line":""}],"source_content_type":"text/x-go","patch_set":1,"id":"f756f8dc_58f44706","line":207,"range":{"start_line":207,"start_character":29,"end_line":207,"end_character":35},"in_reply_to":"fdb28873_7b0904ad","updated":"2023-01-12 18:49:30.000000000","message":"Done","commit_id":"ad38757af012319a2645549eebd3140f9eafe755"}]}
