12874c5fdSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
207f3f05cSDavid Howells /* fs/ internal definitions
307f3f05cSDavid Howells *
407f3f05cSDavid Howells * Copyright (C) 2006 Red Hat, Inc. All Rights Reserved.
507f3f05cSDavid Howells * Written by David Howells (dhowells@redhat.com)
607f3f05cSDavid Howells */
707f3f05cSDavid Howells
85e6d12b2SAndrew Morton struct super_block;
99d412a43SAl Viro struct file_system_type;
10ae259a9cSChristoph Hellwig struct iomap;
11befb503cSChristoph Hellwig struct iomap_ops;
12a6f76f23SDavid Howells struct linux_binprm;
133e93cd67SAl Viro struct path;
14c7105365SAl Viro struct mount;
15503c358cSVladimir Davydov struct shrink_control;
169bc61ab1SDavid Howells struct fs_context;
17b964bf53SAl Viro struct pipe_inode_info;
1806bbaa6dSAl Viro struct iov_iter;
193707d84cSChristian Brauner struct mnt_idmap;
205e6d12b2SAndrew Morton
2107f3f05cSDavid Howells /*
220dca4462SChristoph Hellwig * block/bdev.c
2307f3f05cSDavid Howells */
249361401eSDavid Howells #ifdef CONFIG_BLOCK
2507f3f05cSDavid Howells extern void __init bdev_cache_init(void);
265e6d12b2SAndrew Morton #else
bdev_cache_init(void)275e6d12b2SAndrew Morton static inline void bdev_cache_init(void)
285e6d12b2SAndrew Morton {
295e6d12b2SAndrew Morton }
303f1266f1SChristoph Hellwig #endif /* CONFIG_BLOCK */
317b0de42dSDavid Howells
3207f3f05cSDavid Howells /*
334db96b71SAkinobu Mita * buffer.c
344db96b71SAkinobu Mita */
35d1bd0b4eSMatthew Wilcox (Oracle) int __block_write_begin_int(struct folio *folio, loff_t pos, unsigned len,
366d49cc85SChristoph Hellwig get_block_t *get_block, const struct iomap *iomap);
374db96b71SAkinobu Mita
384db96b71SAkinobu Mita /*
3907f3f05cSDavid Howells * char_dev.c
4007f3f05cSDavid Howells */
4107f3f05cSDavid Howells extern void __init chrdev_init(void);
4207f3f05cSDavid Howells
4307f3f05cSDavid Howells /*
449bc61ab1SDavid Howells * fs_context.c
459bc61ab1SDavid Howells */
46ecdab150SDavid Howells extern const struct fs_context_operations legacy_fs_context_ops;
479bc61ab1SDavid Howells extern int parse_monolithic_mount_data(struct fs_context *, void *);
48ecdab150SDavid Howells extern void vfs_clean_context(struct fs_context *fc);
49ecdab150SDavid Howells extern int finish_clean_context(struct fs_context *fc);
509bc61ab1SDavid Howells
519bc61ab1SDavid Howells /*
520bdaea90SDavid Howells * namei.c
530bdaea90SDavid Howells */
5431d921c7SDavid Howells extern int filename_lookup(int dfd, struct filename *name, unsigned flags,
5531d921c7SDavid Howells struct path *path, struct path *root);
5645f30dabSDmitry Kadashev int do_rmdir(int dfd, struct filename *name);
5745f30dabSDmitry Kadashev int do_unlinkat(int dfd, struct filename *name);
584609e1f1SChristian Brauner int may_linkat(struct mnt_idmap *idmap, const struct path *link);
59e886663cSJens Axboe int do_renameat2(int olddfd, struct filename *oldname, int newdfd,
60e886663cSJens Axboe struct filename *newname, unsigned int flags);
6145f30dabSDmitry Kadashev int do_mkdirat(int dfd, struct filename *name, umode_t mode);
627a8721f8SDmitry Kadashev int do_symlinkat(struct filename *from, int newdfd, struct filename *to);
63cf30da90SDmitry Kadashev int do_linkat(int olddfd, struct filename *old, int newdfd,
64cf30da90SDmitry Kadashev struct filename *new, int flags);
650bdaea90SDavid Howells
660bdaea90SDavid Howells /*
6707f3f05cSDavid Howells * namespace.c
6807f3f05cSDavid Howells */
69ca71cf71SAl Viro extern struct vfsmount *lookup_mnt(const struct path *);
701e2d8464SAl Viro extern int finish_automount(struct vfsmount *, const struct path *);
716d59e7f5SAl Viro
724ed5e82fSMiklos Szeredi extern int sb_prepare_remount_readonly(struct super_block *);
73f03c6599SAl Viro
746d59e7f5SAl Viro extern void __init mnt_init(void);
753e93cd67SAl Viro
76eb04c282SJan Kara extern int __mnt_want_write_file(struct file *);
77eb04c282SJan Kara extern void __mnt_drop_write_file(struct file *);
7847cd813fSAl Viro
79a07b2000SAl Viro extern void dissolve_on_fput(struct vfsmount *);
80a5f85d78SAl Viro extern bool may_mount(void);
81c60166f0SChristoph Hellwig
82c60166f0SChristoph Hellwig int path_mount(const char *dev_name, struct path *path,
83c60166f0SChristoph Hellwig const char *type_page, unsigned long flags, void *data_page);
8409267defSChristoph Hellwig int path_umount(struct path *path, int flags);
85c60166f0SChristoph Hellwig
863e93cd67SAl Viro /*
873e93cd67SAl Viro * fs_struct.c
883e93cd67SAl Viro */
89dcf787f3SAl Viro extern void chroot_fs_refs(const struct path *, const struct path *);
90864d7c4cSnpiggin@suse.de
91864d7c4cSnpiggin@suse.de /*
92864d7c4cSnpiggin@suse.de * file_table.c
93864d7c4cSnpiggin@suse.de */
9462d53c4aSAmir Goldstein struct file *alloc_empty_file(int flags, const struct cred *cred);
9562d53c4aSAmir Goldstein struct file *alloc_empty_file_noaccount(int flags, const struct cred *cred);
9662d53c4aSAmir Goldstein struct file *alloc_empty_backing_file(int flags, const struct cred *cred);
9762c6943bSAl Viro
put_file_access(struct file * file)98d6da19c9SAmir Goldstein static inline void put_file_access(struct file *file)
99d6da19c9SAmir Goldstein {
100d6da19c9SAmir Goldstein if ((file->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ) {
101d6da19c9SAmir Goldstein i_readcount_dec(file->f_inode);
102d6da19c9SAmir Goldstein } else if (file->f_mode & FMODE_WRITER) {
103d6da19c9SAmir Goldstein put_write_access(file->f_inode);
104d6da19c9SAmir Goldstein __mnt_drop_write(file->f_path.mnt);
105d6da19c9SAmir Goldstein }
106d6da19c9SAmir Goldstein }
107d6da19c9SAmir Goldstein
10862c6943bSAl Viro /*
10962c6943bSAl Viro * super.c
11062c6943bSAl Viro */
1118d0347f6SDavid Howells extern int reconfigure_super(struct fs_context *);
112*d8ce82efSChristian Brauner extern bool super_trylock_shared(struct super_block *sb);
1134e7b5671SChristoph Hellwig struct super_block *user_get_super(dev_t, bool excl);
11460b49885SChristoph Hellwig void put_super(struct super_block *sb);
11520284ab7SAl Viro extern bool mount_capable(struct fs_context *);
116439bc39bSChristoph Hellwig int sb_init_dio_done_wq(struct super_block *sb);
117482928d5SAl Viro
118482928d5SAl Viro /*
119d7439fb1SJan Kara * Prepare superblock for changing its read-only state (i.e., either remount
120d7439fb1SJan Kara * read-write superblock read-only or vice versa). After this function returns
121d7439fb1SJan Kara * mnt_is_readonly() will return true for any mount of the superblock if its
122d7439fb1SJan Kara * caller is able to observe any changes done by the remount. This holds until
123d7439fb1SJan Kara * sb_end_ro_state_change() is called.
124d7439fb1SJan Kara */
sb_start_ro_state_change(struct super_block * sb)125d7439fb1SJan Kara static inline void sb_start_ro_state_change(struct super_block *sb)
126d7439fb1SJan Kara {
127d7439fb1SJan Kara WRITE_ONCE(sb->s_readonly_remount, 1);
128d7439fb1SJan Kara /*
129d7439fb1SJan Kara * For RO->RW transition, the barrier pairs with the barrier in
130d7439fb1SJan Kara * mnt_is_readonly() making sure if mnt_is_readonly() sees SB_RDONLY
131d7439fb1SJan Kara * cleared, it will see s_readonly_remount set.
132d7439fb1SJan Kara * For RW->RO transition, the barrier pairs with the barrier in
133d7439fb1SJan Kara * __mnt_want_write() before the mnt_is_readonly() check. The barrier
134d7439fb1SJan Kara * makes sure if __mnt_want_write() sees MNT_WRITE_HOLD already
135d7439fb1SJan Kara * cleared, it will see s_readonly_remount set.
136d7439fb1SJan Kara */
137d7439fb1SJan Kara smp_wmb();
138d7439fb1SJan Kara }
139d7439fb1SJan Kara
140d7439fb1SJan Kara /*
141d7439fb1SJan Kara * Ends section changing read-only state of the superblock. After this function
142d7439fb1SJan Kara * returns if mnt_is_readonly() returns false, the caller will be able to
143d7439fb1SJan Kara * observe all the changes remount did to the superblock.
144d7439fb1SJan Kara */
sb_end_ro_state_change(struct super_block * sb)145d7439fb1SJan Kara static inline void sb_end_ro_state_change(struct super_block *sb)
146d7439fb1SJan Kara {
147d7439fb1SJan Kara /*
148d7439fb1SJan Kara * This barrier provides release semantics that pairs with
149d7439fb1SJan Kara * the smp_rmb() acquire semantics in mnt_is_readonly().
150d7439fb1SJan Kara * This barrier pair ensure that when mnt_is_readonly() sees
151d7439fb1SJan Kara * 0 for sb->s_readonly_remount, it will also see all the
152d7439fb1SJan Kara * preceding flag changes that were made during the RO state
153d7439fb1SJan Kara * change.
154d7439fb1SJan Kara */
155d7439fb1SJan Kara smp_wmb();
156d7439fb1SJan Kara WRITE_ONCE(sb->s_readonly_remount, 0);
157d7439fb1SJan Kara }
158d7439fb1SJan Kara
159d7439fb1SJan Kara /*
160482928d5SAl Viro * open.c
161482928d5SAl Viro */
16247c805dcSAl Viro struct open_flags {
16347c805dcSAl Viro int open_flag;
164a218d0fdSAl Viro umode_t mode;
16547c805dcSAl Viro int acc_mode;
16647c805dcSAl Viro int intent;
167f9652e10SAl Viro int lookup_flags;
16847c805dcSAl Viro };
169669abf4eSJeff Layton extern struct file *do_filp_open(int dfd, struct filename *pathname,
170f9652e10SAl Viro const struct open_flags *op);
171ffb37ca3SAl Viro extern struct file *do_file_open_root(const struct path *,
172f9652e10SAl Viro const char *, const struct open_flags *);
17335cb6d54SJens Axboe extern struct open_how build_open_how(int flags, umode_t mode);
17435cb6d54SJens Axboe extern int build_open_flags(const struct open_how *how, struct open_flags *op);
1756319194eSAl Viro extern struct file *__close_fd_get_file(unsigned int fd);
176a8dade34SAl Viro
177411d9475SDominik Brodowski long do_sys_ftruncate(unsigned int fd, loff_t length, int small);
1781097742eSChristoph Hellwig int chmod_common(const struct path *path, umode_t mode);
17955731b3cSDominik Brodowski int do_fchownat(int dfd, const char __user *filename, uid_t user, gid_t group,
18055731b3cSDominik Brodowski int flag);
181b873498fSChristoph Hellwig int chown_common(const struct path *path, uid_t user, gid_t group);
182ae2bb293SAl Viro extern int vfs_open(const struct path *, struct file *);
183becfd1f3SAneesh Kumar K.V
184a8dade34SAl Viro /*
185a8dade34SAl Viro * inode.c
186a8dade34SAl Viro */
187503c358cSVladimir Davydov extern long prune_icache_sb(struct super_block *sb, struct shrink_control *sc);
1889452e93eSChristian Brauner int dentry_needs_remove_privs(struct mnt_idmap *, struct dentry *dentry);
1899452e93eSChristian Brauner bool in_group_or_capable(struct mnt_idmap *idmap,
19011c2a870SChristian Brauner const struct inode *inode, vfsgid_t vfsgid);
191f23ce757SJan Kara void lock_two_inodes(struct inode *inode1, struct inode *inode2,
192f23ce757SJan Kara unsigned subclass1, unsigned subclass2);
19355fa6091SDave Chinner
194a66979abSDave Chinner /*
195a66979abSDave Chinner * fs-writeback.c
196a66979abSDave Chinner */
1973942c07cSGlauber Costa extern long get_nr_dirty_inodes(void);
198e127b9bcSChristoph Hellwig void invalidate_inodes(struct super_block *sb);
199a4464dbcSAl Viro
200a4464dbcSAl Viro /*
201a4464dbcSAl Viro * dcache.c
202a4464dbcSAl Viro */
203eed81007SMiklos Szeredi extern int d_set_mounted(struct dentry *dentry);
204503c358cSVladimir Davydov extern long prune_dcache_sb(struct super_block *sb, struct shrink_control *sc);
205ba65dc5eSAl Viro extern struct dentry *d_alloc_cursor(struct dentry *);
206ab1152ddSAl Viro extern struct dentry * d_alloc_pseudo(struct super_block *, const struct qstr *);
2077e5f7bb0SAl Viro extern char *simple_dname(struct dentry *, char *, int);
2089bdebc2bSAl Viro extern void dput_to_list(struct dentry *, struct list_head *);
2099bdebc2bSAl Viro extern void shrink_dentry_list(struct list_head *);
21006ae43f3SAl Viro
21106ae43f3SAl Viro /*
212599a0ac1SAl Viro * pipe.c
213599a0ac1SAl Viro */
214599a0ac1SAl Viro extern const struct file_operations pipefifo_fops;
2158fa1f1c2SAl Viro
2168fa1f1c2SAl Viro /*
2178fa1f1c2SAl Viro * fs_pin.c
2188fa1f1c2SAl Viro */
219fdab684dSAl Viro extern void group_pin_kill(struct hlist_head *p);
2208fa1f1c2SAl Viro extern void mnt_pin_kill(struct mount *m);
221e149ed2bSAl Viro
222e149ed2bSAl Viro /*
223e149ed2bSAl Viro * fs/nsfs.c
224e149ed2bSAl Viro */
225be218aa2SRasmus Villemoes extern const struct dentry_operations ns_dentry_operations;
22666cf191fSAl Viro
2273934e36fSJens Axboe /*
2283934e36fSJens Axboe * fs/stat.c:
2293934e36fSJens Axboe */
2301b6fe6e0SStefan Roesch
2311b6fe6e0SStefan Roesch int getname_statx_lookup_flags(int flags);
2321b6fe6e0SStefan Roesch int do_statx(int dfd, struct filename *filename, unsigned int flags,
2330018784fSBijan Mottahedeh unsigned int mask, struct statx __user *buffer);
234b964bf53SAl Viro
235b964bf53SAl Viro /*
236b964bf53SAl Viro * fs/splice.c:
237b964bf53SAl Viro */
238b964bf53SAl Viro long splice_file_to_pipe(struct file *in,
239b964bf53SAl Viro struct pipe_inode_info *opipe,
240b964bf53SAl Viro loff_t *offset,
241b964bf53SAl Viro size_t len, unsigned int flags);
2421a91794cSStefan Roesch
2431a91794cSStefan Roesch /*
2441a91794cSStefan Roesch * fs/xattr.c:
2451a91794cSStefan Roesch */
2461a91794cSStefan Roesch struct xattr_name {
2471a91794cSStefan Roesch char name[XATTR_NAME_MAX + 1];
2481a91794cSStefan Roesch };
2491a91794cSStefan Roesch
2501a91794cSStefan Roesch struct xattr_ctx {
2511a91794cSStefan Roesch /* Value of attribute */
2521a91794cSStefan Roesch union {
2531a91794cSStefan Roesch const void __user *cvalue;
2541a91794cSStefan Roesch void __user *value;
2551a91794cSStefan Roesch };
2561a91794cSStefan Roesch void *kvalue;
2571a91794cSStefan Roesch size_t size;
2581a91794cSStefan Roesch /* Attribute name */
2591a91794cSStefan Roesch struct xattr_name *kname;
2601a91794cSStefan Roesch unsigned int flags;
2611a91794cSStefan Roesch };
2621a91794cSStefan Roesch
263c975cad9SStefan Roesch
2645a6f52d2SChristian Brauner ssize_t do_getxattr(struct mnt_idmap *idmap,
265c975cad9SStefan Roesch struct dentry *d,
266c975cad9SStefan Roesch struct xattr_ctx *ctx);
267c975cad9SStefan Roesch
2681a91794cSStefan Roesch int setxattr_copy(const char __user *name, struct xattr_ctx *ctx);
2695a6f52d2SChristian Brauner int do_setxattr(struct mnt_idmap *idmap, struct dentry *dentry,
2701a91794cSStefan Roesch struct xattr_ctx *ctx);
2714609e1f1SChristian Brauner int may_write_xattr(struct mnt_idmap *idmap, struct inode *inode);
27206bbaa6dSAl Viro
273318e6685SChristian Brauner #ifdef CONFIG_FS_POSIX_ACL
2745a6f52d2SChristian Brauner int do_set_acl(struct mnt_idmap *idmap, struct dentry *dentry,
275318e6685SChristian Brauner const char *acl_name, const void *kvalue, size_t size);
2765a6f52d2SChristian Brauner ssize_t do_get_acl(struct mnt_idmap *idmap, struct dentry *dentry,
277318e6685SChristian Brauner const char *acl_name, void *kvalue, size_t size);
278318e6685SChristian Brauner #else
do_set_acl(struct mnt_idmap * idmap,struct dentry * dentry,const char * acl_name,const void * kvalue,size_t size)2795a6f52d2SChristian Brauner static inline int do_set_acl(struct mnt_idmap *idmap,
280318e6685SChristian Brauner struct dentry *dentry, const char *acl_name,
281318e6685SChristian Brauner const void *kvalue, size_t size)
282318e6685SChristian Brauner {
283318e6685SChristian Brauner return -EOPNOTSUPP;
284318e6685SChristian Brauner }
do_get_acl(struct mnt_idmap * idmap,struct dentry * dentry,const char * acl_name,void * kvalue,size_t size)2855a6f52d2SChristian Brauner static inline ssize_t do_get_acl(struct mnt_idmap *idmap,
286318e6685SChristian Brauner struct dentry *dentry, const char *acl_name,
287318e6685SChristian Brauner void *kvalue, size_t size)
288318e6685SChristian Brauner {
289318e6685SChristian Brauner return -EOPNOTSUPP;
290318e6685SChristian Brauner }
291318e6685SChristian Brauner #endif
29206bbaa6dSAl Viro
29306bbaa6dSAl Viro ssize_t __kernel_write_iter(struct file *file, struct iov_iter *from, loff_t *pos);
29472ae017cSChristian Brauner
29572ae017cSChristian Brauner /*
29672ae017cSChristian Brauner * fs/attr.c
29772ae017cSChristian Brauner */
2983707d84cSChristian Brauner struct mnt_idmap *alloc_mnt_idmap(struct user_namespace *mnt_userns);
2993707d84cSChristian Brauner struct mnt_idmap *mnt_idmap_get(struct mnt_idmap *idmap);
3003707d84cSChristian Brauner void mnt_idmap_put(struct mnt_idmap *idmap);
301