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);
|
||||
if (ret)
|
||||
goto error_release;
|
||||
dev->file_mode = mode;
|
||||
|
||||
unlock:
|
||||
dev->open++;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue