Lines Matching refs:kattr
4276 static unsigned int recalc_flags(struct mount_kattr *kattr, struct mount *mnt)
4281 flags &= ~kattr->attr_clr;
4283 flags |= kattr->attr_set;
4288 static int can_idmap_mount(const struct mount_kattr *kattr, struct mount *mnt)
4293 if (!kattr->mnt_idmap)
4300 if (!check_fsmapping(kattr->mnt_idmap, m->mnt_sb))
4328 * @kattr: the new mount attributes
4329 * @mnt: the mount to which @kattr will be applied
4331 * Check whether thew new mount attributes in @kattr allow concurrent writers.
4335 static inline bool mnt_allow_writers(const struct mount_kattr *kattr,
4338 return (!(kattr->attr_set & MNT_READONLY) ||
4340 !kattr->mnt_idmap;
4343 static int mount_setattr_prepare(struct mount_kattr *kattr, struct mount *mnt)
4349 if (!can_change_locked_flags(m, recalc_flags(kattr, m))) {
4354 err = can_idmap_mount(kattr, m);
4358 if (!mnt_allow_writers(kattr, m)) {
4364 if (!kattr->recurse)
4392 static void do_idmap_mount(const struct mount_kattr *kattr, struct mount *mnt)
4394 if (!kattr->mnt_idmap)
4405 smp_store_release(&mnt->mnt.mnt_idmap, mnt_idmap_get(kattr->mnt_idmap));
4408 static void mount_setattr_commit(struct mount_kattr *kattr, struct mount *mnt)
4415 do_idmap_mount(kattr, m);
4416 flags = recalc_flags(kattr, m);
4423 if (kattr->propagation)
4424 change_mnt_propagation(m, kattr->propagation);
4425 if (!kattr->recurse)
4431 static int do_mount_setattr(struct path *path, struct mount_kattr *kattr)
4439 if (kattr->mnt_userns) {
4442 mnt_idmap = alloc_mnt_idmap(kattr->mnt_userns);
4445 kattr->mnt_idmap = mnt_idmap;
4448 if (kattr->propagation) {
4454 if (kattr->propagation == MS_SHARED) {
4455 err = invent_group_ids(mnt, kattr->recurse);
4489 err = mount_setattr_prepare(kattr, mnt);
4491 mount_setattr_commit(kattr, mnt);
4496 if (kattr->propagation) {
4506 struct mount_kattr *kattr, unsigned int flags)
4562 kattr->mnt_userns = get_user_ns(mnt_userns);
4570 struct mount_kattr *kattr, unsigned int flags)
4581 *kattr = (struct mount_kattr) {
4590 kattr->propagation = attr->propagation;
4595 kattr->attr_set = attr_flags_to_mnt_flags(attr->attr_set);
4596 kattr->attr_clr = attr_flags_to_mnt_flags(attr->attr_clr);
4615 kattr->attr_clr |= MNT_RELATIME | MNT_NOATIME;
4618 kattr->attr_set |= MNT_RELATIME;
4621 kattr->attr_set |= MNT_NOATIME;
4633 return build_mount_idmapped(attr, usize, kattr, flags);
4636 static void finish_mount_kattr(struct mount_kattr *kattr)
4638 put_user_ns(kattr->mnt_userns);
4639 kattr->mnt_userns = NULL;
4641 if (kattr->mnt_idmap)
4642 mnt_idmap_put(kattr->mnt_idmap);
4652 struct mount_kattr kattr;
4680 err = build_mount_kattr(&attr, usize, &kattr, flags);
4684 err = user_path_at(dfd, path, kattr.lookup_flags, &target);
4686 err = do_mount_setattr(&target, &kattr);
4689 finish_mount_kattr(&kattr);