static int card_blk_open(struct block_device *bdev, fmode_t mode)
{
	struct card_blk_data *card_data;
	int ret = -ENXIO;

	card_data = card_blk_get(bdev->bd_disk);
	if (card_data) {
		if (card_data->usage == 2)
			check_disk_change(bdev);
		ret = 0;

             /* 
               * it would return -EROFS when FS/USB open card with O_RDWR. 
               * set sd_mmc_info->write_protected_flag in func sd_mmc_check_wp
               * set card->state |= CARD_STATE_READONLY in func sd_open
               * set card_data->read_only = 1 in func card_blk_alloc
               */
		if ((mode & FMODE_WRITE) && card_data->read_only){
                             card_blk_put(bdev->bd_disk->private_data);
			ret = -EROFS;
                   }
	}

	return ret;
}
static int card_blk_open(struct block_device *bdev, fmode_t mode)
{
	struct card_blk_data *card_data;
	int ret = -ENXIO;

	card_data = card_blk_get(bdev->bd_disk);
	if (card_data) {
		if (card_data->usage == 2)
			check_disk_change(bdev);
		ret = 0;

		if ((mode & FMODE_WRITE) && card_data->read_only)
			ret = -EROFS;
	}

	return ret;
}