mirror of https://github.com/OpenIPC/firmware.git
72 lines
2.0 KiB
Diff
72 lines
2.0 KiB
Diff
diff -drupN a/fs/namespace.c b/fs/namespace.c
|
|
--- a/fs/namespace.c 2018-08-06 17:23:04.000000000 +0300
|
|
+++ b/fs/namespace.c 2022-06-12 05:28:14.000000000 +0300
|
|
@@ -227,6 +227,7 @@ static struct mount *alloc_vfsmnt(const
|
|
mnt->mnt_count = 1;
|
|
mnt->mnt_writers = 0;
|
|
#endif
|
|
+ mnt->mnt.data = NULL;
|
|
|
|
INIT_HLIST_NODE(&mnt->mnt_hash);
|
|
INIT_LIST_HEAD(&mnt->mnt_child);
|
|
@@ -581,6 +582,7 @@ int sb_prepare_remount_readonly(struct s
|
|
|
|
static void free_vfsmnt(struct mount *mnt)
|
|
{
|
|
+ kfree(mnt->mnt.data);
|
|
kfree_const(mnt->mnt_devname);
|
|
#ifdef CONFIG_SMP
|
|
free_percpu(mnt->mnt_pcp);
|
|
@@ -975,10 +977,18 @@ vfs_kern_mount(struct file_system_type *
|
|
if (!mnt)
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
+ if (type->alloc_mnt_data) {
|
|
+ mnt->mnt.data = type->alloc_mnt_data();
|
|
+ if (!mnt->mnt.data) {
|
|
+ mnt_free_id(mnt);
|
|
+ free_vfsmnt(mnt);
|
|
+ return ERR_PTR(-ENOMEM);
|
|
+ }
|
|
+ }
|
|
if (flags & MS_KERNMOUNT)
|
|
mnt->mnt.mnt_flags = MNT_INTERNAL;
|
|
|
|
- root = mount_fs(type, flags, name, data);
|
|
+ root = mount_fs(type, flags, name, &mnt->mnt, data);
|
|
if (IS_ERR(root)) {
|
|
mnt_free_id(mnt);
|
|
free_vfsmnt(mnt);
|
|
@@ -1022,6 +1032,14 @@ static struct mount *clone_mnt(struct mo
|
|
if (!mnt)
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
+ if (sb->s_op->clone_mnt_data) {
|
|
+ mnt->mnt.data = sb->s_op->clone_mnt_data(old->mnt.data);
|
|
+ if (!mnt->mnt.data) {
|
|
+ err = -ENOMEM;
|
|
+ goto out_free;
|
|
+ }
|
|
+ }
|
|
+
|
|
if (flag & (CL_SLAVE | CL_PRIVATE | CL_SHARED_TO_SLAVE))
|
|
mnt->mnt_group_id = 0; /* not a peer of original */
|
|
else
|
|
@@ -2306,8 +2324,14 @@ static int do_remount(struct path *path,
|
|
err = change_mount_flags(path->mnt, flags);
|
|
else if (!capable(CAP_SYS_ADMIN))
|
|
err = -EPERM;
|
|
- else
|
|
- err = do_remount_sb(sb, flags, data, 0);
|
|
+ else {
|
|
+ err = do_remount_sb2(path->mnt, sb, flags, data, 0);
|
|
+ namespace_lock();
|
|
+ lock_mount_hash();
|
|
+ propagate_remount(mnt);
|
|
+ unlock_mount_hash();
|
|
+ namespace_unlock();
|
|
+ }
|
|
if (!err) {
|
|
lock_mount_hash();
|
|
mnt_flags |= mnt->mnt.mnt_flags & ~MNT_USER_SETTABLE_MASK;
|