Lines Matching refs:kattr
4265 static unsigned int recalc_flags(struct mount_kattr *kattr, struct mount *mnt) in recalc_flags() argument
4270 flags &= ~kattr->attr_clr; in recalc_flags()
4272 flags |= kattr->attr_set; in recalc_flags()
4277 static int can_idmap_mount(const struct mount_kattr *kattr, struct mount *mnt) in can_idmap_mount() argument
4282 if (!kattr->mnt_idmap) in can_idmap_mount()
4289 if (!check_fsmapping(kattr->mnt_idmap, m->mnt_sb)) in can_idmap_mount()
4324 static inline bool mnt_allow_writers(const struct mount_kattr *kattr, in mnt_allow_writers() argument
4327 return (!(kattr->attr_set & MNT_READONLY) || in mnt_allow_writers()
4329 !kattr->mnt_idmap; in mnt_allow_writers()
4332 static int mount_setattr_prepare(struct mount_kattr *kattr, struct mount *mnt) in mount_setattr_prepare() argument
4338 if (!can_change_locked_flags(m, recalc_flags(kattr, m))) { in mount_setattr_prepare()
4343 err = can_idmap_mount(kattr, m); in mount_setattr_prepare()
4347 if (!mnt_allow_writers(kattr, m)) { in mount_setattr_prepare()
4353 if (!kattr->recurse) in mount_setattr_prepare()
4381 static void do_idmap_mount(const struct mount_kattr *kattr, struct mount *mnt) in do_idmap_mount() argument
4383 if (!kattr->mnt_idmap) in do_idmap_mount()
4394 smp_store_release(&mnt->mnt.mnt_idmap, mnt_idmap_get(kattr->mnt_idmap)); in do_idmap_mount()
4397 static void mount_setattr_commit(struct mount_kattr *kattr, struct mount *mnt) in mount_setattr_commit() argument
4404 do_idmap_mount(kattr, m); in mount_setattr_commit()
4405 flags = recalc_flags(kattr, m); in mount_setattr_commit()
4412 if (kattr->propagation) in mount_setattr_commit()
4413 change_mnt_propagation(m, kattr->propagation); in mount_setattr_commit()
4414 if (!kattr->recurse) in mount_setattr_commit()
4420 static int do_mount_setattr(struct path *path, struct mount_kattr *kattr) in do_mount_setattr() argument
4428 if (kattr->mnt_userns) { in do_mount_setattr()
4431 mnt_idmap = alloc_mnt_idmap(kattr->mnt_userns); in do_mount_setattr()
4434 kattr->mnt_idmap = mnt_idmap; in do_mount_setattr()
4437 if (kattr->propagation) { in do_mount_setattr()
4443 if (kattr->propagation == MS_SHARED) { in do_mount_setattr()
4444 err = invent_group_ids(mnt, kattr->recurse); in do_mount_setattr()
4473 err = mount_setattr_prepare(kattr, mnt); in do_mount_setattr()
4475 mount_setattr_commit(kattr, mnt); in do_mount_setattr()
4480 if (kattr->propagation) { in do_mount_setattr()
4490 struct mount_kattr *kattr, unsigned int flags) in build_mount_idmapped() argument
4546 kattr->mnt_userns = get_user_ns(mnt_userns); in build_mount_idmapped()
4554 struct mount_kattr *kattr, unsigned int flags) in build_mount_kattr() argument
4565 *kattr = (struct mount_kattr) { in build_mount_kattr()
4574 kattr->propagation = attr->propagation; in build_mount_kattr()
4579 kattr->attr_set = attr_flags_to_mnt_flags(attr->attr_set); in build_mount_kattr()
4580 kattr->attr_clr = attr_flags_to_mnt_flags(attr->attr_clr); in build_mount_kattr()
4599 kattr->attr_clr |= MNT_RELATIME | MNT_NOATIME; in build_mount_kattr()
4602 kattr->attr_set |= MNT_RELATIME; in build_mount_kattr()
4605 kattr->attr_set |= MNT_NOATIME; in build_mount_kattr()
4617 return build_mount_idmapped(attr, usize, kattr, flags); in build_mount_kattr()
4620 static void finish_mount_kattr(struct mount_kattr *kattr) in finish_mount_kattr() argument
4622 put_user_ns(kattr->mnt_userns); in finish_mount_kattr()
4623 kattr->mnt_userns = NULL; in finish_mount_kattr()
4625 if (kattr->mnt_idmap) in finish_mount_kattr()
4626 mnt_idmap_put(kattr->mnt_idmap); in finish_mount_kattr()
4636 struct mount_kattr kattr; in SYSCALL_DEFINE5() local
4664 err = build_mount_kattr(&attr, usize, &kattr, flags); in SYSCALL_DEFINE5()
4668 err = user_path_at(dfd, path, kattr.lookup_flags, &target); in SYSCALL_DEFINE5()
4670 err = do_mount_setattr(&target, &kattr); in SYSCALL_DEFINE5()
4673 finish_mount_kattr(&kattr); in SYSCALL_DEFINE5()