Hello, Komuro.

Komuro wrote:
> Hi, Tejun
> 
> The patch below fixes the pata_pcmcia problem.
> 
> I think the ap->lock points to bogus address.
> 
> Any comment?
> 
> --- linux-2.6.26-rc8/drivers/ata/libata-core.c.orig   2008-07-06 
> 10:05:46.000000000 +0900
> +++ linux-2.6.26-rc8/drivers/ata/libata-core.c        2008-07-06 
> 10:09:16.000000000 +0900
> @@ -5304,6 +5304,8 @@ struct ata_host *ata_host_alloc(struct d
>                       goto err_out;
>  
>               ap->port_no = i;
> +             ap->lock = &ap->__lock;
> +             spin_lock_init(ap->lock);
>               host->ports[i] = ap;
>       }
>  
> --- linux-2.6.26-rc8/include/linux/libata.h.orig      2008-07-06 
> 10:03:54.000000000 +0900
> +++ linux-2.6.26-rc8/include/linux/libata.h   2008-07-06 10:04:35.000000000 
> +0900
> @@ -639,6 +639,7 @@ struct ata_port {
>       struct Scsi_Host        *scsi_host; /* our co-allocated scsi host */
>       struct ata_port_operations *ops;
>       spinlock_t              *lock;
> +     spinlock_t              __lock;
>       unsigned long           flags;  /* ATA_FLAG_xxx */
>       unsigned int            pflags; /* ATA_PFLAG_xxx */
>       unsigned int            print_id; /* user visible unique port ID */

Hmmm... Strange.  From ata_port_alloc(),

struct ata_port *ata_port_alloc(struct ata_host *host)
{
        struct ata_port *ap;

        DPRINTK("ENTER\n");

        ap = kzalloc(sizeof(*ap), GFP_KERNEL);
        if (!ap)
                return NULL;

        ap->pflags |= ATA_PFLAG_INITIALIZING;
        ap->lock = &host->lock;
        ^^^^^^^^^^^^^^^^^^^^^^^

How come ap->lock can get set to bogus address?  Can you please printk
&host->lock and ap->lock after ata_host_alloc() without the patch?

Thanks.

-- 
tejun

_______________________________________________
Linux PCMCIA reimplementation list
http://lists.infradead.org/mailman/listinfo/linux-pcmcia

Reply via email to