diff options
| -rw-r--r-- | drivers/mtd/mtd_blkdevs.c | 1 | ||||
| -rw-r--r-- | drivers/mtd/mtdblock.c | 8 | ||||
| -rw-r--r-- | include/linux/mtd/blktrans.h | 1 | 
3 files changed, 8 insertions, 2 deletions
diff --git a/drivers/mtd/mtd_blkdevs.c b/drivers/mtd/mtd_blkdevs.c index 424ca5f93c6..f1f06715d4e 100644 --- a/drivers/mtd/mtd_blkdevs.c +++ b/drivers/mtd/mtd_blkdevs.c @@ -233,6 +233,7 @@ static int blktrans_open(struct block_device *bdev, fmode_t mode)  	ret = __get_mtd_device(dev->mtd);  	if (ret)  		goto error_release; +	dev->file_mode = mode;  unlock:  	dev->open++; diff --git a/drivers/mtd/mtdblock.c b/drivers/mtd/mtdblock.c index af6591237b9..6c6d80736fa 100644 --- a/drivers/mtd/mtdblock.c +++ b/drivers/mtd/mtdblock.c @@ -321,8 +321,12 @@ static int mtdblock_release(struct mtd_blktrans_dev *mbd)  	mutex_unlock(&mtdblk->cache_mutex);  	if (!--mtdblk->count) { -		/* It was the last usage. Free the cache */ -		mtd_sync(mbd->mtd); +		/* +		 * It was the last usage. Free the cache, but only sync if +		 * opened for writing. +		 */ +		if (mbd->file_mode & FMODE_WRITE) +			mtd_sync(mbd->mtd);  		vfree(mtdblk->cache_data);  	} diff --git a/include/linux/mtd/blktrans.h b/include/linux/mtd/blktrans.h index 1bbd9f28924..ed270bd2e4d 100644 --- a/include/linux/mtd/blktrans.h +++ b/include/linux/mtd/blktrans.h @@ -47,6 +47,7 @@ struct mtd_blktrans_dev {  	struct request_queue *rq;  	spinlock_t queue_lock;  	void *priv; +	fmode_t file_mode;  };  struct mtd_blktrans_ops {  |