mtd: mtdblock: call mtd_sync() only if opened for write
Because it is useless to call it if the device is opened in R/O mode, and also harmful: on CFI NOR flash it may block for long time waiting for erase operations to complete is another partition with a R/W file-system on this chip. Artem Bityutskiy: write commit message, amend the patch to match the latest tree (we use mtd_sync(), not mtd->sync() nowadays). Signed-off-by: Alexander Stein <alexander.stein@systec-electronic.com> Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
This commit is contained in:
parent
2ff5e1532d
commit
70d5098a4b
|
@ -233,6 +233,7 @@ static int blktrans_open(struct block_device *bdev, fmode_t mode)
|
||||||
ret = __get_mtd_device(dev->mtd);
|
ret = __get_mtd_device(dev->mtd);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto error_release;
|
goto error_release;
|
||||||
|
dev->file_mode = mode;
|
||||||
|
|
||||||
unlock:
|
unlock:
|
||||||
dev->open++;
|
dev->open++;
|
||||||
|
|
|
@ -321,8 +321,12 @@ static int mtdblock_release(struct mtd_blktrans_dev *mbd)
|
||||||
mutex_unlock(&mtdblk->cache_mutex);
|
mutex_unlock(&mtdblk->cache_mutex);
|
||||||
|
|
||||||
if (!--mtdblk->count) {
|
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);
|
vfree(mtdblk->cache_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -47,6 +47,7 @@ struct mtd_blktrans_dev {
|
||||||
struct request_queue *rq;
|
struct request_queue *rq;
|
||||||
spinlock_t queue_lock;
|
spinlock_t queue_lock;
|
||||||
void *priv;
|
void *priv;
|
||||||
|
fmode_t file_mode;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mtd_blktrans_ops {
|
struct mtd_blktrans_ops {
|
||||||
|
|
Reference in New Issue