[Devel] [PATCH RH7 v2 1/2] ploop: Add statistics of fastmap requests, which fails because of cache

Kirill Tkhai ktkhai at virtuozzo.com
Mon Nov 9 13:25:34 MSK 2020


Normally, mapping_needs_writeback() should not be true. But in case
of some problem, or userspace touch root.hds without direct mode,
cache may populate. Count such the failed fastmaps.

Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
 drivers/block/ploop/io_kaio.c    |    2 ++
 fs/ext4/file.c                   |    5 ++++-
 include/linux/ploop/ploop_stat.h |    1 +
 3 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/drivers/block/ploop/io_kaio.c b/drivers/block/ploop/io_kaio.c
index 4c4a0c6a908c..be74b2ec344f 100644
--- a/drivers/block/ploop/io_kaio.c
+++ b/drivers/block/ploop/io_kaio.c
@@ -1236,6 +1236,8 @@ kaio_fastmap(struct ploop_io *io, struct bio *orig_bio,
 				   orig_bio->bi_rw & REQ_WRITE);
 	if (ret < 0) {
 		io->plo->st.fast_neg_noem++;
+		if (ret == -EBUSY)
+			io->plo->st.write_back_pending++;
 		return 1;
 	}
 
diff --git a/fs/ext4/file.c b/fs/ext4/file.c
index 8f5fb6d99d5e..67a385e9f716 100644
--- a/fs/ext4/file.c
+++ b/fs/ext4/file.c
@@ -132,6 +132,7 @@ static int ext4_fastmap(struct inode *inode, sector_t lblk_sec,
 	bool unaligned_aio, found, locked = false;
 	struct ext4_map_blocks map;
 	loff_t pos = lblk_sec << 9;
+	int err;
 
 	if (!S_ISREG(inode->i_mode))
 		return -ENOENT;
@@ -152,6 +153,7 @@ static int ext4_fastmap(struct inode *inode, sector_t lblk_sec,
 		locked = true;
 	}
 
+	err = -EBUSY;
 	if (unlikely(mapping_needs_writeback(mapping)))
 		goto err_maybe_unlock;
 
@@ -163,6 +165,7 @@ static int ext4_fastmap(struct inode *inode, sector_t lblk_sec,
 		locked = false;
 	}
 
+	err = -ENOENT;
 	if (unlikely(ext4_test_inode_state(inode,
 				EXT4_STATE_DIOREAD_LOCK))) {
 		goto err_dio_end;
@@ -181,7 +184,7 @@ static int ext4_fastmap(struct inode *inode, sector_t lblk_sec,
 err_maybe_unlock:
 	if (locked)
 		mutex_unlock(&inode->i_mutex);
-	return -ENOENT;
+	return err;
 }
 
 static ssize_t ext4_write_checks(struct kiocb *iocb, struct iov_iter *iter, loff_t *pos)
diff --git a/include/linux/ploop/ploop_stat.h b/include/linux/ploop/ploop_stat.h
index bed910acb39c..92543a9afe88 100644
--- a/include/linux/ploop/ploop_stat.h
+++ b/include/linux/ploop/ploop_stat.h
@@ -34,6 +34,7 @@ __DO(merge_neg_cluster)
 __DO(merge_neg_disable)
 __DO(fast_neg_nomap)
 __DO(fast_neg_noem)
+__DO(write_back_pending)
 __DO(fast_neg_shortem)
 __DO(fast_neg_backing)
 __DO(bio_lockouts)




More information about the Devel mailing list