On Wed, Jul 27, 2022 at 03:11:05PM +0100, Al Viro wrote: > On Tue, Jul 26, 2022 at 10:38:13AM -0700, Keith Busch wrote: > > > + file = fget(map.fd); > > + if (!file) > > + return -EBADF; > > + > > + if (S_ISBLK(file_inode(file)->i_mode)) > > + bdev = I_BDEV(file->f_mapping->host); > > + else if (S_ISREG(file_inode(file)->i_mode)) > > + bdev = file->f_inode->i_sb->s_bdev; > > + else > > + return -EOPNOTSUPP; > > + > > + for (i = map.buf_start; i < map.buf_end; i++) { > > + struct io_mapped_ubuf *imu = ctx->user_bufs[i]; > > + void *tag; > > + > > + if (imu->dma_tag) { > > + ret = -EBUSY; > > + goto err; > > + } > > + > > + tag = block_dma_map(bdev, imu->bvec, imu->nr_bvecs); > > + if (IS_ERR(tag)) { > > + ret = PTR_ERR(tag); > > + goto err; > > + } > > + > > + imu->dma_tag = tag; > > + imu->dma_file = file; > > + imu->bdev = bdev; > > + } > > + > > + fput(file); > > This, BTW, is completely insane - what happens if you follow that > with close(map.fd)? A bunch of dangling struct file references? This should have been tied to files registered with the io_uring instance holding a reference, and cleaned up when the files are unregistered. I may be missing some cases here, so I'll fix that up. > I really don't understand what you are trying to do here We want to register userspace addresses with the block_device just once. We can skip costly per-IO setup this way.