diff options
Diffstat (limited to 'drivers/block/loop/loop_file_fmt_raw.c')
-rw-r--r-- | drivers/block/loop/loop_file_fmt_raw.c | 47 |
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 = { |