]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ata: libata-core: Remove support for decreasing the number of ports
authorNiklas Cassel <cassel@kernel.org>
Wed, 3 Jul 2024 18:44:20 +0000 (20:44 +0200)
committerNiklas Cassel <cassel@kernel.org>
Thu, 4 Jul 2024 09:52:32 +0000 (11:52 +0200)
Commit f31871951b38 ("libata: separate out ata_host_alloc() and
ata_host_register()") added ata_host_alloc(), where the API allowed
a LLD to overallocate the number of ports supplied to ata_host_alloc(),
as long as the LLD decreased host->n_ports before calling
ata_host_register().

However, this functionally has never ever been used by a single LLD.

Because of the current API design, the assignment of ap->print_id is
deferred until registration time, which is bad, because that means that
the ata_port_*() print functions cannot be used by a LLD until after
registration time, which means that a LLD is forced to use a print
function that is non-port specific, even for a port specific error.

Remove the support for decreasing the number of ports, such that it will
be possible to assign ap->print_id earlier.

Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Link: https://lore.kernel.org/r/20240703184418.723066-14-cassel@kernel.org
Signed-off-by: Niklas Cassel <cassel@kernel.org>
drivers/ata/libata-core.c
include/linux/libata.h

index 949662bc50e4676554c925cd4ff597756a3474ab..d2d397964be46e332bffe968927b23a98277de60 100644 (file)
@@ -5555,24 +5555,19 @@ EXPORT_SYMBOL_GPL(ata_host_put);
 /**
  *     ata_host_alloc - allocate and init basic ATA host resources
  *     @dev: generic device this host is associated with
- *     @max_ports: maximum number of ATA ports associated with this host
+ *     @n_ports: the number of ATA ports associated with this host
  *
  *     Allocate and initialize basic ATA host resources.  LLD calls
  *     this function to allocate a host, initializes it fully and
  *     attaches it using ata_host_register().
  *
- *     @max_ports ports are allocated and host->n_ports is
- *     initialized to @max_ports.  The caller is allowed to decrease
- *     host->n_ports before calling ata_host_register().  The unused
- *     ports will be automatically freed on registration.
- *
  *     RETURNS:
  *     Allocate ATA host on success, NULL on failure.
  *
  *     LOCKING:
  *     Inherited from calling layer (may sleep).
  */
-struct ata_host *ata_host_alloc(struct device *dev, int max_ports)
+struct ata_host *ata_host_alloc(struct device *dev, int n_ports)
 {
        struct ata_host *host;
        size_t sz;
@@ -5580,7 +5575,7 @@ struct ata_host *ata_host_alloc(struct device *dev, int max_ports)
        void *dr;
 
        /* alloc a container for our list of ATA ports (buses) */
-       sz = sizeof(struct ata_host) + (max_ports + 1) * sizeof(void *);
+       sz = sizeof(struct ata_host) + n_ports * sizeof(void *);
        host = kzalloc(sz, GFP_KERNEL);
        if (!host)
                return NULL;
@@ -5600,11 +5595,11 @@ struct ata_host *ata_host_alloc(struct device *dev, int max_ports)
        spin_lock_init(&host->lock);
        mutex_init(&host->eh_mutex);
        host->dev = dev;
-       host->n_ports = max_ports;
+       host->n_ports = n_ports;
        kref_init(&host->kref);
 
        /* allocate ports bound to this host */
-       for (i = 0; i < max_ports; i++) {
+       for (i = 0; i < n_ports; i++) {
                struct ata_port *ap;
 
                ap = ata_port_alloc(host);
@@ -5913,13 +5908,6 @@ int ata_host_register(struct ata_host *host, const struct scsi_host_template *sh
                return -EINVAL;
        }
 
-       /* Blow away unused ports.  This happens when LLD can't
-        * determine the exact number of ports to allocate at
-        * allocation time.
-        */
-       for (i = host->n_ports; host->ports[i]; i++)
-               ata_port_free(host->ports[i]);
-
        /* give ports names and add SCSI hosts */
        for (i = 0; i < host->n_ports; i++) {
                host->ports[i]->print_id = atomic_inc_return(&ata_print_id);
index 580971e118042151f6bb23ef8889fdede2f0cfa6..b7c5d3f333686abdcbb2edb693a4795fe6cafaec 100644 (file)
@@ -1069,7 +1069,7 @@ extern int sata_std_hardreset(struct ata_link *link, unsigned int *class,
                              unsigned long deadline);
 extern void ata_std_postreset(struct ata_link *link, unsigned int *classes);
 
-extern struct ata_host *ata_host_alloc(struct device *dev, int max_ports);
+extern struct ata_host *ata_host_alloc(struct device *dev, int n_ports);
 extern struct ata_host *ata_host_alloc_pinfo(struct device *dev,
                        const struct ata_port_info * const * ppi, int n_ports);
 extern void ata_host_get(struct ata_host *host);