quoted
int restrictedmem_bind(struct file *file, pgoff_t start, pgoff_t end,
struct restrictedmem_notifier *notifier, bool exclusive)
{
struct restrictedmem *rm = file->f_mapping->private_data;
int ret = -EINVAL;
down_write(&rm->lock);
/* Non-exclusive mappings are not yet implemented. */
if (!exclusive)
goto out_unlock;
if (!xa_empty(&rm->bindings)) {
if (exclusive != rm->exclusive)
goto out_unlock;
if (exclusive && xa_find(&rm->bindings, &start, end, XA_PRESENT))
goto out_unlock;
}
xa_store_range(&rm->bindings, start, end, notifier, GFP_KERNEL);
|| ld: mm/restrictedmem.o: in function `restrictedmem_bind':
mm/restrictedmem.c|295| undefined reference to `xa_store_range'
Right, xa_store_range() is only available for XARRAY_MULTI.
quoted hunk ↗ jump to hunk
This is missing:
===
diff --git a/mm/Kconfig b/mm/Kconfig
index f952d0172080..03aca542c0da 100644
--- a/mm/Kconfig
+++ b/mm/Kconfig
@@ -1087,6 +1087,7 @@ config SECRETMEM
config RESTRICTEDMEM
bool
depends on TMPFS
+ select XARRAY_MULTI===
Thanks,
quoted
rm->exclusive = exclusive;
ret = 0;
out_unlock:
up_write(&rm->lock);
return ret;
}
EXPORT_SYMBOL_GPL(restrictedmem_bind);
void restrictedmem_unbind(struct file *file, pgoff_t start, pgoff_t end,
struct restrictedmem_notifier *notifier)
{
struct restrictedmem *rm = file->f_mapping->private_data;
down_write(&rm->lock);
xa_store_range(&rm->bindings, start, end, NULL, GFP_KERNEL);
synchronize_rcu();
up_write(&rm->lock);
}
EXPORT_SYMBOL_GPL(restrictedmem_unbind);
--
Alexey