X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=drivers%2Ftarget%2Ftarget_core_hba.c;h=be9cefc07407e80ef5dd7dfcbd8a0d025faf97f6;hb=df5c79e982b38eec1d184668d66f9ce0c426e2a1;hp=62ea4e8e70a8935398f2a0e86fc44627dfa3368e;hpb=cd369c2239dd08c273c0fafbbea44e3e0c509ebd;p=deliverable%2Flinux.git diff --git a/drivers/target/target_core_hba.c b/drivers/target/target_core_hba.c index 62ea4e8e70a8..be9cefc07407 100644 --- a/drivers/target/target_core_hba.c +++ b/drivers/target/target_core_hba.c @@ -84,8 +84,16 @@ void target_backend_unregister(const struct target_backend_ops *ops) list_for_each_entry(tb, &backend_list, list) { if (tb->ops == ops) { list_del(&tb->list); + mutex_unlock(&backend_mutex); + /* + * Wait for any outstanding backend driver ->rcu_head + * callbacks to complete post TBO->free_device() -> + * call_rcu(), before allowing backend driver module + * unload of target_backend_ops->owner to proceed. + */ + rcu_barrier(); kfree(tb); - break; + return; } } mutex_unlock(&backend_mutex);