1 #include <linux/btrfs.h>
2 #include <linux/capability.h>
3 #include <linux/cred.h>
4 #include <linux/mount.h>
5 #include <linux/fdtable.h>
6 #include <linux/file.h>
8 #include <linux/namei.h>
9 #include <linux/module.h>
10 #include <linux/kernel.h>
11 #include <linux/magic.h>
12 #include <linux/parser.h>
13 #include <linux/security.h>
14 #include <linux/seq_file.h>
15 #include <linux/statfs.h>
16 #include <linux/slab.h>
17 #include <linux/user_namespace.h>
18 #include <linux/uidgid.h>
19 #include <linux/xattr.h>
20 #include <linux/posix_acl.h>
21 #include <linux/posix_acl_xattr.h>
22 #include <linux/uio.h>
24 struct shiftfs_super_info
{
26 struct user_namespace
*userns
;
27 /* creds of process who created the super block */
28 const struct cred
*creator_cred
;
30 unsigned int passthrough
;
31 unsigned int passthrough_mark
;
34 static void shiftfs_fill_inode(struct inode
*inode
, unsigned long ino
,
35 umode_t mode
, dev_t dev
, struct dentry
*dentry
);
37 #define SHIFTFS_PASSTHROUGH_NONE 0
38 #define SHIFTFS_PASSTHROUGH_STAT 1
39 #define SHIFTFS_PASSTHROUGH_IOCTL 2
40 #define SHIFTFS_PASSTHROUGH_ALL \
41 (SHIFTFS_PASSTHROUGH_STAT | SHIFTFS_PASSTHROUGH_IOCTL)
43 static inline bool shiftfs_passthrough_ioctls(struct shiftfs_super_info
*info
)
45 if (!(info
->passthrough
& SHIFTFS_PASSTHROUGH_IOCTL
))
51 static inline bool shiftfs_passthrough_statfs(struct shiftfs_super_info
*info
)
53 if (!(info
->passthrough
& SHIFTFS_PASSTHROUGH_STAT
))
65 /* global filesystem options */
66 static const match_table_t tokens
= {
68 { OPT_PASSTHROUGH
, "passthrough=%u" },
72 static const struct cred
*shiftfs_override_creds(const struct super_block
*sb
)
74 struct shiftfs_super_info
*sbinfo
= sb
->s_fs_info
;
76 return override_creds(sbinfo
->creator_cred
);
79 static inline void shiftfs_revert_object_creds(const struct cred
*oldcred
,
82 revert_creds(oldcred
);
86 static int shiftfs_override_object_creds(const struct super_block
*sb
,
87 const struct cred
**oldcred
,
88 struct cred
**newcred
,
89 struct dentry
*dentry
, umode_t mode
,
92 kuid_t fsuid
= current_fsuid();
93 kgid_t fsgid
= current_fsgid();
95 *oldcred
= shiftfs_override_creds(sb
);
97 *newcred
= prepare_creds();
99 revert_creds(*oldcred
);
103 (*newcred
)->fsuid
= KUIDT_INIT(from_kuid(sb
->s_user_ns
, fsuid
));
104 (*newcred
)->fsgid
= KGIDT_INIT(from_kgid(sb
->s_user_ns
, fsgid
));
107 int err
= security_dentry_create_files_as(dentry
, mode
,
111 shiftfs_revert_object_creds(*oldcred
, *newcred
);
116 put_cred(override_creds(*newcred
));
120 static kuid_t
shift_kuid(struct user_namespace
*from
, struct user_namespace
*to
,
123 uid_t uid
= from_kuid(from
, kuid
);
124 return make_kuid(to
, uid
);
127 static kgid_t
shift_kgid(struct user_namespace
*from
, struct user_namespace
*to
,
130 gid_t gid
= from_kgid(from
, kgid
);
131 return make_kgid(to
, gid
);
134 static void shiftfs_copyattr(struct inode
*from
, struct inode
*to
)
136 struct user_namespace
*from_ns
= from
->i_sb
->s_user_ns
;
137 struct user_namespace
*to_ns
= to
->i_sb
->s_user_ns
;
139 to
->i_uid
= shift_kuid(from_ns
, to_ns
, from
->i_uid
);
140 to
->i_gid
= shift_kgid(from_ns
, to_ns
, from
->i_gid
);
141 to
->i_mode
= from
->i_mode
;
142 to
->i_atime
= from
->i_atime
;
143 to
->i_mtime
= from
->i_mtime
;
144 to
->i_ctime
= from
->i_ctime
;
145 i_size_write(to
, i_size_read(from
));
148 static void shiftfs_copyflags(struct inode
*from
, struct inode
*to
)
150 unsigned int mask
= S_SYNC
| S_IMMUTABLE
| S_APPEND
| S_NOATIME
;
152 inode_set_flags(to
, from
->i_flags
& mask
, mask
);
155 static void shiftfs_file_accessed(struct file
*file
)
157 struct inode
*upperi
, *loweri
;
159 if (file
->f_flags
& O_NOATIME
)
162 upperi
= file_inode(file
);
163 loweri
= upperi
->i_private
;
168 upperi
->i_mtime
= loweri
->i_mtime
;
169 upperi
->i_ctime
= loweri
->i_ctime
;
171 touch_atime(&file
->f_path
);
174 static int shiftfs_parse_mount_options(struct shiftfs_super_info
*sbinfo
,
178 substring_t args
[MAX_OPT_ARGS
];
180 sbinfo
->mark
= false;
181 sbinfo
->passthrough
= 0;
183 while ((p
= strsep(&options
, ",")) != NULL
) {
184 int err
, intarg
, token
;
189 token
= match_token(p
, tokens
, args
);
194 case OPT_PASSTHROUGH
:
195 err
= match_int(&args
[0], &intarg
);
199 if (intarg
& ~SHIFTFS_PASSTHROUGH_ALL
)
202 sbinfo
->passthrough
= intarg
;
212 static void shiftfs_d_release(struct dentry
*dentry
)
214 struct dentry
*lowerd
= dentry
->d_fsdata
;
220 static struct dentry
*shiftfs_d_real(struct dentry
*dentry
,
221 const struct inode
*inode
)
223 struct dentry
*lowerd
= dentry
->d_fsdata
;
225 if (inode
&& d_inode(dentry
) == inode
)
228 lowerd
= d_real(lowerd
, inode
);
229 if (lowerd
&& (!inode
|| inode
== d_inode(lowerd
)))
232 WARN(1, "shiftfs_d_real(%pd4, %s:%lu): real dentry not found\n", dentry
,
233 inode
? inode
->i_sb
->s_id
: "NULL", inode
? inode
->i_ino
: 0);
237 static int shiftfs_d_weak_revalidate(struct dentry
*dentry
, unsigned int flags
)
240 struct dentry
*lowerd
= dentry
->d_fsdata
;
242 if (d_is_negative(lowerd
) != d_is_negative(dentry
))
245 if ((lowerd
->d_flags
& DCACHE_OP_WEAK_REVALIDATE
))
246 err
= lowerd
->d_op
->d_weak_revalidate(lowerd
, flags
);
248 if (d_really_is_positive(dentry
)) {
249 struct inode
*inode
= d_inode(dentry
);
250 struct inode
*loweri
= d_inode(lowerd
);
252 shiftfs_copyattr(loweri
, inode
);
260 static int shiftfs_d_revalidate(struct dentry
*dentry
, unsigned int flags
)
263 struct dentry
*lowerd
= dentry
->d_fsdata
;
265 if (d_unhashed(lowerd
) ||
266 ((d_is_negative(lowerd
) != d_is_negative(dentry
))))
269 if (flags
& LOOKUP_RCU
)
272 if ((lowerd
->d_flags
& DCACHE_OP_REVALIDATE
))
273 err
= lowerd
->d_op
->d_revalidate(lowerd
, flags
);
275 if (d_really_is_positive(dentry
)) {
276 struct inode
*inode
= d_inode(dentry
);
277 struct inode
*loweri
= d_inode(lowerd
);
279 shiftfs_copyattr(loweri
, inode
);
287 static const struct dentry_operations shiftfs_dentry_ops
= {
288 .d_release
= shiftfs_d_release
,
289 .d_real
= shiftfs_d_real
,
290 .d_revalidate
= shiftfs_d_revalidate
,
291 .d_weak_revalidate
= shiftfs_d_weak_revalidate
,
294 static const char *shiftfs_get_link(struct dentry
*dentry
, struct inode
*inode
,
295 struct delayed_call
*done
)
298 const struct cred
*oldcred
;
299 struct dentry
*lowerd
;
301 /* RCU lookup not supported */
303 return ERR_PTR(-ECHILD
);
305 lowerd
= dentry
->d_fsdata
;
306 oldcred
= shiftfs_override_creds(dentry
->d_sb
);
307 p
= vfs_get_link(lowerd
, done
);
308 revert_creds(oldcred
);
313 static int shiftfs_setxattr(struct dentry
*dentry
, struct inode
*inode
,
314 const char *name
, const void *value
,
315 size_t size
, int flags
)
317 struct dentry
*lowerd
= dentry
->d_fsdata
;
319 const struct cred
*oldcred
;
321 oldcred
= shiftfs_override_creds(dentry
->d_sb
);
322 err
= vfs_setxattr(lowerd
, name
, value
, size
, flags
);
323 revert_creds(oldcred
);
325 shiftfs_copyattr(lowerd
->d_inode
, inode
);
330 static int shiftfs_xattr_get(const struct xattr_handler
*handler
,
331 struct dentry
*dentry
, struct inode
*inode
,
332 const char *name
, void *value
, size_t size
)
334 struct dentry
*lowerd
= dentry
->d_fsdata
;
336 const struct cred
*oldcred
;
338 oldcred
= shiftfs_override_creds(dentry
->d_sb
);
339 err
= vfs_getxattr(lowerd
, name
, value
, size
);
340 revert_creds(oldcred
);
345 static ssize_t
shiftfs_listxattr(struct dentry
*dentry
, char *list
,
348 struct dentry
*lowerd
= dentry
->d_fsdata
;
350 const struct cred
*oldcred
;
352 oldcred
= shiftfs_override_creds(dentry
->d_sb
);
353 err
= vfs_listxattr(lowerd
, list
, size
);
354 revert_creds(oldcred
);
359 static int shiftfs_removexattr(struct dentry
*dentry
, const char *name
)
361 struct dentry
*lowerd
= dentry
->d_fsdata
;
363 const struct cred
*oldcred
;
365 oldcred
= shiftfs_override_creds(dentry
->d_sb
);
366 err
= vfs_removexattr(lowerd
, name
);
367 revert_creds(oldcred
);
370 shiftfs_copyattr(lowerd
->d_inode
, d_inode(dentry
));
375 static int shiftfs_xattr_set(const struct xattr_handler
*handler
,
376 struct dentry
*dentry
, struct inode
*inode
,
377 const char *name
, const void *value
, size_t size
,
381 return shiftfs_removexattr(dentry
, name
);
382 return shiftfs_setxattr(dentry
, inode
, name
, value
, size
, flags
);
385 static int shiftfs_inode_test(struct inode
*inode
, void *data
)
387 return inode
->i_private
== data
;
390 static int shiftfs_inode_set(struct inode
*inode
, void *data
)
392 inode
->i_private
= data
;
396 static int shiftfs_create_object(struct inode
*diri
, struct dentry
*dentry
,
397 umode_t mode
, const char *symlink
,
398 struct dentry
*hardlink
, bool excl
)
401 const struct cred
*oldcred
;
402 struct cred
*newcred
;
403 void *loweri_iop_ptr
= NULL
;
404 umode_t modei
= mode
;
405 struct super_block
*dir_sb
= diri
->i_sb
;
406 struct dentry
*lowerd_new
= dentry
->d_fsdata
;
407 struct inode
*inode
= NULL
, *loweri_dir
= diri
->i_private
;
408 const struct inode_operations
*loweri_dir_iop
= loweri_dir
->i_op
;
409 struct dentry
*lowerd_link
= NULL
;
412 loweri_iop_ptr
= loweri_dir_iop
->link
;
414 switch (mode
& S_IFMT
) {
416 loweri_iop_ptr
= loweri_dir_iop
->mkdir
;
419 loweri_iop_ptr
= loweri_dir_iop
->create
;
422 loweri_iop_ptr
= loweri_dir_iop
->symlink
;
427 loweri_iop_ptr
= loweri_dir_iop
->mknod
;
431 if (!loweri_iop_ptr
) {
436 inode_lock_nested(loweri_dir
, I_MUTEX_PARENT
);
439 inode
= new_inode(dir_sb
);
446 * new_inode() will have added the new inode to the super
447 * block's list of inodes. Further below we will call
448 * inode_insert5() Which would perform the same operation again
449 * thereby corrupting the list. To avoid this raise I_CREATING
450 * in i_state which will cause inode_insert5() to skip this
451 * step. I_CREATING will be cleared by d_instantiate_new()
454 spin_lock(&inode
->i_lock
);
455 inode
->i_state
|= I_CREATING
;
456 spin_unlock(&inode
->i_lock
);
458 inode_init_owner(inode
, diri
, mode
);
459 modei
= inode
->i_mode
;
462 err
= shiftfs_override_object_creds(dentry
->d_sb
, &oldcred
, &newcred
,
463 dentry
, modei
, hardlink
!= NULL
);
468 lowerd_link
= hardlink
->d_fsdata
;
469 err
= vfs_link(lowerd_link
, loweri_dir
, lowerd_new
, NULL
);
471 switch (modei
& S_IFMT
) {
473 err
= vfs_mkdir(loweri_dir
, lowerd_new
, modei
);
476 err
= vfs_create(loweri_dir
, lowerd_new
, modei
, excl
);
479 err
= vfs_symlink(loweri_dir
, lowerd_new
, symlink
);
484 err
= vfs_mknod(loweri_dir
, lowerd_new
, modei
, 0);
492 shiftfs_revert_object_creds(oldcred
, newcred
);
494 if (!err
&& WARN_ON(!lowerd_new
->d_inode
))
500 inode
= d_inode(hardlink
);
503 /* copy up times from lower inode */
504 shiftfs_copyattr(d_inode(lowerd_link
), inode
);
505 set_nlink(d_inode(hardlink
), d_inode(lowerd_link
)->i_nlink
);
506 d_instantiate(dentry
, inode
);
508 struct inode
*inode_tmp
;
509 struct inode
*loweri_new
= d_inode(lowerd_new
);
511 inode_tmp
= inode_insert5(inode
, (unsigned long)loweri_new
,
512 shiftfs_inode_test
, shiftfs_inode_set
,
514 if (unlikely(inode_tmp
!= inode
)) {
515 pr_err_ratelimited("shiftfs: newly created inode found in cache\n");
522 shiftfs_fill_inode(inode
, loweri_new
->i_ino
, loweri_new
->i_mode
,
524 d_instantiate_new(dentry
, inode
);
527 shiftfs_copyattr(loweri_dir
, diri
);
528 if (loweri_iop_ptr
== loweri_dir_iop
->mkdir
)
529 set_nlink(diri
, loweri_dir
->i_nlink
);
535 inode_unlock(loweri_dir
);
540 static int shiftfs_create(struct inode
*dir
, struct dentry
*dentry
,
541 umode_t mode
, bool excl
)
545 return shiftfs_create_object(dir
, dentry
, mode
, NULL
, NULL
, excl
);
548 static int shiftfs_mkdir(struct inode
*dir
, struct dentry
*dentry
,
553 return shiftfs_create_object(dir
, dentry
, mode
, NULL
, NULL
, false);
556 static int shiftfs_link(struct dentry
*hardlink
, struct inode
*dir
,
557 struct dentry
*dentry
)
559 return shiftfs_create_object(dir
, dentry
, 0, NULL
, hardlink
, false);
562 static int shiftfs_mknod(struct inode
*dir
, struct dentry
*dentry
, umode_t mode
,
565 if (!S_ISFIFO(mode
) && !S_ISSOCK(mode
))
568 return shiftfs_create_object(dir
, dentry
, mode
, NULL
, NULL
, false);
571 static int shiftfs_symlink(struct inode
*dir
, struct dentry
*dentry
,
574 return shiftfs_create_object(dir
, dentry
, S_IFLNK
, symlink
, NULL
, false);
577 static int shiftfs_rm(struct inode
*dir
, struct dentry
*dentry
, bool rmdir
)
579 struct dentry
*lowerd
= dentry
->d_fsdata
;
580 struct inode
*loweri
= dir
->i_private
;
581 struct inode
*inode
= d_inode(dentry
);
583 const struct cred
*oldcred
;
585 oldcred
= shiftfs_override_creds(dentry
->d_sb
);
586 inode_lock_nested(loweri
, I_MUTEX_PARENT
);
588 err
= vfs_rmdir(loweri
, lowerd
);
590 err
= vfs_unlink(loweri
, lowerd
, NULL
);
591 revert_creds(oldcred
);
601 inode_unlock(loweri
);
603 shiftfs_copyattr(loweri
, dir
);
608 static int shiftfs_unlink(struct inode
*dir
, struct dentry
*dentry
)
610 return shiftfs_rm(dir
, dentry
, false);
613 static int shiftfs_rmdir(struct inode
*dir
, struct dentry
*dentry
)
615 return shiftfs_rm(dir
, dentry
, true);
618 static int shiftfs_rename(struct inode
*olddir
, struct dentry
*old
,
619 struct inode
*newdir
, struct dentry
*new,
622 struct dentry
*lowerd_dir_old
= old
->d_parent
->d_fsdata
,
623 *lowerd_dir_new
= new->d_parent
->d_fsdata
,
624 *lowerd_old
= old
->d_fsdata
, *lowerd_new
= new->d_fsdata
,
626 struct inode
*loweri_dir_old
= lowerd_dir_old
->d_inode
,
627 *loweri_dir_new
= lowerd_dir_new
->d_inode
;
629 const struct cred
*oldcred
;
631 trapd
= lock_rename(lowerd_dir_new
, lowerd_dir_old
);
633 if (trapd
== lowerd_old
|| trapd
== lowerd_new
)
636 oldcred
= shiftfs_override_creds(old
->d_sb
);
637 err
= vfs_rename(loweri_dir_old
, lowerd_old
, loweri_dir_new
, lowerd_new
,
639 revert_creds(oldcred
);
641 shiftfs_copyattr(loweri_dir_old
, olddir
);
642 shiftfs_copyattr(loweri_dir_new
, newdir
);
645 unlock_rename(lowerd_dir_new
, lowerd_dir_old
);
650 static struct dentry
*shiftfs_lookup(struct inode
*dir
, struct dentry
*dentry
,
655 const struct cred
*oldcred
;
656 struct dentry
*lowerd
= dentry
->d_parent
->d_fsdata
;
657 struct inode
*inode
= NULL
, *loweri
= lowerd
->d_inode
;
660 oldcred
= shiftfs_override_creds(dentry
->d_sb
);
661 new = lookup_one_len(dentry
->d_name
.name
, lowerd
, dentry
->d_name
.len
);
662 revert_creds(oldcred
);
663 inode_unlock(loweri
);
668 dentry
->d_fsdata
= new;
674 inode
= iget5_locked(dentry
->d_sb
, (unsigned long)newi
,
675 shiftfs_inode_test
, shiftfs_inode_set
, newi
);
678 return ERR_PTR(-ENOMEM
);
680 if (inode
->i_state
& I_NEW
) {
682 * inode->i_private set by shiftfs_inode_set(), but we still
683 * need to take a reference
686 shiftfs_fill_inode(inode
, newi
->i_ino
, newi
->i_mode
, 0, new);
687 unlock_new_inode(inode
);
691 return d_splice_alias(inode
, dentry
);
694 static int shiftfs_permission(struct inode
*inode
, int mask
)
697 const struct cred
*oldcred
;
698 struct inode
*loweri
= inode
->i_private
;
701 WARN_ON(!(mask
& MAY_NOT_BLOCK
));
705 err
= generic_permission(inode
, mask
);
709 oldcred
= shiftfs_override_creds(inode
->i_sb
);
710 err
= inode_permission(loweri
, mask
);
711 revert_creds(oldcred
);
716 static int shiftfs_fiemap(struct inode
*inode
,
717 struct fiemap_extent_info
*fieinfo
, u64 start
,
721 const struct cred
*oldcred
;
722 struct inode
*loweri
= inode
->i_private
;
724 if (!loweri
->i_op
->fiemap
)
727 oldcred
= shiftfs_override_creds(inode
->i_sb
);
728 if (fieinfo
->fi_flags
& FIEMAP_FLAG_SYNC
)
729 filemap_write_and_wait(loweri
->i_mapping
);
730 err
= loweri
->i_op
->fiemap(loweri
, fieinfo
, start
, len
);
731 revert_creds(oldcred
);
736 static int shiftfs_tmpfile(struct inode
*dir
, struct dentry
*dentry
,
740 const struct cred
*oldcred
;
741 struct dentry
*lowerd
= dentry
->d_fsdata
;
742 struct inode
*loweri
= dir
->i_private
;
744 if (!loweri
->i_op
->tmpfile
)
747 oldcred
= shiftfs_override_creds(dir
->i_sb
);
748 err
= loweri
->i_op
->tmpfile(loweri
, lowerd
, mode
);
749 revert_creds(oldcred
);
754 static int shiftfs_setattr(struct dentry
*dentry
, struct iattr
*attr
)
756 struct dentry
*lowerd
= dentry
->d_fsdata
;
757 struct inode
*loweri
= lowerd
->d_inode
;
758 struct iattr newattr
;
759 const struct cred
*oldcred
;
760 struct super_block
*sb
= dentry
->d_sb
;
763 err
= setattr_prepare(dentry
, attr
);
768 newattr
.ia_uid
= KUIDT_INIT(from_kuid(sb
->s_user_ns
, attr
->ia_uid
));
769 newattr
.ia_gid
= KGIDT_INIT(from_kgid(sb
->s_user_ns
, attr
->ia_gid
));
772 * mode change is for clearing setuid/setgid bits. Allow lower fs
773 * to interpret this in its own way.
775 if (newattr
.ia_valid
& (ATTR_KILL_SUID
|ATTR_KILL_SGID
))
776 newattr
.ia_valid
&= ~ATTR_MODE
;
779 oldcred
= shiftfs_override_creds(dentry
->d_sb
);
780 err
= notify_change(lowerd
, &newattr
, NULL
);
781 revert_creds(oldcred
);
782 inode_unlock(loweri
);
784 shiftfs_copyattr(loweri
, d_inode(dentry
));
789 static int shiftfs_getattr(const struct path
*path
, struct kstat
*stat
,
790 u32 request_mask
, unsigned int query_flags
)
792 struct inode
*inode
= path
->dentry
->d_inode
;
793 struct dentry
*lowerd
= path
->dentry
->d_fsdata
;
794 struct inode
*loweri
= lowerd
->d_inode
;
795 struct shiftfs_super_info
*info
= path
->dentry
->d_sb
->s_fs_info
;
796 struct path newpath
= { .mnt
= info
->mnt
, .dentry
= lowerd
};
797 struct user_namespace
*from_ns
= loweri
->i_sb
->s_user_ns
;
798 struct user_namespace
*to_ns
= inode
->i_sb
->s_user_ns
;
799 const struct cred
*oldcred
;
802 oldcred
= shiftfs_override_creds(inode
->i_sb
);
803 err
= vfs_getattr(&newpath
, stat
, request_mask
, query_flags
);
804 revert_creds(oldcred
);
809 /* transform the underlying id */
810 stat
->uid
= shift_kuid(from_ns
, to_ns
, stat
->uid
);
811 stat
->gid
= shift_kgid(from_ns
, to_ns
, stat
->gid
);
815 #ifdef CONFIG_SHIFT_FS_POSIX_ACL
818 shift_acl_ids(struct user_namespace
*from
, struct user_namespace
*to
,
819 struct posix_acl
*acl
)
823 for (i
= 0; i
< acl
->a_count
; i
++) {
824 struct posix_acl_entry
*e
= &acl
->a_entries
[i
];
827 e
->e_uid
= shift_kuid(from
, to
, e
->e_uid
);
828 if (!uid_valid(e
->e_uid
))
832 e
->e_gid
= shift_kgid(from
, to
, e
->e_gid
);
833 if (!gid_valid(e
->e_gid
))
842 shift_acl_xattr_ids(struct user_namespace
*from
, struct user_namespace
*to
,
843 void *value
, size_t size
)
845 struct posix_acl_xattr_header
*header
= value
;
846 struct posix_acl_xattr_entry
*entry
= (void *)(header
+ 1), *end
;
853 if (size
< sizeof(struct posix_acl_xattr_header
))
855 if (header
->a_version
!= cpu_to_le32(POSIX_ACL_XATTR_VERSION
))
858 count
= posix_acl_xattr_count(size
);
864 for (end
= entry
+ count
; entry
!= end
; entry
++) {
865 switch(le16_to_cpu(entry
->e_tag
)) {
867 kuid
= make_kuid(&init_user_ns
, le32_to_cpu(entry
->e_id
));
868 kuid
= shift_kuid(from
, to
, kuid
);
869 entry
->e_id
= cpu_to_le32(from_kuid(&init_user_ns
, kuid
));
872 kgid
= make_kgid(&init_user_ns
, le32_to_cpu(entry
->e_id
));
873 kgid
= shift_kgid(from
, to
, kgid
);
874 entry
->e_id
= cpu_to_le32(from_kgid(&init_user_ns
, kgid
));
882 static struct posix_acl
*shiftfs_get_acl(struct inode
*inode
, int type
)
884 struct inode
*loweri
= inode
->i_private
;
885 const struct cred
*oldcred
;
886 struct posix_acl
*lower_acl
, *acl
= NULL
;
887 struct user_namespace
*from_ns
= loweri
->i_sb
->s_user_ns
;
888 struct user_namespace
*to_ns
= inode
->i_sb
->s_user_ns
;
892 if (!IS_POSIXACL(loweri
))
895 oldcred
= shiftfs_override_creds(inode
->i_sb
);
896 lower_acl
= get_acl(loweri
, type
);
897 revert_creds(oldcred
);
899 if (lower_acl
&& !IS_ERR(lower_acl
)) {
900 /* XXX: export posix_acl_clone? */
901 size
= sizeof(struct posix_acl
) +
902 lower_acl
->a_count
* sizeof(struct posix_acl_entry
);
903 acl
= kmemdup(lower_acl
, size
, GFP_KERNEL
);
904 posix_acl_release(lower_acl
);
907 return ERR_PTR(-ENOMEM
);
909 refcount_set(&acl
->a_refcount
, 1);
911 err
= shift_acl_ids(from_ns
, to_ns
, acl
);
922 shiftfs_posix_acl_xattr_get(const struct xattr_handler
*handler
,
923 struct dentry
*dentry
, struct inode
*inode
,
924 const char *name
, void *buffer
, size_t size
)
926 struct inode
*loweri
= inode
->i_private
;
929 ret
= shiftfs_xattr_get(NULL
, dentry
, inode
, handler
->name
,
935 shift_acl_xattr_ids(loweri
->i_sb
->s_user_ns
, inode
->i_sb
->s_user_ns
,
937 inode_unlock(loweri
);
942 shiftfs_posix_acl_xattr_set(const struct xattr_handler
*handler
,
943 struct dentry
*dentry
, struct inode
*inode
,
944 const char *name
, const void *value
,
945 size_t size
, int flags
)
947 struct inode
*loweri
= inode
->i_private
;
950 if (!IS_POSIXACL(loweri
) || !loweri
->i_op
->set_acl
)
952 if (handler
->flags
== ACL_TYPE_DEFAULT
&& !S_ISDIR(inode
->i_mode
))
953 return value
? -EACCES
: 0;
954 if (!inode_owner_or_capable(inode
))
958 shift_acl_xattr_ids(inode
->i_sb
->s_user_ns
,
959 loweri
->i_sb
->s_user_ns
,
960 (void *)value
, size
);
961 err
= shiftfs_setxattr(dentry
, inode
, handler
->name
, value
,
964 err
= shiftfs_removexattr(dentry
, handler
->name
);
968 shiftfs_copyattr(loweri
, inode
);
973 static const struct xattr_handler
974 shiftfs_posix_acl_access_xattr_handler
= {
975 .name
= XATTR_NAME_POSIX_ACL_ACCESS
,
976 .flags
= ACL_TYPE_ACCESS
,
977 .get
= shiftfs_posix_acl_xattr_get
,
978 .set
= shiftfs_posix_acl_xattr_set
,
981 static const struct xattr_handler
982 shiftfs_posix_acl_default_xattr_handler
= {
983 .name
= XATTR_NAME_POSIX_ACL_DEFAULT
,
984 .flags
= ACL_TYPE_DEFAULT
,
985 .get
= shiftfs_posix_acl_xattr_get
,
986 .set
= shiftfs_posix_acl_xattr_set
,
989 #else /* !CONFIG_SHIFT_FS_POSIX_ACL */
991 #define shiftfs_get_acl NULL
993 #endif /* CONFIG_SHIFT_FS_POSIX_ACL */
995 static const struct inode_operations shiftfs_dir_inode_operations
= {
996 .lookup
= shiftfs_lookup
,
997 .mkdir
= shiftfs_mkdir
,
998 .symlink
= shiftfs_symlink
,
999 .unlink
= shiftfs_unlink
,
1000 .rmdir
= shiftfs_rmdir
,
1001 .rename
= shiftfs_rename
,
1002 .link
= shiftfs_link
,
1003 .setattr
= shiftfs_setattr
,
1004 .create
= shiftfs_create
,
1005 .mknod
= shiftfs_mknod
,
1006 .permission
= shiftfs_permission
,
1007 .getattr
= shiftfs_getattr
,
1008 .listxattr
= shiftfs_listxattr
,
1009 .get_acl
= shiftfs_get_acl
,
1012 static const struct inode_operations shiftfs_file_inode_operations
= {
1013 .fiemap
= shiftfs_fiemap
,
1014 .getattr
= shiftfs_getattr
,
1015 .get_acl
= shiftfs_get_acl
,
1016 .listxattr
= shiftfs_listxattr
,
1017 .permission
= shiftfs_permission
,
1018 .setattr
= shiftfs_setattr
,
1019 .tmpfile
= shiftfs_tmpfile
,
1022 static const struct inode_operations shiftfs_special_inode_operations
= {
1023 .getattr
= shiftfs_getattr
,
1024 .get_acl
= shiftfs_get_acl
,
1025 .listxattr
= shiftfs_listxattr
,
1026 .permission
= shiftfs_permission
,
1027 .setattr
= shiftfs_setattr
,
1030 static const struct inode_operations shiftfs_symlink_inode_operations
= {
1031 .getattr
= shiftfs_getattr
,
1032 .get_link
= shiftfs_get_link
,
1033 .listxattr
= shiftfs_listxattr
,
1034 .setattr
= shiftfs_setattr
,
1037 static struct file
*shiftfs_open_realfile(const struct file
*file
,
1038 struct inode
*realinode
)
1040 struct file
*realfile
;
1041 const struct cred
*old_cred
;
1042 struct inode
*inode
= file_inode(file
);
1043 struct dentry
*lowerd
= file
->f_path
.dentry
->d_fsdata
;
1044 struct shiftfs_super_info
*info
= inode
->i_sb
->s_fs_info
;
1045 struct path realpath
= { .mnt
= info
->mnt
, .dentry
= lowerd
};
1047 old_cred
= shiftfs_override_creds(inode
->i_sb
);
1048 realfile
= open_with_fake_path(&realpath
, file
->f_flags
, realinode
,
1049 info
->creator_cred
);
1050 revert_creds(old_cred
);
1055 #define SHIFTFS_SETFL_MASK (O_APPEND | O_NONBLOCK | O_NDELAY | O_DIRECT)
1057 static int shiftfs_change_flags(struct file
*file
, unsigned int flags
)
1059 struct inode
*inode
= file_inode(file
);
1062 /* if some flag changed that cannot be changed then something's amiss */
1063 if (WARN_ON((file
->f_flags
^ flags
) & ~SHIFTFS_SETFL_MASK
))
1066 flags
&= SHIFTFS_SETFL_MASK
;
1068 if (((flags
^ file
->f_flags
) & O_APPEND
) && IS_APPEND(inode
))
1071 if (flags
& O_DIRECT
) {
1072 if (!file
->f_mapping
->a_ops
||
1073 !file
->f_mapping
->a_ops
->direct_IO
)
1077 if (file
->f_op
->check_flags
) {
1078 err
= file
->f_op
->check_flags(flags
);
1083 spin_lock(&file
->f_lock
);
1084 file
->f_flags
= (file
->f_flags
& ~SHIFTFS_SETFL_MASK
) | flags
;
1085 spin_unlock(&file
->f_lock
);
1090 static int shiftfs_real_fdget(const struct file
*file
, struct fd
*lowerfd
)
1092 struct file
*realfile
= file
->private_data
;
1095 lowerfd
->file
= realfile
;
1097 /* Did the flags change since open? */
1098 if (unlikely(file
->f_flags
& ~lowerfd
->file
->f_flags
))
1099 return shiftfs_change_flags(lowerfd
->file
, file
->f_flags
);
1104 static int shiftfs_open(struct inode
*inode
, struct file
*file
)
1106 struct file
*realfile
;
1108 realfile
= shiftfs_open_realfile(file
, inode
->i_private
);
1109 if (IS_ERR(realfile
))
1110 return PTR_ERR(realfile
);
1112 file
->private_data
= realfile
;
1113 /* For O_DIRECT dentry_open() checks f_mapping->a_ops->direct_IO. */
1114 file
->f_mapping
= realfile
->f_mapping
;
1119 static int shiftfs_dir_open(struct inode
*inode
, struct file
*file
)
1121 struct file
*realfile
;
1122 const struct cred
*oldcred
;
1123 struct dentry
*lowerd
= file
->f_path
.dentry
->d_fsdata
;
1124 struct shiftfs_super_info
*info
= inode
->i_sb
->s_fs_info
;
1125 struct path realpath
= { .mnt
= info
->mnt
, .dentry
= lowerd
};
1127 oldcred
= shiftfs_override_creds(file
->f_path
.dentry
->d_sb
);
1128 realfile
= dentry_open(&realpath
, file
->f_flags
| O_NOATIME
,
1129 info
->creator_cred
);
1130 revert_creds(oldcred
);
1131 if (IS_ERR(realfile
))
1132 return PTR_ERR(realfile
);
1134 file
->private_data
= realfile
;
1139 static int shiftfs_release(struct inode
*inode
, struct file
*file
)
1141 struct file
*realfile
= file
->private_data
;
1149 static int shiftfs_dir_release(struct inode
*inode
, struct file
*file
)
1151 return shiftfs_release(inode
, file
);
1154 static loff_t
shiftfs_dir_llseek(struct file
*file
, loff_t offset
, int whence
)
1156 struct file
*realfile
= file
->private_data
;
1158 return vfs_llseek(realfile
, offset
, whence
);
1161 static loff_t
shiftfs_file_llseek(struct file
*file
, loff_t offset
, int whence
)
1163 struct inode
*realinode
= file_inode(file
)->i_private
;
1165 return generic_file_llseek_size(file
, offset
, whence
,
1166 realinode
->i_sb
->s_maxbytes
,
1167 i_size_read(realinode
));
1170 /* XXX: Need to figure out what to to about atime updates, maybe other
1171 * timestamps too ... ref. ovl_file_accessed() */
1173 static rwf_t
shiftfs_iocb_to_rwf(struct kiocb
*iocb
)
1175 int ifl
= iocb
->ki_flags
;
1178 if (ifl
& IOCB_NOWAIT
)
1179 flags
|= RWF_NOWAIT
;
1180 if (ifl
& IOCB_HIPRI
)
1182 if (ifl
& IOCB_DSYNC
)
1184 if (ifl
& IOCB_SYNC
)
1190 static ssize_t
shiftfs_read_iter(struct kiocb
*iocb
, struct iov_iter
*iter
)
1192 struct file
*file
= iocb
->ki_filp
;
1194 const struct cred
*oldcred
;
1197 if (!iov_iter_count(iter
))
1200 ret
= shiftfs_real_fdget(file
, &lowerfd
);
1204 oldcred
= shiftfs_override_creds(file
->f_path
.dentry
->d_sb
);
1205 ret
= vfs_iter_read(lowerfd
.file
, iter
, &iocb
->ki_pos
,
1206 shiftfs_iocb_to_rwf(iocb
));
1207 revert_creds(oldcred
);
1209 shiftfs_file_accessed(file
);
1215 static ssize_t
shiftfs_write_iter(struct kiocb
*iocb
, struct iov_iter
*iter
)
1217 struct file
*file
= iocb
->ki_filp
;
1218 struct inode
*inode
= file_inode(file
);
1220 const struct cred
*oldcred
;
1223 if (!iov_iter_count(iter
))
1228 shiftfs_copyattr(inode
->i_private
, inode
);
1229 ret
= file_remove_privs(file
);
1233 ret
= shiftfs_real_fdget(file
, &lowerfd
);
1237 oldcred
= shiftfs_override_creds(file
->f_path
.dentry
->d_sb
);
1238 file_start_write(lowerfd
.file
);
1239 ret
= vfs_iter_write(lowerfd
.file
, iter
, &iocb
->ki_pos
,
1240 shiftfs_iocb_to_rwf(iocb
));
1241 file_end_write(lowerfd
.file
);
1242 revert_creds(oldcred
);
1245 shiftfs_copyattr(inode
->i_private
, inode
);
1250 inode_unlock(inode
);
1254 static int shiftfs_fsync(struct file
*file
, loff_t start
, loff_t end
,
1258 const struct cred
*oldcred
;
1261 ret
= shiftfs_real_fdget(file
, &lowerfd
);
1265 oldcred
= shiftfs_override_creds(file
->f_path
.dentry
->d_sb
);
1266 ret
= vfs_fsync_range(lowerfd
.file
, start
, end
, datasync
);
1267 revert_creds(oldcred
);
1273 static int shiftfs_mmap(struct file
*file
, struct vm_area_struct
*vma
)
1275 struct file
*realfile
= file
->private_data
;
1276 const struct cred
*oldcred
;
1279 if (!realfile
->f_op
->mmap
)
1282 if (WARN_ON(file
!= vma
->vm_file
))
1285 oldcred
= shiftfs_override_creds(file
->f_path
.dentry
->d_sb
);
1286 vma
->vm_file
= get_file(realfile
);
1287 ret
= call_mmap(vma
->vm_file
, vma
);
1288 revert_creds(oldcred
);
1290 shiftfs_file_accessed(file
);
1293 fput(realfile
); /* Drop refcount from new vm_file value */
1295 fput(file
); /* Drop refcount from previous vm_file value */
1300 static long shiftfs_fallocate(struct file
*file
, int mode
, loff_t offset
,
1303 struct inode
*inode
= file_inode(file
);
1304 struct inode
*loweri
= inode
->i_private
;
1306 const struct cred
*oldcred
;
1309 ret
= shiftfs_real_fdget(file
, &lowerfd
);
1313 oldcred
= shiftfs_override_creds(file
->f_path
.dentry
->d_sb
);
1314 ret
= vfs_fallocate(lowerfd
.file
, mode
, offset
, len
);
1315 revert_creds(oldcred
);
1318 shiftfs_copyattr(loweri
, inode
);
1324 static int shiftfs_fadvise(struct file
*file
, loff_t offset
, loff_t len
,
1328 const struct cred
*oldcred
;
1331 ret
= shiftfs_real_fdget(file
, &lowerfd
);
1335 oldcred
= shiftfs_override_creds(file
->f_path
.dentry
->d_sb
);
1336 ret
= vfs_fadvise(lowerfd
.file
, offset
, len
, advice
);
1337 revert_creds(oldcred
);
1343 static int shiftfs_override_ioctl_creds(const struct super_block
*sb
,
1344 const struct cred
**oldcred
,
1345 struct cred
**newcred
)
1347 kuid_t fsuid
= current_fsuid();
1348 kgid_t fsgid
= current_fsgid();
1350 *oldcred
= shiftfs_override_creds(sb
);
1352 *newcred
= prepare_creds();
1354 revert_creds(*oldcred
);
1358 (*newcred
)->fsuid
= KUIDT_INIT(from_kuid(sb
->s_user_ns
, fsuid
));
1359 (*newcred
)->fsgid
= KGIDT_INIT(from_kgid(sb
->s_user_ns
, fsgid
));
1361 /* clear all caps to prevent bypassing capable() checks */
1362 cap_clear((*newcred
)->cap_bset
);
1363 cap_clear((*newcred
)->cap_effective
);
1364 cap_clear((*newcred
)->cap_inheritable
);
1365 cap_clear((*newcred
)->cap_permitted
);
1367 put_cred(override_creds(*newcred
));
1371 static inline void shiftfs_revert_ioctl_creds(const struct cred
*oldcred
,
1372 struct cred
*newcred
)
1374 return shiftfs_revert_object_creds(oldcred
, newcred
);
1377 static inline bool is_btrfs_snap_ioctl(int cmd
)
1379 if ((cmd
== BTRFS_IOC_SNAP_CREATE
) || (cmd
== BTRFS_IOC_SNAP_CREATE_V2
))
1385 static int shiftfs_btrfs_ioctl_fd_restore(int cmd
, struct fd lfd
, int fd
,
1387 struct btrfs_ioctl_vol_args
*v1
,
1388 struct btrfs_ioctl_vol_args_v2
*v2
)
1392 if (!is_btrfs_snap_ioctl(cmd
))
1395 if (cmd
== BTRFS_IOC_SNAP_CREATE
)
1396 ret
= copy_to_user(arg
, v1
, sizeof(*v1
));
1398 ret
= copy_to_user(arg
, v2
, sizeof(*v2
));
1401 __close_fd(current
->files
, fd
);
1408 static int shiftfs_btrfs_ioctl_fd_replace(int cmd
, void __user
*arg
,
1409 struct btrfs_ioctl_vol_args
**b1
,
1410 struct btrfs_ioctl_vol_args_v2
**b2
,
1416 struct btrfs_ioctl_vol_args
*v1
= NULL
;
1417 struct btrfs_ioctl_vol_args_v2
*v2
= NULL
;
1419 if (!is_btrfs_snap_ioctl(cmd
))
1422 if (cmd
== BTRFS_IOC_SNAP_CREATE
) {
1423 v1
= memdup_user(arg
, sizeof(*v1
));
1429 v2
= memdup_user(arg
, sizeof(*v2
));
1440 ret
= shiftfs_real_fdget(src
.file
, lfd
);
1445 *newfd
= get_unused_fd_flags(lfd
->file
->f_flags
);
1451 fd_install(*newfd
, lfd
->file
);
1453 if (cmd
== BTRFS_IOC_SNAP_CREATE
) {
1455 ret
= copy_to_user(arg
, v1
, sizeof(*v1
));
1459 ret
= copy_to_user(arg
, v2
, sizeof(*v2
));
1464 shiftfs_btrfs_ioctl_fd_restore(cmd
, *lfd
, *newfd
, arg
, v1
, v2
);
1469 static long shiftfs_real_ioctl(struct file
*file
, unsigned int cmd
,
1473 struct cred
*newcred
;
1474 const struct cred
*oldcred
;
1476 long err
= 0, ret
= 0;
1477 void __user
*argp
= (void __user
*)arg
;
1478 struct fd btrfs_lfd
= {};
1479 struct super_block
*sb
= file
->f_path
.dentry
->d_sb
;
1480 struct btrfs_ioctl_vol_args
*btrfs_v1
= NULL
;
1481 struct btrfs_ioctl_vol_args_v2
*btrfs_v2
= NULL
;
1483 ret
= shiftfs_btrfs_ioctl_fd_replace(cmd
, argp
, &btrfs_v1
, &btrfs_v2
,
1484 &btrfs_lfd
, &newfd
);
1488 ret
= shiftfs_real_fdget(file
, &lowerfd
);
1492 ret
= shiftfs_override_ioctl_creds(sb
, &oldcred
, &newcred
);
1496 ret
= vfs_ioctl(lowerfd
.file
, cmd
, arg
);
1498 shiftfs_revert_ioctl_creds(oldcred
, newcred
);
1500 shiftfs_copyattr(file_inode(lowerfd
.file
), file_inode(file
));
1501 shiftfs_copyflags(file_inode(lowerfd
.file
), file_inode(file
));
1507 err
= shiftfs_btrfs_ioctl_fd_restore(cmd
, btrfs_lfd
, newfd
, argp
,
1508 btrfs_v1
, btrfs_v2
);
1515 static bool in_ioctl_whitelist(int flag
, unsigned long arg
)
1517 void __user
*argp
= (void __user
*)arg
;
1521 case BTRFS_IOC_FS_INFO
:
1523 case BTRFS_IOC_SNAP_CREATE
:
1525 case BTRFS_IOC_SNAP_CREATE_V2
:
1527 case BTRFS_IOC_SUBVOL_CREATE
:
1529 case BTRFS_IOC_SUBVOL_CREATE_V2
:
1531 case BTRFS_IOC_SUBVOL_GETFLAGS
:
1533 case BTRFS_IOC_SUBVOL_SETFLAGS
:
1534 if (copy_from_user(&flags
, argp
, sizeof(flags
)))
1537 if (flags
& ~BTRFS_SUBVOL_RDONLY
)
1541 case BTRFS_IOC_SNAP_DESTROY
:
1548 static long shiftfs_ioctl(struct file
*file
, unsigned int cmd
,
1552 case FS_IOC_GETVERSION
:
1554 case FS_IOC_GETFLAGS
:
1556 case FS_IOC_SETFLAGS
:
1559 if (!in_ioctl_whitelist(cmd
, arg
) ||
1560 !shiftfs_passthrough_ioctls(file
->f_path
.dentry
->d_sb
->s_fs_info
))
1564 return shiftfs_real_ioctl(file
, cmd
, arg
);
1567 static long shiftfs_compat_ioctl(struct file
*file
, unsigned int cmd
,
1571 case FS_IOC32_GETVERSION
:
1573 case FS_IOC32_GETFLAGS
:
1575 case FS_IOC32_SETFLAGS
:
1578 if (!in_ioctl_whitelist(cmd
, arg
) ||
1579 !shiftfs_passthrough_ioctls(file
->f_path
.dentry
->d_sb
->s_fs_info
))
1580 return -ENOIOCTLCMD
;
1583 return shiftfs_real_ioctl(file
, cmd
, arg
);
1586 enum shiftfs_copyop
{
1592 static ssize_t
shiftfs_copyfile(struct file
*file_in
, loff_t pos_in
,
1593 struct file
*file_out
, loff_t pos_out
, u64 len
,
1594 unsigned int flags
, enum shiftfs_copyop op
)
1597 struct fd real_in
, real_out
;
1598 const struct cred
*oldcred
;
1599 struct inode
*inode_out
= file_inode(file_out
);
1600 struct inode
*loweri
= inode_out
->i_private
;
1602 ret
= shiftfs_real_fdget(file_out
, &real_out
);
1606 ret
= shiftfs_real_fdget(file_in
, &real_in
);
1612 oldcred
= shiftfs_override_creds(inode_out
->i_sb
);
1615 ret
= vfs_copy_file_range(real_in
.file
, pos_in
, real_out
.file
,
1616 pos_out
, len
, flags
);
1620 ret
= vfs_clone_file_range(real_in
.file
, pos_in
, real_out
.file
,
1621 pos_out
, len
, flags
);
1624 case SHIFTFS_DEDUPE
:
1625 ret
= vfs_dedupe_file_range_one(real_in
.file
, pos_in
,
1626 real_out
.file
, pos_out
, len
,
1630 revert_creds(oldcred
);
1633 shiftfs_copyattr(loweri
, inode_out
);
1641 static ssize_t
shiftfs_copy_file_range(struct file
*file_in
, loff_t pos_in
,
1642 struct file
*file_out
, loff_t pos_out
,
1643 size_t len
, unsigned int flags
)
1645 return shiftfs_copyfile(file_in
, pos_in
, file_out
, pos_out
, len
, flags
,
1649 static loff_t
shiftfs_remap_file_range(struct file
*file_in
, loff_t pos_in
,
1650 struct file
*file_out
, loff_t pos_out
,
1651 loff_t len
, unsigned int remap_flags
)
1653 enum shiftfs_copyop op
;
1655 if (remap_flags
& ~(REMAP_FILE_DEDUP
| REMAP_FILE_ADVISORY
))
1658 if (remap_flags
& REMAP_FILE_DEDUP
)
1659 op
= SHIFTFS_DEDUPE
;
1663 return shiftfs_copyfile(file_in
, pos_in
, file_out
, pos_out
, len
,
1667 static int shiftfs_iterate_shared(struct file
*file
, struct dir_context
*ctx
)
1669 const struct cred
*oldcred
;
1671 struct file
*realfile
= file
->private_data
;
1673 oldcred
= shiftfs_override_creds(file
->f_path
.dentry
->d_sb
);
1674 err
= iterate_dir(realfile
, ctx
);
1675 revert_creds(oldcred
);
1680 const struct file_operations shiftfs_file_operations
= {
1681 .open
= shiftfs_open
,
1682 .release
= shiftfs_release
,
1683 .llseek
= shiftfs_file_llseek
,
1684 .read_iter
= shiftfs_read_iter
,
1685 .write_iter
= shiftfs_write_iter
,
1686 .fsync
= shiftfs_fsync
,
1687 .mmap
= shiftfs_mmap
,
1688 .fallocate
= shiftfs_fallocate
,
1689 .fadvise
= shiftfs_fadvise
,
1690 .unlocked_ioctl
= shiftfs_ioctl
,
1691 .compat_ioctl
= shiftfs_compat_ioctl
,
1692 .copy_file_range
= shiftfs_copy_file_range
,
1693 .remap_file_range
= shiftfs_remap_file_range
,
1696 const struct file_operations shiftfs_dir_operations
= {
1697 .open
= shiftfs_dir_open
,
1698 .release
= shiftfs_dir_release
,
1699 .compat_ioctl
= shiftfs_compat_ioctl
,
1700 .fsync
= shiftfs_fsync
,
1701 .iterate_shared
= shiftfs_iterate_shared
,
1702 .llseek
= shiftfs_dir_llseek
,
1703 .read
= generic_read_dir
,
1704 .unlocked_ioctl
= shiftfs_ioctl
,
1707 static const struct address_space_operations shiftfs_aops
= {
1708 /* For O_DIRECT dentry_open() checks f_mapping->a_ops->direct_IO */
1709 .direct_IO
= noop_direct_IO
,
1712 static void shiftfs_fill_inode(struct inode
*inode
, unsigned long ino
,
1713 umode_t mode
, dev_t dev
, struct dentry
*dentry
)
1715 struct inode
*loweri
;
1718 inode
->i_flags
|= S_NOCMTIME
;
1721 inode
->i_mode
= mode
;
1722 switch (mode
& S_IFMT
) {
1724 inode
->i_op
= &shiftfs_dir_inode_operations
;
1725 inode
->i_fop
= &shiftfs_dir_operations
;
1728 inode
->i_op
= &shiftfs_symlink_inode_operations
;
1731 inode
->i_op
= &shiftfs_file_inode_operations
;
1732 inode
->i_fop
= &shiftfs_file_operations
;
1733 inode
->i_mapping
->a_ops
= &shiftfs_aops
;
1736 inode
->i_op
= &shiftfs_special_inode_operations
;
1737 init_special_inode(inode
, mode
, dev
);
1744 loweri
= dentry
->d_inode
;
1745 if (!loweri
->i_op
->get_link
)
1746 inode
->i_opflags
|= IOP_NOFOLLOW
;
1748 shiftfs_copyattr(loweri
, inode
);
1749 shiftfs_copyflags(loweri
, inode
);
1750 set_nlink(inode
, loweri
->i_nlink
);
1753 static int shiftfs_show_options(struct seq_file
*m
, struct dentry
*dentry
)
1755 struct super_block
*sb
= dentry
->d_sb
;
1756 struct shiftfs_super_info
*sbinfo
= sb
->s_fs_info
;
1759 seq_show_option(m
, "mark", NULL
);
1761 if (sbinfo
->passthrough
)
1762 seq_printf(m
, ",passthrough=%u", sbinfo
->passthrough
);
1767 static int shiftfs_statfs(struct dentry
*dentry
, struct kstatfs
*buf
)
1769 struct super_block
*sb
= dentry
->d_sb
;
1770 struct shiftfs_super_info
*sbinfo
= sb
->s_fs_info
;
1771 struct dentry
*root
= sb
->s_root
;
1772 struct dentry
*realroot
= root
->d_fsdata
;
1773 struct path realpath
= { .mnt
= sbinfo
->mnt
, .dentry
= realroot
};
1776 err
= vfs_statfs(&realpath
, buf
);
1780 if (!shiftfs_passthrough_statfs(sbinfo
))
1781 buf
->f_type
= sb
->s_magic
;
1786 static void shiftfs_evict_inode(struct inode
*inode
)
1788 struct inode
*loweri
= inode
->i_private
;
1796 static void shiftfs_put_super(struct super_block
*sb
)
1798 struct shiftfs_super_info
*sbinfo
= sb
->s_fs_info
;
1801 mntput(sbinfo
->mnt
);
1802 put_cred(sbinfo
->creator_cred
);
1807 static const struct xattr_handler shiftfs_xattr_handler
= {
1809 .get
= shiftfs_xattr_get
,
1810 .set
= shiftfs_xattr_set
,
1813 const struct xattr_handler
*shiftfs_xattr_handlers
[] = {
1814 #ifdef CONFIG_SHIFT_FS_POSIX_ACL
1815 &shiftfs_posix_acl_access_xattr_handler
,
1816 &shiftfs_posix_acl_default_xattr_handler
,
1818 &shiftfs_xattr_handler
,
1822 static inline bool passthrough_is_subset(int old_flags
, int new_flags
)
1824 if ((new_flags
& old_flags
) != new_flags
)
1830 static int shiftfs_super_check_flags(unsigned long old_flags
,
1831 unsigned long new_flags
)
1833 if ((old_flags
& SB_RDONLY
) && !(new_flags
& SB_RDONLY
))
1836 if ((old_flags
& SB_NOSUID
) && !(new_flags
& SB_NOSUID
))
1839 if ((old_flags
& SB_NODEV
) && !(new_flags
& SB_NODEV
))
1842 if ((old_flags
& SB_NOEXEC
) && !(new_flags
& SB_NOEXEC
))
1845 if ((old_flags
& SB_NOATIME
) && !(new_flags
& SB_NOATIME
))
1848 if ((old_flags
& SB_NODIRATIME
) && !(new_flags
& SB_NODIRATIME
))
1851 if (!(old_flags
& SB_POSIXACL
) && (new_flags
& SB_POSIXACL
))
1857 static int shiftfs_remount(struct super_block
*sb
, int *flags
, char *data
)
1860 struct shiftfs_super_info
new = {};
1861 struct shiftfs_super_info
*info
= sb
->s_fs_info
;
1863 err
= shiftfs_parse_mount_options(&new, data
);
1867 err
= shiftfs_super_check_flags(sb
->s_flags
, *flags
);
1871 /* Mark mount option cannot be changed. */
1872 if (info
->mark
|| (info
->mark
!= new.mark
))
1875 if (info
->passthrough
!= new.passthrough
) {
1876 /* Don't allow exceeding passthrough options of mark mount. */
1877 if (!passthrough_is_subset(info
->passthrough_mark
,
1881 info
->passthrough
= new.passthrough
;
1887 static const struct super_operations shiftfs_super_ops
= {
1888 .put_super
= shiftfs_put_super
,
1889 .show_options
= shiftfs_show_options
,
1890 .statfs
= shiftfs_statfs
,
1891 .remount_fs
= shiftfs_remount
,
1892 .evict_inode
= shiftfs_evict_inode
,
1895 struct shiftfs_data
{
1900 static void shiftfs_super_force_flags(struct super_block
*sb
,
1901 unsigned long lower_flags
)
1903 sb
->s_flags
|= lower_flags
& (SB_RDONLY
| SB_NOSUID
| SB_NODEV
|
1904 SB_NOEXEC
| SB_NOATIME
| SB_NODIRATIME
);
1906 if (!(lower_flags
& SB_POSIXACL
))
1907 sb
->s_flags
&= ~SB_POSIXACL
;
1910 static int shiftfs_fill_super(struct super_block
*sb
, void *raw_data
,
1914 struct path path
= {};
1915 struct shiftfs_super_info
*sbinfo_mp
;
1917 struct inode
*inode
= NULL
;
1918 struct dentry
*dentry
= NULL
;
1919 struct shiftfs_data
*data
= raw_data
;
1920 struct shiftfs_super_info
*sbinfo
= NULL
;
1925 sb
->s_fs_info
= kzalloc(sizeof(*sbinfo
), GFP_KERNEL
);
1928 sbinfo
= sb
->s_fs_info
;
1930 err
= shiftfs_parse_mount_options(sbinfo
, data
->data
);
1934 /* to mount a mark, must be userns admin */
1935 if (!sbinfo
->mark
&& !ns_capable(current_user_ns(), CAP_SYS_ADMIN
))
1938 name
= kstrdup(data
->path
, GFP_KERNEL
);
1942 err
= kern_path(name
, LOOKUP_FOLLOW
, &path
);
1946 if (!S_ISDIR(path
.dentry
->d_inode
->i_mode
)) {
1951 sb
->s_flags
|= SB_POSIXACL
;
1954 struct super_block
*lower_sb
= path
.mnt
->mnt_sb
;
1956 /* to mark a mount point, must root wrt lower s_user_ns */
1957 if (!ns_capable(lower_sb
->s_user_ns
, CAP_SYS_ADMIN
)) {
1963 * this part is visible unshifted, so make sure no
1964 * executables that could be used to give suid
1967 sb
->s_iflags
= SB_I_NOEXEC
;
1969 shiftfs_super_force_flags(sb
, lower_sb
->s_flags
);
1972 * Handle nesting of shiftfs mounts by referring this mark
1973 * mount back to the original mark mount. This is more
1974 * efficient and alleviates concerns about stack depth.
1976 if (lower_sb
->s_magic
== SHIFTFS_MAGIC
) {
1977 sbinfo_mp
= lower_sb
->s_fs_info
;
1979 /* Doesn't make sense to mark a mark mount */
1980 if (sbinfo_mp
->mark
) {
1985 if (!passthrough_is_subset(sbinfo_mp
->passthrough
,
1986 sbinfo
->passthrough
)) {
1991 sbinfo
->mnt
= mntget(sbinfo_mp
->mnt
);
1992 dentry
= dget(path
.dentry
->d_fsdata
);
1994 * Copy up the passthrough mount options from the
1995 * parent mark mountpoint.
1997 sbinfo
->passthrough_mark
= sbinfo_mp
->passthrough_mark
;
1999 sbinfo
->mnt
= mntget(path
.mnt
);
2000 dentry
= dget(path
.dentry
);
2002 * For a new mark passthrough_mark and passthrough
2005 sbinfo
->passthrough_mark
= sbinfo
->passthrough
;
2008 sbinfo
->creator_cred
= prepare_creds();
2009 if (!sbinfo
->creator_cred
) {
2015 * This leg executes if we're admin capable in the namespace,
2016 * so be very careful.
2019 if (path
.dentry
->d_sb
->s_magic
!= SHIFTFS_MAGIC
)
2022 sbinfo_mp
= path
.dentry
->d_sb
->s_fs_info
;
2023 if (!sbinfo_mp
->mark
)
2026 if (!passthrough_is_subset(sbinfo_mp
->passthrough
,
2027 sbinfo
->passthrough
))
2030 sbinfo
->mnt
= mntget(sbinfo_mp
->mnt
);
2031 sbinfo
->creator_cred
= get_cred(sbinfo_mp
->creator_cred
);
2032 dentry
= dget(path
.dentry
->d_fsdata
);
2034 * Copy up passthrough settings from mark mountpoint so we can
2035 * verify when the overlay wants to remount with different
2036 * passthrough settings.
2038 sbinfo
->passthrough_mark
= sbinfo_mp
->passthrough
;
2039 shiftfs_super_force_flags(sb
, path
.mnt
->mnt_sb
->s_flags
);
2042 sb
->s_stack_depth
= dentry
->d_sb
->s_stack_depth
+ 1;
2043 if (sb
->s_stack_depth
> FILESYSTEM_MAX_STACK_DEPTH
) {
2044 printk(KERN_ERR
"shiftfs: maximum stacking depth exceeded\n");
2049 inode
= new_inode(sb
);
2054 shiftfs_fill_inode(inode
, dentry
->d_inode
->i_ino
, S_IFDIR
, 0, dentry
);
2056 ihold(dentry
->d_inode
);
2057 inode
->i_private
= dentry
->d_inode
;
2059 sb
->s_magic
= SHIFTFS_MAGIC
;
2060 sb
->s_op
= &shiftfs_super_ops
;
2061 sb
->s_xattr
= shiftfs_xattr_handlers
;
2062 sb
->s_d_op
= &shiftfs_dentry_ops
;
2063 sb
->s_root
= d_make_root(inode
);
2069 sb
->s_root
->d_fsdata
= dentry
;
2070 sbinfo
->userns
= get_user_ns(dentry
->d_sb
->s_user_ns
);
2071 shiftfs_copyattr(dentry
->d_inode
, sb
->s_root
->d_inode
);
2087 static struct dentry
*shiftfs_mount(struct file_system_type
*fs_type
,
2088 int flags
, const char *dev_name
, void *data
)
2090 struct shiftfs_data d
= { data
, dev_name
};
2092 return mount_nodev(fs_type
, flags
, &d
, shiftfs_fill_super
);
2095 static struct file_system_type shiftfs_type
= {
2096 .owner
= THIS_MODULE
,
2098 .mount
= shiftfs_mount
,
2099 .kill_sb
= kill_anon_super
,
2100 .fs_flags
= FS_USERNS_MOUNT
,
2103 static int __init
shiftfs_init(void)
2105 return register_filesystem(&shiftfs_type
);
2108 static void __exit
shiftfs_exit(void)
2110 unregister_filesystem(&shiftfs_type
);
2113 MODULE_ALIAS_FS("shiftfs");
2114 MODULE_AUTHOR("James Bottomley");
2115 MODULE_AUTHOR("Seth Forshee <seth.forshee@canonical.com>");
2116 MODULE_AUTHOR("Christian Brauner <christian.brauner@ubuntu.com>");
2117 MODULE_DESCRIPTION("id shifting filesystem");
2118 MODULE_LICENSE("GPL v2");
2119 module_init(shiftfs_init
)
2120 module_exit(shiftfs_exit
)