summaryrefslogtreecommitdiffstats
path: root/drivers/block/loop/loop_file_fmt_raw.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/block/loop/loop_file_fmt_raw.c')
-rw-r--r--drivers/block/loop/loop_file_fmt_raw.c47
1 files changed, 29 insertions, 18 deletions
diff --git a/drivers/block/loop/loop_file_fmt_raw.c b/drivers/block/loop/loop_file_fmt_raw.c
index 01e003be83c1..d3c8743de5d2 100644
--- a/drivers/block/loop/loop_file_fmt_raw.c
+++ b/drivers/block/loop/loop_file_fmt_raw.c
@@ -4,7 +4,7 @@
*
* RAW file format driver for the loop device module.
*
- * Copyright (C) 2019 Manuel Bentele
+ * Copyright (C) 2019 Manuel Bentele <development@manuel-bentele.de>
*/
#include <linux/module.h>
@@ -22,16 +22,6 @@
#include "loop_file_fmt.h"
-static int raw_file_fmt_init(struct loop_file_fmt *lo_fmt)
-{
- return 0;
-}
-
-static void raw_file_fmt_exit(struct loop_file_fmt *lo_fmt)
-{
- return;
-}
-
static inline loff_t __raw_file_fmt_rq_get_pos(struct loop_file_fmt *lo_fmt,
struct request *rq)
{
@@ -84,8 +74,6 @@ static int raw_file_fmt_read_transfer(struct loop_file_fmt *lo_fmt,
int ret = 0;
loff_t pos;
- printk(KERN_INFO "loop_file_fmt_raw: raw_file_fmt_read()");
-
page = alloc_page(GFP_NOIO);
if (unlikely(!page))
return -ENOMEM;
@@ -395,8 +383,7 @@ static int raw_file_fmt_discard(struct loop_file_fmt *lo_fmt,
return ret;
}
-static int raw_file_fmt_flush(struct loop_file_fmt *lo_fmt,
- struct request *rq)
+static int raw_file_fmt_flush(struct loop_file_fmt *lo_fmt)
{
struct loop_device *lo = loop_file_fmt_get_lo(lo_fmt);
struct file *file = lo->lo_backing_file;
@@ -407,15 +394,39 @@ static int raw_file_fmt_flush(struct loop_file_fmt *lo_fmt,
return ret;
}
+static loff_t raw_file_fmt_sector_size(struct loop_file_fmt *lo_fmt)
+{
+ struct loop_device *lo = loop_file_fmt_get_lo(lo_fmt);
+ loff_t loopsize;
+
+ /* Compute loopsize in bytes */
+ loopsize = i_size_read(lo->lo_backing_file->f_mapping->host);
+ if (lo->lo_offset > 0)
+ loopsize -= lo->lo_offset;
+ /* offset is beyond i_size, weird but possible */
+ if (loopsize < 0)
+ return 0;
+
+ if (lo->lo_sizelimit > 0 && lo->lo_sizelimit < loopsize)
+ loopsize = lo->lo_sizelimit;
+
+ /*
+ * Unfortunately, if we want to do I/O on the device,
+ * the number of 512-byte sectors has to fit into a sector_t.
+ */
+ return loopsize >> 9;
+}
+
static struct loop_file_fmt_ops raw_file_fmt_ops = {
- .init = raw_file_fmt_init,
- .exit = raw_file_fmt_exit,
+ .init = NULL,
+ .exit = NULL,
.read = raw_file_fmt_read,
.write = raw_file_fmt_write,
.read_aio = raw_file_fmt_read_aio,
.write_aio = raw_file_fmt_write_aio,
.discard = raw_file_fmt_discard,
- .flush = raw_file_fmt_flush
+ .flush = raw_file_fmt_flush,
+ .sector_size = raw_file_fmt_sector_size
};
static struct loop_file_fmt_driver raw_file_fmt_driver = {