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? I really don't understand what you are trying to do here.