Lines Matching refs:kattr
4437 static unsigned int recalc_flags(struct mount_kattr *kattr, struct mount *mnt) in recalc_flags() argument
4442 flags &= ~kattr->attr_clr; in recalc_flags()
4444 flags |= kattr->attr_set; in recalc_flags()
4449 static int can_idmap_mount(const struct mount_kattr *kattr, struct mount *mnt) in can_idmap_mount() argument
4454 if (!kattr->mnt_idmap) in can_idmap_mount()
4461 if (kattr->mnt_userns == m->mnt_sb->s_user_ns) in can_idmap_mount()
4500 static inline bool mnt_allow_writers(const struct mount_kattr *kattr, in mnt_allow_writers() argument
4503 return (!(kattr->attr_set & MNT_READONLY) || in mnt_allow_writers()
4505 !kattr->mnt_idmap; in mnt_allow_writers()
4508 static int mount_setattr_prepare(struct mount_kattr *kattr, struct mount *mnt) in mount_setattr_prepare() argument
4514 if (!can_change_locked_flags(m, recalc_flags(kattr, m))) { in mount_setattr_prepare()
4519 err = can_idmap_mount(kattr, m); in mount_setattr_prepare()
4523 if (!mnt_allow_writers(kattr, m)) { in mount_setattr_prepare()
4529 if (!kattr->recurse) in mount_setattr_prepare()
4557 static void do_idmap_mount(const struct mount_kattr *kattr, struct mount *mnt) in do_idmap_mount() argument
4559 if (!kattr->mnt_idmap) in do_idmap_mount()
4570 smp_store_release(&mnt->mnt.mnt_idmap, mnt_idmap_get(kattr->mnt_idmap)); in do_idmap_mount()
4573 static void mount_setattr_commit(struct mount_kattr *kattr, struct mount *mnt) in mount_setattr_commit() argument
4580 do_idmap_mount(kattr, m); in mount_setattr_commit()
4581 flags = recalc_flags(kattr, m); in mount_setattr_commit()
4588 if (kattr->propagation) in mount_setattr_commit()
4589 change_mnt_propagation(m, kattr->propagation); in mount_setattr_commit()
4590 if (!kattr->recurse) in mount_setattr_commit()
4596 static int do_mount_setattr(struct path *path, struct mount_kattr *kattr) in do_mount_setattr() argument
4604 if (kattr->mnt_userns) { in do_mount_setattr()
4607 mnt_idmap = alloc_mnt_idmap(kattr->mnt_userns); in do_mount_setattr()
4610 kattr->mnt_idmap = mnt_idmap; in do_mount_setattr()
4613 if (kattr->propagation) { in do_mount_setattr()
4619 if (kattr->propagation == MS_SHARED) { in do_mount_setattr()
4620 err = invent_group_ids(mnt, kattr->recurse); in do_mount_setattr()
4654 err = mount_setattr_prepare(kattr, mnt); in do_mount_setattr()
4656 mount_setattr_commit(kattr, mnt); in do_mount_setattr()
4661 if (kattr->propagation) { in do_mount_setattr()
4671 struct mount_kattr *kattr, unsigned int flags) in build_mount_idmapped() argument
4727 kattr->mnt_userns = get_user_ns(mnt_userns); in build_mount_idmapped()
4735 struct mount_kattr *kattr, unsigned int flags) in build_mount_kattr() argument
4746 *kattr = (struct mount_kattr) { in build_mount_kattr()
4755 kattr->propagation = attr->propagation; in build_mount_kattr()
4760 kattr->attr_set = attr_flags_to_mnt_flags(attr->attr_set); in build_mount_kattr()
4761 kattr->attr_clr = attr_flags_to_mnt_flags(attr->attr_clr); in build_mount_kattr()
4780 kattr->attr_clr |= MNT_RELATIME | MNT_NOATIME; in build_mount_kattr()
4783 kattr->attr_set |= MNT_RELATIME; in build_mount_kattr()
4786 kattr->attr_set |= MNT_NOATIME; in build_mount_kattr()
4798 return build_mount_idmapped(attr, usize, kattr, flags); in build_mount_kattr()
4801 static void finish_mount_kattr(struct mount_kattr *kattr) in finish_mount_kattr() argument
4803 put_user_ns(kattr->mnt_userns); in finish_mount_kattr()
4804 kattr->mnt_userns = NULL; in finish_mount_kattr()
4806 if (kattr->mnt_idmap) in finish_mount_kattr()
4807 mnt_idmap_put(kattr->mnt_idmap); in finish_mount_kattr()
4817 struct mount_kattr kattr; in SYSCALL_DEFINE5() local
4845 err = build_mount_kattr(&attr, usize, &kattr, flags); in SYSCALL_DEFINE5()
4849 err = user_path_at(dfd, path, kattr.lookup_flags, &target); in SYSCALL_DEFINE5()
4851 err = do_mount_setattr(&target, &kattr); in SYSCALL_DEFINE5()
4854 finish_mount_kattr(&kattr); in SYSCALL_DEFINE5()