2314 lines · 57.3 KB · C
RawDownload
// SPDX-License-Identifier: GPL-2.0-only/* * Copyright 1993 by Theodore Ts'o. */#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/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 <linux/uaccess.h>#include <linux/blk-mq.h>#include <linux/spinlock.h>#include <uapi/linux/loop.h> /* Possible states of device */enum {	Lo_unbound,	Lo_bound,	Lo_rundown,	Lo_deleting,}; struct loop_func_table; struct loop_device {	int		lo_number;	loff_t		lo_offset;	loff_t		lo_sizelimit;	int		lo_flags;	char		lo_file_name[LO_NAME_SIZE]; 	struct file *	lo_backing_file;	struct block_device *lo_device; 	gfp_t		old_gfp_mask; 	spinlock_t		lo_lock;	int			lo_state;	spinlock_t              lo_work_lock;	struct workqueue_struct *workqueue;	struct work_struct      rootcg_work;	struct list_head        rootcg_cmd_list;	struct list_head        idle_worker_list;	struct rb_root          worker_tree;	struct timer_list       timer;	bool			use_dio;	bool			sysfs_inited; 	struct request_queue	*lo_queue;	struct blk_mq_tag_set	tag_set;	struct gendisk		*lo_disk;	struct mutex		lo_mutex;	bool			idr_visible;}; struct loop_cmd {	struct list_head list_entry;	bool use_aio; /* use AIO interface to handle I/O */	atomic_t ref; /* only for aio */	long ret;	struct kiocb iocb;	struct bio_vec *bvec;	struct cgroup_subsys_state *blkcg_css;	struct cgroup_subsys_state *memcg_css;}; #define LOOP_IDLE_WORKER_TIMEOUT (60 * HZ)#define LOOP_DEFAULT_HW_Q_DEPTH 128 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);} /* * 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 that of * the backing device. */static bool lo_bdev_can_use_dio(struct loop_device *lo,		struct block_device *backing_bdev){	unsigned int sb_bsize = bdev_logical_block_size(backing_bdev); 	if (queue_logical_block_size(lo->lo_queue) < sb_bsize)		return false;	if (lo->lo_offset & (sb_bsize - 1))		return false;	return true;} static void __loop_update_dio(struct loop_device *lo, bool dio){	struct file *file = lo->lo_backing_file;	struct inode *inode = file->f_mapping->host;	struct block_device *backing_bdev = NULL;	bool use_dio; 	if (S_ISBLK(inode->i_mode))		backing_bdev = I_BDEV(inode);	else if (inode->i_sb->s_bdev)		backing_bdev = inode->i_sb->s_bdev; 	use_dio = dio && (file->f_mode & FMODE_CAN_ODIRECT) &&		(!backing_bdev || lo_bdev_can_use_dio(lo, backing_bdev)); 	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)		lo->lo_flags |= LO_FLAGS_DIRECT_IO;	else		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, ITER_SOURCE, bvec, 1, bvec->bv_len); 	bw = vfs_iter_write(file, &i, ppos, 0); 	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, ITER_DEST, &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 void loop_clear_limits(struct loop_device *lo, int mode){	struct queue_limits lim = queue_limits_start_update(lo->lo_queue); 	if (mode & FALLOC_FL_ZERO_RANGE)		lim.max_write_zeroes_sectors = 0; 	if (mode & FALLOC_FL_PUNCH_HOLE) {		lim.max_hw_discard_sectors = 0;		lim.discard_granularity = 0;	} 	queue_limits_commit_update(lo->lo_queue, &lim);} 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;	int ret; 	mode |= FALLOC_FL_KEEP_SIZE; 	if (!bdev_max_discard_sectors(lo->lo_device))		return -EOPNOTSUPP; 	ret = file->f_op->fallocate(file, mode, pos, blk_rq_bytes(rq));	if (unlikely(ret && ret != -EINVAL && ret != -EOPNOTSUPP))		return -EIO; 	/*	 * We initially configure the limits in a hope that fallocate is	 * supported and clear them here if that turns out not to be true.	 */	if (unlikely(ret == -EOPNOTSUPP))		loop_clear_limits(lo, mode); 	return ret;} static int lo_req_flush(struct loop_device *lo, struct request *rq){	int ret = vfs_fsync(lo->lo_backing_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, int 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 == ITER_SOURCE)		ret = file->f_op->write_iter(&cmd->iocb, &iter);	else		ret = file->f_op->read_iter(&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.		 */

Lines 1–500 of 2314.