mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-10-28 21:02:43 +01:00
uio: replace deprecated mmap hook with mmap_prepare in uio_info
The f_op->mmap interface is deprecated, so update uio_info to use its successor, mmap_prepare. Therefore, replace the uio_info->mmap hook with a new uio_info->mmap_prepare hook, and update its one user, target_core_user, to both specify this new mmap_prepare hook and also to use the new vm_ops->mapped() hook to continue to maintain a correct udev->kref refcount. Then update uio_mmap() to utilise the mmap_prepare compatibility layer to invoke this callback from the uio mmap invocation. Link: https://lkml.kernel.org/r/157583e4477705b496896c7acd4ac88a937b8fa6.1774045440.git.ljs@kernel.org Signed-off-by: Lorenzo Stoakes (Oracle) <[email protected]> Acked-by: Vlastimil Babka (SUSE) <[email protected]> Cc: Alexander Shishkin <[email protected]> Cc: Alexandre Torgue <[email protected]> Cc: Al Viro <[email protected]> Cc: Arnd Bergmann <[email protected]> Cc: Bodo Stroesser <[email protected]> Cc: Christian Brauner <[email protected]> Cc: Clemens Ladisch <[email protected]> Cc: David Hildenbrand <[email protected]> Cc: David Howells <[email protected]> Cc: Dexuan Cui <[email protected]> Cc: Greg Kroah-Hartman <[email protected]> Cc: Haiyang Zhang <[email protected]> Cc: Jan Kara <[email protected]> Cc: Jann Horn <[email protected]> Cc: Jonathan Corbet <[email protected]> Cc: K. Y. Srinivasan <[email protected]> Cc: Liam Howlett <[email protected]> Cc: Long Li <[email protected]> Cc: Marc Dionne <[email protected]> Cc: "Martin K. Petersen" <[email protected]> Cc: Maxime Coquelin <[email protected]> Cc: Michal Hocko <[email protected]> Cc: Mike Rapoport <[email protected]> Cc: Miquel Raynal <[email protected]> Cc: Pedro Falcato <[email protected]> Cc: Richard Weinberger <[email protected]> Cc: Ryan Roberts <[email protected]> Cc: Suren Baghdasaryan <[email protected]> Cc: Vignesh Raghavendra <[email protected]> Cc: Wei Liu <[email protected]> Signed-off-by: Andrew Morton <[email protected]>
This commit is contained in:
1 parent
f98cb7ca4a
commit
933f05f58a
3 files changed
+28
-12
No files matched your search
@@ -1860,6 +1860,17 @@ static struct page *tcmu_try_get_data_page(struct tcmu_dev *udev, uint32_t dpi)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int tcmu_vma_mapped(unsigned long start, unsigned long end, pgoff_t pgoff,
|
||||
const struct file *file, void **vm_private_data)
|
||||
{
|
||||
struct tcmu_dev *udev = *vm_private_data;
|
||||
|
||||
pr_debug("vma_mapped\n");
|
||||
|
||||
kref_get(&udev->kref);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void tcmu_vma_open(struct vm_area_struct *vma)
|
||||
{
|
||||
struct tcmu_dev *udev = vma->vm_private_data;
|
||||
@@ -1919,26 +1930,25 @@ static vm_fault_t tcmu_vma_fault(struct vm_fault *vmf)
|
||||
}
|
||||
|
||||
static const struct vm_operations_struct tcmu_vm_ops = {
|
||||
.mapped = tcmu_vma_mapped,
|
||||
.open = tcmu_vma_open,
|
||||
.close = tcmu_vma_close,
|
||||
.fault = tcmu_vma_fault,
|
||||
};
|
||||
|
||||
static int tcmu_mmap(struct uio_info *info, struct vm_area_struct *vma)
|
||||
static int tcmu_mmap_prepare(struct uio_info *info, struct vm_area_desc *desc)
|
||||
{
|
||||
struct tcmu_dev *udev = container_of(info, struct tcmu_dev, uio_info);
|
||||
|
||||
vm_flags_set(vma, VM_DONTEXPAND | VM_DONTDUMP);
|
||||
vma->vm_ops = &tcmu_vm_ops;
|
||||
vma_desc_set_flags(desc, VMA_DONTEXPAND_BIT, VMA_DONTDUMP_BIT);
|
||||
desc->vm_ops = &tcmu_vm_ops;
|
||||
|
||||
vma->vm_private_data = udev;
|
||||
desc->private_data = udev;
|
||||
|
||||
/* Ensure the mmap is exactly the right size */
|
||||
if (vma_pages(vma) != udev->mmap_pages)
|
||||
if (vma_desc_pages(desc) != udev->mmap_pages)
|
||||
return -EINVAL;
|
||||
|
||||
tcmu_vma_open(vma);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2253,7 +2263,7 @@ static int tcmu_configure_device(struct se_device *dev)
|
||||
info->irqcontrol = tcmu_irqcontrol;
|
||||
info->irq = UIO_IRQ_CUSTOM;
|
||||
|
||||
info->mmap = tcmu_mmap;
|
||||
info->mmap_prepare = tcmu_mmap_prepare;
|
||||
info->open = tcmu_open;
|
||||
info->release = tcmu_release;
|
||||
|
||||
|
||||
+8
-2
@@ -850,8 +850,14 @@ static int uio_mmap(struct file *filep, struct vm_area_struct *vma)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (idev->info->mmap) {
|
||||
ret = idev->info->mmap(idev->info, vma);
|
||||
if (idev->info->mmap_prepare) {
|
||||
struct vm_area_desc desc;
|
||||
|
||||
compat_set_desc_from_vma(&desc, filep, vma);
|
||||
ret = idev->info->mmap_prepare(idev->info, &desc);
|
||||
if (ret)
|
||||
goto out;
|
||||
ret = __compat_vma_mmap(&desc, vma);
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
||||
@@ -97,7 +97,7 @@ struct uio_device {
|
||||
* @irq_flags: flags for request_irq()
|
||||
* @priv: optional private data
|
||||
* @handler: the device's irq handler
|
||||
* @mmap: mmap operation for this uio device
|
||||
* @mmap_prepare: mmap_prepare operation for this uio device
|
||||
* @open: open operation for this uio device
|
||||
* @release: release operation for this uio device
|
||||
* @irqcontrol: disable/enable irqs when 0/1 is written to /dev/uioX
|
||||
@@ -112,7 +112,7 @@ struct uio_info {
|
||||
unsigned long irq_flags;
|
||||
void *priv;
|
||||
irqreturn_t (*handler)(int irq, struct uio_info *dev_info);
|
||||
int (*mmap)(struct uio_info *info, struct vm_area_struct *vma);
|
||||
int (*mmap_prepare)(struct uio_info *info, struct vm_area_desc *desc);
|
||||
int (*open)(struct uio_info *info, struct inode *inode);
|
||||
int (*release)(struct uio_info *info, struct inode *inode);
|
||||
int (*irqcontrol)(struct uio_info *info, s32 irq_on);
|
||||
|
||||
Reference in new issue
Block a user