2291 lines · 57.8 KB · C
RawDownload
/* *  linux/drivers/block/loop.c * *  Written by Theodore Ts'o, 3/29/93 * * Copyright 1993 by Theodore Ts'o.  Redistribution of this file is * permitted under the GNU General Public License. * * DES encryption plus some minor changes by Werner Almesberger, 30-MAY-1993 * more DES encryption plus IDEA encryption by Nicholas J. Leon, June 20, 1996 * * Modularized and updated for 1.1.16 kernel - Mitch Dsouza 28th May 1994 * Adapted for 1.3.59 kernel - Andries Brouwer, 1 Feb 1996 * * Fixed do_loop_request() re-entrancy - Vincent.Renardias@waw.com Mar 20, 1997 * * Added devfs support - Richard Gooch <rgooch@atnf.csiro.au> 16-Jan-1998 * * Handle sparse backing files correctly - Kenn Humborg, Jun 28, 1998 * * Loadable modules and other fixes by AK, 1998 * * Make real block number available to downstream transfer functions, enables * CBC (and relatives) mode encryption requiring unique IVs per data block. * Reed H. Petty, rhp@draper.net * * Maximum number of loop devices now dynamic via max_loop module parameter. * Russell Kroll <rkroll@exploits.org> 19990701 * * Maximum number of loop devices when compiled-in now selectable by passing * max_loop=<1-255> to the kernel on boot. * Erik I. Bolsø, <eriki@himolde.no>, Oct 31, 1999 * * Completely rewrite request handling to be make_request_fn style and * non blocking, pushing work to a helper thread. Lots of fixes from * Al Viro too. * Jens Axboe <axboe@suse.de>, Nov 2000 * * Support up to 256 loop devices * Heinz Mauelshagen <mge@sistina.com>, Feb 2002 * * Support for falling back on the write file operation when the address space * operations write_begin is not available on the backing filesystem. * Anton Altaparmakov, 16 Feb 2005 * * Still To Fix: * - Advisory locking is ignored here. * - Should use an own CAP_* category instead of CAP_SYS_ADMIN * */ #include <linux/module.h>#include <linux/moduleparam.h>#include <linux/sched.h>#include <linux/fs.h>#include <linux/pagemap.h>#include <linux/file.h>#include <linux/stat.h>#include <linux/errno.h>#include <linux/major.h>#include <linux/wait.h>#include <linux/blkdev.h>#include <linux/blkpg.h>#include <linux/init.h>#include <linux/swap.h>#include <linux/slab.h>#include <linux/compat.h>#include <linux/suspend.h>#include <linux/freezer.h>#include <linux/mutex.h>#include <linux/writeback.h>#include <linux/completion.h>#include <linux/highmem.h>#include <linux/splice.h>#include <linux/sysfs.h>#include <linux/miscdevice.h>#include <linux/falloc.h>#include <linux/uio.h>#include <linux/ioprio.h>#include <linux/blk-cgroup.h>#include <linux/sched/mm.h>#include <linux/statfs.h> #include "loop.h" #include <linux/uaccess.h> #define LOOP_IDLE_WORKER_TIMEOUT (60 * HZ) static DEFINE_IDR(loop_index_idr);static DEFINE_MUTEX(loop_ctl_mutex);static DEFINE_MUTEX(loop_validate_mutex); /** * loop_global_lock_killable() - take locks for safe loop_validate_file() test * * @lo: struct loop_device * @global: true if @lo is about to bind another "struct loop_device", false otherwise * * Returns 0 on success, -EINTR otherwise. * * Since loop_validate_file() traverses on other "struct loop_device" if * is_loop_device() is true, we need a global lock for serializing concurrent * loop_configure()/loop_change_fd()/__loop_clr_fd() calls. */static int loop_global_lock_killable(struct loop_device *lo, bool global){	int err; 	if (global) {		err = mutex_lock_killable(&loop_validate_mutex);		if (err)			return err;	}	err = mutex_lock_killable(&lo->lo_mutex);	if (err && global)		mutex_unlock(&loop_validate_mutex);	return err;} /** * loop_global_unlock() - release locks taken by loop_global_lock_killable() * * @lo: struct loop_device * @global: true if @lo was about to bind another "struct loop_device", false otherwise */static void loop_global_unlock(struct loop_device *lo, bool global){	mutex_unlock(&lo->lo_mutex);	if (global)		mutex_unlock(&loop_validate_mutex);} static int max_part;static int part_shift; static loff_t get_size(loff_t offset, loff_t sizelimit, struct file *file){	loff_t loopsize; 	/* Compute loopsize in bytes */	loopsize = i_size_read(file->f_mapping->host);	if (offset > 0)		loopsize -= offset;	/* offset is beyond i_size, weird but possible */	if (loopsize < 0)		return 0; 	if (sizelimit > 0 && sizelimit < loopsize)		loopsize = 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 loff_t get_loop_size(struct loop_device *lo, struct file *file){	return get_size(lo->lo_offset, lo->lo_sizelimit, file);} static void __loop_update_dio(struct loop_device *lo, bool dio){	struct file *file = lo->lo_backing_file;	struct address_space *mapping = file->f_mapping;	struct inode *inode = mapping->host;	unsigned short sb_bsize = 0;	unsigned dio_align = 0;	bool use_dio; 	if (inode->i_sb->s_bdev) {		sb_bsize = bdev_logical_block_size(inode->i_sb->s_bdev);		dio_align = sb_bsize - 1;	} 	/*	 * We support direct I/O only if lo_offset is aligned with the	 * logical I/O size of backing device, and the logical block	 * size of loop is bigger than the backing device's.	 *	 * TODO: the above condition may be loosed in the future, and	 * direct I/O may be switched runtime at that time because most	 * of requests in sane applications should be PAGE_SIZE aligned	 */	if (dio) {		if (queue_logical_block_size(lo->lo_queue) >= sb_bsize &&				!(lo->lo_offset & dio_align) &&				mapping->a_ops->direct_IO)			use_dio = true;		else			use_dio = false;	} else {		use_dio = false;	} 	if (lo->use_dio == use_dio)		return; 	/* flush dirty pages before changing direct IO */	vfs_fsync(file, 0); 	/*	 * The flag of LO_FLAGS_DIRECT_IO is handled similarly with	 * LO_FLAGS_READ_ONLY, both are set from kernel, and losetup	 * will get updated by ioctl(LOOP_GET_STATUS)	 */	if (lo->lo_state == Lo_bound)		blk_mq_freeze_queue(lo->lo_queue);	lo->use_dio = use_dio;	if (use_dio) {		blk_queue_flag_clear(QUEUE_FLAG_NOMERGES, lo->lo_queue);		lo->lo_flags |= LO_FLAGS_DIRECT_IO;	} else {		blk_queue_flag_set(QUEUE_FLAG_NOMERGES, lo->lo_queue);		lo->lo_flags &= ~LO_FLAGS_DIRECT_IO;	}	if (lo->lo_state == Lo_bound)		blk_mq_unfreeze_queue(lo->lo_queue);} /** * loop_set_size() - sets device size and notifies userspace * @lo: struct loop_device to set the size for * @size: new size of the loop device * * Callers must validate that the size passed into this function fits into * a sector_t, eg using loop_validate_size() */static void loop_set_size(struct loop_device *lo, loff_t size){	if (!set_capacity_and_notify(lo->lo_disk, size))		kobject_uevent(&disk_to_dev(lo->lo_disk)->kobj, KOBJ_CHANGE);} static int lo_write_bvec(struct file *file, struct bio_vec *bvec, loff_t *ppos){	struct iov_iter i;	ssize_t bw; 	iov_iter_bvec(&i, WRITE, bvec, 1, bvec->bv_len); 	file_start_write(file);	bw = vfs_iter_write(file, &i, ppos, 0);	file_end_write(file); 	if (likely(bw ==  bvec->bv_len))		return 0; 	printk_ratelimited(KERN_ERR		"loop: Write error at byte offset %llu, length %i.\n",		(unsigned long long)*ppos, bvec->bv_len);	if (bw >= 0)		bw = -EIO;	return bw;} static int lo_write_simple(struct loop_device *lo, struct request *rq,		loff_t pos){	struct bio_vec bvec;	struct req_iterator iter;	int ret = 0; 	rq_for_each_segment(bvec, rq, iter) {		ret = lo_write_bvec(lo->lo_backing_file, &bvec, &pos);		if (ret < 0)			break;		cond_resched();	} 	return ret;} static int lo_read_simple(struct loop_device *lo, struct request *rq,		loff_t pos){	struct bio_vec bvec;	struct req_iterator iter;	struct iov_iter i;	ssize_t len; 	rq_for_each_segment(bvec, rq, iter) {		iov_iter_bvec(&i, READ, &bvec, 1, bvec.bv_len);		len = vfs_iter_read(lo->lo_backing_file, &i, &pos, 0);		if (len < 0)			return len; 		flush_dcache_page(bvec.bv_page); 		if (len != bvec.bv_len) {			struct bio *bio; 			__rq_for_each_bio(bio, rq)				zero_fill_bio(bio);			break;		}		cond_resched();	} 	return 0;} static int lo_fallocate(struct loop_device *lo, struct request *rq, loff_t pos,			int mode){	/*	 * We use fallocate to manipulate the space mappings used by the image	 * a.k.a. discard/zerorange.	 */	struct file *file = lo->lo_backing_file;	struct request_queue *q = lo->lo_queue;	int ret; 	mode |= FALLOC_FL_KEEP_SIZE; 	if (!blk_queue_discard(q)) {		ret = -EOPNOTSUPP;		goto out;	} 	ret = file->f_op->fallocate(file, mode, pos, blk_rq_bytes(rq));	if (unlikely(ret && ret != -EINVAL && ret != -EOPNOTSUPP))		ret = -EIO; out:	return ret;} static int lo_req_flush(struct loop_device *lo, struct request *rq){	struct file *file = lo->lo_backing_file;	int ret = vfs_fsync(file, 0);	if (unlikely(ret && ret != -EINVAL))		ret = -EIO; 	return ret;} static void lo_complete_rq(struct request *rq){	struct loop_cmd *cmd = blk_mq_rq_to_pdu(rq);	blk_status_t ret = BLK_STS_OK; 	if (!cmd->use_aio || cmd->ret < 0 || cmd->ret == blk_rq_bytes(rq) ||	    req_op(rq) != REQ_OP_READ) {		if (cmd->ret < 0)			ret = errno_to_blk_status(cmd->ret);		goto end_io;	} 	/*	 * Short READ - if we got some data, advance our request and	 * retry it. If we got no data, end the rest with EIO.	 */	if (cmd->ret) {		blk_update_request(rq, BLK_STS_OK, cmd->ret);		cmd->ret = 0;		blk_mq_requeue_request(rq, true);	} else {		if (cmd->use_aio) {			struct bio *bio = rq->bio; 			while (bio) {				zero_fill_bio(bio);				bio = bio->bi_next;			}		}		ret = BLK_STS_IOERR;end_io:		blk_mq_end_request(rq, ret);	}} static void lo_rw_aio_do_completion(struct loop_cmd *cmd){	struct request *rq = blk_mq_rq_from_pdu(cmd); 	if (!atomic_dec_and_test(&cmd->ref))		return;	kfree(cmd->bvec);	cmd->bvec = NULL;	if (likely(!blk_should_fake_timeout(rq->q)))		blk_mq_complete_request(rq);} static void lo_rw_aio_complete(struct kiocb *iocb, long ret){	struct loop_cmd *cmd = container_of(iocb, struct loop_cmd, iocb); 	cmd->ret = ret;	lo_rw_aio_do_completion(cmd);} static int lo_rw_aio(struct loop_device *lo, struct loop_cmd *cmd,		     loff_t pos, bool rw){	struct iov_iter iter;	struct req_iterator rq_iter;	struct bio_vec *bvec;	struct request *rq = blk_mq_rq_from_pdu(cmd);	struct bio *bio = rq->bio;	struct file *file = lo->lo_backing_file;	struct bio_vec tmp;	unsigned int offset;	int nr_bvec = 0;	int ret; 	rq_for_each_bvec(tmp, rq, rq_iter)		nr_bvec++; 	if (rq->bio != rq->biotail) { 		bvec = kmalloc_array(nr_bvec, sizeof(struct bio_vec),				     GFP_NOIO);		if (!bvec)			return -EIO;		cmd->bvec = bvec; 		/*		 * The bios of the request may be started from the middle of		 * the 'bvec' because of bio splitting, so we can't directly		 * copy bio->bi_iov_vec to new bvec. The rq_for_each_bvec		 * API will take care of all details for us.		 */		rq_for_each_bvec(tmp, rq, rq_iter) {			*bvec = tmp;			bvec++;		}		bvec = cmd->bvec;		offset = 0;	} else {		/*		 * Same here, this bio may be started from the middle of the		 * 'bvec' because of bio splitting, so offset from the bvec		 * must be passed to iov iterator		 */		offset = bio->bi_iter.bi_bvec_done;		bvec = __bvec_iter_bvec(bio->bi_io_vec, bio->bi_iter);	}	atomic_set(&cmd->ref, 2); 	iov_iter_bvec(&iter, rw, bvec, nr_bvec, blk_rq_bytes(rq));	iter.iov_offset = offset; 	cmd->iocb.ki_pos = pos;	cmd->iocb.ki_filp = file;	cmd->iocb.ki_complete = lo_rw_aio_complete;	cmd->iocb.ki_flags = IOCB_DIRECT;	cmd->iocb.ki_ioprio = IOPRIO_PRIO_VALUE(IOPRIO_CLASS_NONE, 0); 	if (rw == WRITE)		ret = call_write_iter(file, &cmd->iocb, &iter);	else		ret = call_read_iter(file, &cmd->iocb, &iter); 	lo_rw_aio_do_completion(cmd); 	if (ret != -EIOCBQUEUED)		lo_rw_aio_complete(&cmd->iocb, ret);	return 0;} static int do_req_filebacked(struct loop_device *lo, struct request *rq){	struct loop_cmd *cmd = blk_mq_rq_to_pdu(rq);	loff_t pos = ((loff_t) blk_rq_pos(rq) << 9) + lo->lo_offset; 	/*	 * lo_write_simple and lo_read_simple should have been covered	 * by io submit style function like lo_rw_aio(), one blocker	 * is that lo_read_simple() need to call flush_dcache_page after	 * the page is written from kernel, and it isn't easy to handle	 * this in io submit style function which submits all segments	 * of the req at one time. And direct read IO doesn't need to	 * run flush_dcache_page().	 */	switch (req_op(rq)) {	case REQ_OP_FLUSH:		return lo_req_flush(lo, rq);	case REQ_OP_WRITE_ZEROES:		/*		 * If the caller doesn't want deallocation, call zeroout to		 * write zeroes the range.  Otherwise, punch them out.		 */		return lo_fallocate(lo, rq, pos,			(rq->cmd_flags & REQ_NOUNMAP) ?				FALLOC_FL_ZERO_RANGE :				FALLOC_FL_PUNCH_HOLE);	case REQ_OP_DISCARD:		return lo_fallocate(lo, rq, pos, FALLOC_FL_PUNCH_HOLE);	case REQ_OP_WRITE:		if (cmd->use_aio)			return lo_rw_aio(lo, cmd, pos, WRITE);		else			return lo_write_simple(lo, rq, pos);	case REQ_OP_READ:		if (cmd->use_aio)			return lo_rw_aio(lo, cmd, pos, READ);		else			return lo_read_simple(lo, rq, pos);

Lines 1–500 of 2291.