in core/ms_block.c [2244:2301]
static int msb_resume(struct memstick_dev *card)
{
struct msb_data *msb = memstick_get_drvdata(card);
struct msb_data *new_msb = NULL;
bool card_dead = true;
#ifndef CONFIG_MEMSTICK_UNSAFE_RESUME
msb->card_dead = true;
return 0;
#endif
mutex_lock(&card->host->lock);
new_msb = kzalloc(sizeof(struct msb_data), GFP_KERNEL);
if (!new_msb)
goto out;
new_msb->card = card;
memstick_set_drvdata(card, new_msb);
spin_lock_init(&new_msb->q_lock);
sg_init_table(msb->prealloc_sg, MS_BLOCK_MAX_SEGS+1);
if (msb_init_card(card))
goto out;
if (msb->block_size != new_msb->block_size)
goto out;
if (memcmp(msb->boot_page, new_msb->boot_page,
sizeof(struct ms_boot_page)))
goto out;
if (msb->logical_block_count != new_msb->logical_block_count ||
memcmp(msb->lba_to_pba_table, new_msb->lba_to_pba_table,
msb->logical_block_count))
goto out;
if (msb->block_count != new_msb->block_count ||
memcmp(msb->used_blocks_bitmap, new_msb->used_blocks_bitmap,
msb->block_count / 8))
goto out;
card_dead = false;
out:
if (card_dead)
dbg("Card was removed/replaced during suspend");
msb->card_dead = card_dead;
memstick_set_drvdata(card, msb);
if (new_msb) {
msb_data_clear(new_msb);
kfree(new_msb);
}
msb_start(card);
mutex_unlock(&card->host->lock);
return 0;
}