Loading Documentation/pcmcia/locking.txt +3 −2 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ be called with "ops_mutex" held: socket_setup() struct pccard_operations *ops struct pccard_resource_ops *resource_ops; Note that send_event() and struct pcmcia_callback *callback must not be called with "ops_mutex" held. Loading @@ -54,7 +55,7 @@ protected by pcmcia_socket_list_rwsem; 2. Per-Socket Data: ------------------- The resource_ops are on their own to provide proper locking. The resource_ops and their data are protected by ops_mutex. The "main" struct pcmcia_socket is protected as follows (read-only fields or single-use fields not mentioned): Loading drivers/pcmcia/cs.c +6 −1 Original line number Diff line number Diff line Loading @@ -224,7 +224,9 @@ int pcmcia_register_socket(struct pcmcia_socket *socket) spin_lock_init(&socket->thread_lock); if (socket->resource_ops->init) { mutex_lock(&socket->ops_mutex); ret = socket->resource_ops->init(socket); mutex_unlock(&socket->ops_mutex); if (ret) goto err; } Loading Loading @@ -282,8 +284,11 @@ void pcmcia_unregister_socket(struct pcmcia_socket *socket) up_write(&pcmcia_socket_list_rwsem); /* wait for sysfs to drop all references */ if (socket->resource_ops->exit) if (socket->resource_ops->exit) { mutex_lock(&socket->ops_mutex); socket->resource_ops->exit(socket); mutex_unlock(&socket->ops_mutex); } wait_for_completion(&socket->socket_released); } /* pcmcia_unregister_socket */ EXPORT_SYMBOL(pcmcia_unregister_socket); Loading drivers/pcmcia/ds.c +5 −1 Original line number Diff line number Diff line Loading @@ -607,19 +607,23 @@ static int pcmcia_card_add(struct pcmcia_socket *s) { cistpl_longlink_mfc_t mfc; unsigned int no_funcs, i, no_chains; int ret = 0; int ret = -EAGAIN; mutex_lock(&s->ops_mutex); if (!(s->resource_setup_done)) { dev_dbg(&s->dev, "no resources available, delaying card_add\n"); mutex_unlock(&s->ops_mutex); return -EAGAIN; /* try again, but later... */ } if (pcmcia_validate_mem(s)) { dev_dbg(&s->dev, "validating mem resources failed, " "delaying card_add\n"); mutex_unlock(&s->ops_mutex); return -EAGAIN; /* try again, but later... */ } mutex_unlock(&s->ops_mutex); ret = pccard_validate_cis(s, &no_chains); if (ret || !no_chains) { Loading drivers/pcmcia/pcmcia_ioctl.c +1 −3 Original line number Diff line number Diff line Loading @@ -187,7 +187,6 @@ static int pcmcia_adjust_resource_info(adjust_t *adj) continue; } else if (!(s->resource_setup_old)) s->resource_setup_old = 1; mutex_unlock(&s->ops_mutex); switch (adj->Resource) { case RES_MEMORY_RANGE: Loading @@ -206,10 +205,9 @@ static int pcmcia_adjust_resource_info(adjust_t *adj) * last call to adjust_resource_info, we * always need to assume this is the latest * one... */ mutex_lock(&s->ops_mutex); s->resource_setup_done = 1; mutex_unlock(&s->ops_mutex); } mutex_unlock(&s->ops_mutex); } } up_read(&pcmcia_socket_list_rwsem); Loading drivers/pcmcia/rsrc_mgr.c +0 −2 Original line number Diff line number Diff line Loading @@ -26,9 +26,7 @@ static int static_init(struct pcmcia_socket *s) /* the good thing about SS_CAP_STATIC_MAP sockets is * that they don't need a resource database */ mutex_lock(&s->ops_mutex); s->resource_setup_done = 1; mutex_unlock(&s->ops_mutex); return 0; } Loading Loading
Documentation/pcmcia/locking.txt +3 −2 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ be called with "ops_mutex" held: socket_setup() struct pccard_operations *ops struct pccard_resource_ops *resource_ops; Note that send_event() and struct pcmcia_callback *callback must not be called with "ops_mutex" held. Loading @@ -54,7 +55,7 @@ protected by pcmcia_socket_list_rwsem; 2. Per-Socket Data: ------------------- The resource_ops are on their own to provide proper locking. The resource_ops and their data are protected by ops_mutex. The "main" struct pcmcia_socket is protected as follows (read-only fields or single-use fields not mentioned): Loading
drivers/pcmcia/cs.c +6 −1 Original line number Diff line number Diff line Loading @@ -224,7 +224,9 @@ int pcmcia_register_socket(struct pcmcia_socket *socket) spin_lock_init(&socket->thread_lock); if (socket->resource_ops->init) { mutex_lock(&socket->ops_mutex); ret = socket->resource_ops->init(socket); mutex_unlock(&socket->ops_mutex); if (ret) goto err; } Loading Loading @@ -282,8 +284,11 @@ void pcmcia_unregister_socket(struct pcmcia_socket *socket) up_write(&pcmcia_socket_list_rwsem); /* wait for sysfs to drop all references */ if (socket->resource_ops->exit) if (socket->resource_ops->exit) { mutex_lock(&socket->ops_mutex); socket->resource_ops->exit(socket); mutex_unlock(&socket->ops_mutex); } wait_for_completion(&socket->socket_released); } /* pcmcia_unregister_socket */ EXPORT_SYMBOL(pcmcia_unregister_socket); Loading
drivers/pcmcia/ds.c +5 −1 Original line number Diff line number Diff line Loading @@ -607,19 +607,23 @@ static int pcmcia_card_add(struct pcmcia_socket *s) { cistpl_longlink_mfc_t mfc; unsigned int no_funcs, i, no_chains; int ret = 0; int ret = -EAGAIN; mutex_lock(&s->ops_mutex); if (!(s->resource_setup_done)) { dev_dbg(&s->dev, "no resources available, delaying card_add\n"); mutex_unlock(&s->ops_mutex); return -EAGAIN; /* try again, but later... */ } if (pcmcia_validate_mem(s)) { dev_dbg(&s->dev, "validating mem resources failed, " "delaying card_add\n"); mutex_unlock(&s->ops_mutex); return -EAGAIN; /* try again, but later... */ } mutex_unlock(&s->ops_mutex); ret = pccard_validate_cis(s, &no_chains); if (ret || !no_chains) { Loading
drivers/pcmcia/pcmcia_ioctl.c +1 −3 Original line number Diff line number Diff line Loading @@ -187,7 +187,6 @@ static int pcmcia_adjust_resource_info(adjust_t *adj) continue; } else if (!(s->resource_setup_old)) s->resource_setup_old = 1; mutex_unlock(&s->ops_mutex); switch (adj->Resource) { case RES_MEMORY_RANGE: Loading @@ -206,10 +205,9 @@ static int pcmcia_adjust_resource_info(adjust_t *adj) * last call to adjust_resource_info, we * always need to assume this is the latest * one... */ mutex_lock(&s->ops_mutex); s->resource_setup_done = 1; mutex_unlock(&s->ops_mutex); } mutex_unlock(&s->ops_mutex); } } up_read(&pcmcia_socket_list_rwsem); Loading
drivers/pcmcia/rsrc_mgr.c +0 −2 Original line number Diff line number Diff line Loading @@ -26,9 +26,7 @@ static int static_init(struct pcmcia_socket *s) /* the good thing about SS_CAP_STATIC_MAP sockets is * that they don't need a resource database */ mutex_lock(&s->ops_mutex); s->resource_setup_done = 1; mutex_unlock(&s->ops_mutex); return 0; } Loading