2292 lines · 57.4 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_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;	unsigned int	lo_min_dio_size;	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			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_can_use_dio(struct loop_device *lo){	if (!(lo->lo_backing_file->f_mode & FMODE_CAN_ODIRECT))		return false;	if (queue_logical_block_size(lo->lo_queue) < lo->lo_min_dio_size)		return false;	if (lo->lo_offset & (lo->lo_min_dio_size - 1))		return false;	return true;} /* * Direct I/O can be enabled either by using an O_DIRECT file descriptor, or by * passing in the LO_FLAGS_DIRECT_IO flag from userspace.  It will be silently * disabled when the device block size is too small or the offset is unaligned. * * loop_get_status will always report the effective LO_FLAGS_DIRECT_IO flag and * not the originally passed in one. */static inline void loop_update_dio(struct loop_device *lo){	lockdep_assert_held(&lo->lo_mutex);	WARN_ON_ONCE(lo->lo_state == Lo_bound &&		     lo->lo_queue->mq_freeze_depth == 0); 	if ((lo->lo_flags & LO_FLAGS_DIRECT_IO) && !lo_can_use_dio(lo))		lo->lo_flags &= ~LO_FLAGS_DIRECT_IO;} /** * 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 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;	} 	/*	 * XXX: this updates the queue limits without freezing the queue, which	 * is against the locking protocol and dangerous.  But we can't just	 * freeze the queue as we're inside the ->queue_rq method here.  So this	 * should move out into a workqueue unless we get the file operations to	 * advertise if they support specific fallocate operations.	 */	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->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 {		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 (req_op(rq) == REQ_OP_WRITE)		kiocb_end_write(&cmd->iocb);	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_ioprio = req_get_ioprio(rq);	if (cmd->use_aio) {		cmd->iocb.ki_complete = lo_rw_aio_complete;		cmd->iocb.ki_flags = IOCB_DIRECT;	} else {		cmd->iocb.ki_complete = NULL;		cmd->iocb.ki_flags = 0;	} 	if (rw == ITER_SOURCE) {		kiocb_start_write(&cmd->iocb);		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 -EIOCBQUEUED;} 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; 	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:		return lo_rw_aio(lo, cmd, pos, ITER_SOURCE);	case REQ_OP_READ:		return lo_rw_aio(lo, cmd, pos, ITER_DEST);	default:		WARN_ON_ONCE(1);		return -EIO;	}} static void loop_reread_partitions(struct loop_device *lo){	int rc; 	mutex_lock(&lo->lo_disk->open_mutex);	rc = bdev_disk_changed(lo->lo_disk, false);	mutex_unlock(&lo->lo_disk->open_mutex);	if (rc)		pr_warn("%s: partition scan of loop%d (%s) failed (rc=%d)\n",			__func__, lo->lo_number, lo->lo_file_name, rc);} static unsigned int loop_query_min_dio_size(struct loop_device *lo){	struct file *file = lo->lo_backing_file;	struct block_device *sb_bdev = file->f_mapping->host->i_sb->s_bdev;	struct kstat st; 	/*	 * Use the minimal dio alignment of the file system if provided.	 */	if (!vfs_getattr(&file->f_path, &st, STATX_DIOALIGN, 0) &&	    (st.result_mask & STATX_DIOALIGN))		return st.dio_offset_align; 	/*	 * In a perfect world this wouldn't be needed, but as of Linux 6.13 only	 * a handful of file systems support the STATX_DIOALIGN flag.	 */	if (sb_bdev)		return bdev_logical_block_size(sb_bdev);	return SECTOR_SIZE;} static inline int is_loop_device(struct file *file){	struct inode *i = file->f_mapping->host; 	return i && S_ISBLK(i->i_mode) && imajor(i) == LOOP_MAJOR;} static int loop_validate_file(struct file *file, struct block_device *bdev){	struct inode	*inode = file->f_mapping->host;	struct file	*f = file; 	/* Avoid recursion */	while (is_loop_device(f)) {		struct loop_device *l; 		lockdep_assert_held(&loop_validate_mutex);		if (f->f_mapping->host->i_rdev == bdev->bd_dev)			return -EBADF; 		l = I_BDEV(f->f_mapping->host)->bd_disk->private_data;		if (l->lo_state != Lo_bound)			return -EINVAL;		/* Order wrt setting lo->lo_backing_file in loop_configure(). */		rmb();		f = l->lo_backing_file;	}	if (!S_ISREG(inode->i_mode) && !S_ISBLK(inode->i_mode))		return -EINVAL;	return 0;} static void loop_assign_backing_file(struct loop_device *lo, struct file *file)

Lines 1–500 of 2292.