spin_lock() might lead to deadlock issues. Consider a case where process acquires lock for critical section and a software interrupt arrives on same CPU which also tries to acquire the same lock which process have. This is case of deadlock where none process can move forward. Hence we require that when spinlock acquired on CPU, local software interrupts should be disabled. This is done by spin_lock_bh().
Hence when a data structure is shared between a process context and bottom half, it is secured by spin_lock_bh().
However, sharing of data structure between process context and bottom half is not recommended unless extremely necessary to do. Per-cpu variables could be a replacement to avoid locking.