]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
scsi: target: spc: Fix loop traversal in spc_rsoc_get_descr()
authorChaohai Chen <wdhh66@163.com>
Fri, 24 Jan 2025 08:55:42 +0000 (16:55 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 29 May 2025 09:13:29 +0000 (11:13 +0200)
[ Upstream commit 04ad06e41d1c74cc323b20a7bd023c47bd0e0c38 ]

Stop traversing after finding the appropriate descriptor.

Signed-off-by: Chaohai Chen <wdhh66@163.com>
Link: https://lore.kernel.org/r/20250124085542.109088-1-wdhh66@163.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/target/target_core_spc.c

index 785a97536212ba1faff7054e48307ccf9585db5b..0a02492bef701ca3834ebe87059696f1e384f4d3 100644 (file)
@@ -2151,8 +2151,10 @@ spc_rsoc_get_descr(struct se_cmd *cmd, struct target_opcode_descriptor **opcode)
                        if (descr->serv_action_valid)
                                return TCM_INVALID_CDB_FIELD;
 
-                       if (!descr->enabled || descr->enabled(descr, cmd))
+                       if (!descr->enabled || descr->enabled(descr, cmd)) {
                                *opcode = descr;
+                               return TCM_NO_SENSE;
+                       }
                        break;
                case 0x2:
                        /*
@@ -2166,8 +2168,10 @@ spc_rsoc_get_descr(struct se_cmd *cmd, struct target_opcode_descriptor **opcode)
                        if (descr->serv_action_valid &&
                            descr->service_action == requested_sa) {
                                if (!descr->enabled || descr->enabled(descr,
-                                                                     cmd))
+                                                                     cmd)) {
                                        *opcode = descr;
+                                       return TCM_NO_SENSE;
+                               }
                        } else if (!descr->serv_action_valid)
                                return TCM_INVALID_CDB_FIELD;
                        break;
@@ -2180,13 +2184,15 @@ spc_rsoc_get_descr(struct se_cmd *cmd, struct target_opcode_descriptor **opcode)
                         */
                        if (descr->service_action == requested_sa)
                                if (!descr->enabled || descr->enabled(descr,
-                                                                     cmd))
+                                                                     cmd)) {
                                        *opcode = descr;
+                                       return TCM_NO_SENSE;
+                               }
                        break;
                }
        }
 
-       return 0;
+       return TCM_NO_SENSE;
 }
 
 static sense_reason_t