| 1 |
|
| 2 | |
| 3 | *
|
| 4 | * Copyright (C) 2006 Red Hat, Inc. All Rights Reserved.
|
| 5 | * Written by David Howells ([email protected])
|
| 6 |
|
| 7 |
|
| 8 | struct super_block;
|
| 9 | struct file_system_type;
|
| 10 | struct iomap;
|
| 11 | struct iomap_ops;
|
| 12 | struct linux_binprm;
|
| 13 | struct path;
|
| 14 | struct mount;
|
| 15 | struct shrink_control;
|
| 16 | struct fs_context;
|
| 17 | struct pipe_inode_info;
|
| 18 | struct iov_iter;
|
| 19 | struct mnt_idmap;
|
| 20 | struct ns_common;
|
| 21 |
|
| 22 | |
| 23 | * block/bdev.c
|
| 24 |
|
| 25 | #ifdef CONFIG_BLOCK
|
| 26 | extern void __init bdev_cache_init(void);
|
| 27 | #else
|
| 28 | static inline void bdev_cache_init(void)
|
| 29 | {
|
| 30 | }
|
| 31 | #endif
|
| 32 |
|
| 33 | |
| 34 | * buffer.c
|
| 35 |
|
| 36 | int __block_write_begin_int(struct folio *folio, loff_t pos, unsigned len,
|
| 37 | get_block_t *get_block, const struct iomap *iomap);
|
| 38 |
|
| 39 | |
| 40 | * char_dev.c
|
| 41 |
|
| 42 | extern void __init chrdev_init(void);
|
| 43 |
|
| 44 | |
| 45 | * fs_context.c
|
| 46 |
|
| 47 | extern int parse_monolithic_mount_data(struct fs_context *, void *);
|
| 48 | extern void vfs_clean_context(struct fs_context *fc);
|
| 49 | extern int finish_clean_context(struct fs_context *fc);
|
| 50 |
|
| 51 | |
| 52 | * namei.c
|
| 53 |
|
| 54 | extern int filename_lookup(int dfd, struct filename *name, unsigned flags,
|
| 55 | struct path *path, const struct path *root);
|
| 56 | int filename_rmdir(int dfd, struct filename *name);
|
| 57 | int filename_unlinkat(int dfd, struct filename *name);
|
| 58 | int may_linkat(const struct mnt_idmap *idmap, const struct path *link);
|
| 59 | int filename_renameat2(int olddfd, struct filename *oldname, int newdfd,
|
| 60 | struct filename *newname, unsigned int flags);
|
| 61 | int filename_mkdirat(int dfd, struct filename *name, umode_t mode);
|
| 62 | int filename_mknodat(int dfd, struct filename *name, umode_t mode, unsigned int dev);
|
| 63 | int filename_symlinkat(struct filename *from, int newdfd, struct filename *to);
|
| 64 | int filename_linkat(int olddfd, struct filename *old, int newdfd,
|
| 65 | struct filename *new, int flags);
|
| 66 | int vfs_tmpfile(const struct mnt_idmap *idmap,
|
| 67 | const struct path *parentpath,
|
| 68 | struct file *file, umode_t mode);
|
| 69 | struct dentry *d_hash_and_lookup(struct dentry *, struct qstr *);
|
| 70 | struct dentry *start_dirop(struct dentry *parent, struct qstr *name,
|
| 71 | unsigned int lookup_flags);
|
| 72 | int lookup_noperm_common(struct qstr *qname, struct dentry *base);
|
| 73 |
|
| 74 | void __init filename_init(void);
|
| 75 |
|
| 76 | |
| 77 | * namespace.c
|
| 78 |
|
| 79 | extern struct vfsmount *lookup_mnt(const struct path *);
|
| 80 | extern int finish_automount(struct vfsmount *, const struct path *);
|
| 81 |
|
| 82 | extern int sb_prepare_remount_readonly(struct super_block *);
|
| 83 |
|
| 84 | extern void __init mnt_init(void);
|
| 85 |
|
| 86 | int mnt_get_write_access_file(struct file *file);
|
| 87 | void mnt_put_write_access_file(struct file *file);
|
| 88 |
|
| 89 | extern void dissolve_on_fput(struct vfsmount *);
|
| 90 | extern bool may_mount(void);
|
| 91 |
|
| 92 | int path_mount(const char *dev_name, const struct path *path,
|
| 93 | const char *type_page, unsigned long flags, void *data_page);
|
| 94 | int path_umount(const struct path *path, int flags);
|
| 95 | int path_pivot_root(struct path *new, struct path *old);
|
| 96 |
|
| 97 | int show_path(struct seq_file *m, struct dentry *root);
|
| 98 |
|
| 99 | |
| 100 | * fs_struct.c
|
| 101 |
|
| 102 | extern void chroot_fs_refs(const struct path *, const struct path *);
|
| 103 |
|
| 104 | |
| 105 | * file_table.c
|
| 106 |
|
| 107 | struct file *alloc_empty_file(int flags, const struct cred *cred);
|
| 108 | struct file *alloc_empty_file_noaccount(int flags, const struct cred *cred);
|
| 109 | struct file *alloc_empty_backing_file(int flags, const struct cred *cred,
|
| 110 | const struct file *user_file);
|
| 111 | void backing_file_set_user_path(struct file *f, const struct path *path);
|
| 112 |
|
| 113 | static inline void file_put_write_access(struct file *file)
|
| 114 | {
|
| 115 | put_write_access(file->f_inode);
|
| 116 | mnt_put_write_access(file->f_path.mnt);
|
| 117 | if (unlikely(file->f_mode & FMODE_BACKING))
|
| 118 | mnt_put_write_access(backing_file_user_path(file)->mnt);
|
| 119 | }
|
| 120 |
|
| 121 | static inline void put_file_access(struct file *file)
|
| 122 | {
|
| 123 | if ((file->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ) {
|
| 124 | i_readcount_dec(file->f_inode);
|
| 125 | } else if (file->f_mode & FMODE_WRITER) {
|
| 126 | file_put_write_access(file);
|
| 127 | }
|
| 128 | }
|
| 129 |
|
| 130 | void fput_close_sync(struct file *);
|
| 131 | void fput_close(struct file *);
|
| 132 |
|
| 133 | |
| 134 | * super.c
|
| 135 |
|
| 136 | extern int reconfigure_super(struct fs_context *);
|
| 137 | extern bool super_trylock_shared(struct super_block *sb);
|
| 138 | struct super_block *user_get_super(dev_t, bool excl);
|
| 139 | void put_super(struct super_block *sb);
|
| 140 | void __init super_dev_init(void);
|
| 141 | extern bool mount_capable(struct fs_context *);
|
| 142 |
|
| 143 | |
| 144 | * Prepare superblock for changing its read-only state (i.e., either remount
|
| 145 | * read-write superblock read-only or vice versa). After this function returns
|
| 146 | * mnt_is_readonly() will return true for any mount of the superblock if its
|
| 147 | * caller is able to observe any changes done by the remount. This holds until
|
| 148 | * sb_end_ro_state_change() is called.
|
| 149 |
|
| 150 | static inline void sb_start_ro_state_change(struct super_block *sb)
|
| 151 | {
|
| 152 | WRITE_ONCE(sb->s_readonly_remount, 1);
|
| 153 | |
| 154 | * For RO->RW transition, the barrier pairs with the barrier in
|
| 155 | * mnt_is_readonly() making sure if mnt_is_readonly() sees SB_RDONLY
|
| 156 | * cleared, it will see s_readonly_remount set.
|
| 157 | * For RW->RO transition, the barrier pairs with the barrier in
|
| 158 | * mnt_get_write_access() before the mnt_is_readonly() check.
|
| 159 | * The barrier makes sure if mnt_get_write_access() sees MNT_WRITE_HOLD
|
| 160 | * already cleared, it will see s_readonly_remount set.
|
| 161 |
|
| 162 | smp_wmb();
|
| 163 | }
|
| 164 |
|
| 165 | |
| 166 | * Ends section changing read-only state of the superblock. After this function
|
| 167 | * returns if mnt_is_readonly() returns false, the caller will be able to
|
| 168 | * observe all the changes remount did to the superblock.
|
| 169 |
|
| 170 | static inline void sb_end_ro_state_change(struct super_block *sb)
|
| 171 | {
|
| 172 | |
| 173 | * This barrier provides release semantics that pairs with
|
| 174 | * the smp_rmb() acquire semantics in mnt_is_readonly().
|
| 175 | * This barrier pair ensure that when mnt_is_readonly() sees
|
| 176 | * 0 for sb->s_readonly_remount, it will also see all the
|
| 177 | * preceding flag changes that were made during the RO state
|
| 178 | * change.
|
| 179 |
|
| 180 | smp_wmb();
|
| 181 | WRITE_ONCE(sb->s_readonly_remount, 0);
|
| 182 | }
|
| 183 |
|
| 184 | |
| 185 | * open.c
|
| 186 |
|
| 187 | struct open_flags {
|
| 188 | int open_flag;
|
| 189 | umode_t mode;
|
| 190 | int acc_mode;
|
| 191 | int intent;
|
| 192 | int lookup_flags;
|
| 193 | };
|
| 194 | extern struct file *do_file_open(int dfd, struct filename *pathname,
|
| 195 | const struct open_flags *op);
|
| 196 | extern struct file *do_file_open_root(const struct path *,
|
| 197 | const char *, const struct open_flags *);
|
| 198 | extern struct open_how build_open_how(int flags, umode_t mode);
|
| 199 | extern int build_open_flags(const struct open_how *how, struct open_flags *op);
|
| 200 | struct file *file_close_fd_locked(struct files_struct *files, unsigned fd);
|
| 201 | int filp_close_sync(struct file *filp, fl_owner_t id);
|
| 202 |
|
| 203 | int do_ftruncate(struct file *file, loff_t length, unsigned int flags);
|
| 204 | int chmod_common(const struct path *path, umode_t mode);
|
| 205 | int do_fchownat(int dfd, const char __user *filename, uid_t user, gid_t group,
|
| 206 | int flag);
|
| 207 | int chown_common(const struct path *path, uid_t user, gid_t group);
|
| 208 | extern int vfs_open(const struct path *, struct file *);
|
| 209 | int vfs_open_consume(struct path *, struct file *);
|
| 210 |
|
| 211 | |
| 212 | * inode.c
|
| 213 |
|
| 214 | extern long prune_icache_sb(struct super_block *sb, struct shrink_control *sc);
|
| 215 | int dentry_needs_remove_privs(const struct mnt_idmap *, struct dentry *dentry);
|
| 216 | bool in_group_or_capable(const struct mnt_idmap *idmap,
|
| 217 | const struct inode *inode, vfsgid_t vfsgid);
|
| 218 |
|
| 219 | |
| 220 | * fs-writeback.c
|
| 221 |
|
| 222 | long get_nr_dirty_inodes(void);
|
| 223 | bool sync_lazytime(struct inode *inode);
|
| 224 |
|
| 225 | |
| 226 | * dcache.c
|
| 227 |
|
| 228 | extern int d_set_mounted(struct dentry *dentry);
|
| 229 | extern long prune_dcache_sb(struct super_block *sb, struct shrink_control *sc);
|
| 230 | extern struct dentry *d_alloc_cursor(struct dentry *);
|
| 231 | extern struct dentry * d_alloc_pseudo(struct super_block *, const struct qstr *);
|
| 232 | extern char *simple_dname(struct dentry *, char *, int);
|
| 233 | extern void dput_to_list(struct dentry *, struct list_head *);
|
| 234 | extern void shrink_dentry_list(struct list_head *);
|
| 235 | extern void shrink_dcache_for_umount(struct super_block *);
|
| 236 | extern struct dentry *__d_lookup(const struct dentry *, const struct qstr *);
|
| 237 | extern struct dentry *__d_lookup_rcu(const struct dentry *parent,
|
| 238 | const struct qstr *name, unsigned *seq);
|
| 239 |
|
| 240 | |
| 241 | * pipe.c
|
| 242 |
|
| 243 | extern const struct file_operations pipefifo_fops;
|
| 244 |
|
| 245 | |
| 246 | * fs_pin.c
|
| 247 |
|
| 248 | extern void group_pin_kill(struct hlist_head *p);
|
| 249 | extern void mnt_pin_kill(struct mount *m);
|
| 250 |
|
| 251 | |
| 252 | * fs/nsfs.c
|
| 253 |
|
| 254 | extern const struct dentry_operations ns_dentry_operations;
|
| 255 | int open_namespace(struct ns_common *ns);
|
| 256 | struct file *open_namespace_file(struct ns_common *ns);
|
| 257 |
|
| 258 | |
| 259 | * fs/stat.c:
|
| 260 |
|
| 261 |
|
| 262 | int do_statx(int dfd, struct filename *filename, unsigned int flags,
|
| 263 | unsigned int mask, struct statx __user *buffer);
|
| 264 | int do_statx_fd(int fd, unsigned int flags, unsigned int mask,
|
| 265 | struct statx __user *buffer);
|
| 266 |
|
| 267 | |
| 268 | * fs/splice.c:
|
| 269 |
|
| 270 | ssize_t splice_file_to_pipe(struct file *in,
|
| 271 | struct pipe_inode_info *opipe,
|
| 272 | loff_t *offset,
|
| 273 | size_t len, unsigned int flags);
|
| 274 |
|
| 275 | |
| 276 | * fs/xattr.c:
|
| 277 |
|
| 278 | struct xattr_name {
|
| 279 | char name[XATTR_NAME_MAX + 1];
|
| 280 | };
|
| 281 |
|
| 282 | struct kernel_xattr_ctx {
|
| 283 |
|
| 284 | union {
|
| 285 | const void __user *cvalue;
|
| 286 | void __user *value;
|
| 287 | };
|
| 288 | void *kvalue;
|
| 289 | size_t size;
|
| 290 |
|
| 291 | struct xattr_name *kname;
|
| 292 | unsigned int flags;
|
| 293 | };
|
| 294 |
|
| 295 | ssize_t file_getxattr(struct file *file, struct kernel_xattr_ctx *ctx);
|
| 296 | ssize_t filename_getxattr(int dfd, struct filename *filename,
|
| 297 | unsigned int lookup_flags, struct kernel_xattr_ctx *ctx);
|
| 298 | int file_setxattr(struct file *file, struct kernel_xattr_ctx *ctx);
|
| 299 | int filename_setxattr(int dfd, struct filename *filename,
|
| 300 | unsigned int lookup_flags, struct kernel_xattr_ctx *ctx);
|
| 301 | int setxattr_copy(const char __user *name, struct kernel_xattr_ctx *ctx);
|
| 302 | int import_xattr_name(struct xattr_name *kname, const char __user *name);
|
| 303 |
|
| 304 | int may_write_xattr(const struct mnt_idmap *idmap, struct inode *inode);
|
| 305 |
|
| 306 | #ifdef CONFIG_FS_POSIX_ACL
|
| 307 | int do_set_acl(const struct mnt_idmap *idmap, struct dentry *dentry,
|
| 308 | const char *acl_name, const void *kvalue, size_t size);
|
| 309 | ssize_t do_get_acl(const struct mnt_idmap *idmap, struct dentry *dentry,
|
| 310 | const char *acl_name, void *kvalue, size_t size);
|
| 311 | #else
|
| 312 | static inline int do_set_acl(const struct mnt_idmap *idmap,
|
| 313 | struct dentry *dentry, const char *acl_name,
|
| 314 | const void *kvalue, size_t size)
|
| 315 | {
|
| 316 | return -EOPNOTSUPP;
|
| 317 | }
|
| 318 | static inline ssize_t do_get_acl(const struct mnt_idmap *idmap,
|
| 319 | struct dentry *dentry, const char *acl_name,
|
| 320 | void *kvalue, size_t size)
|
| 321 | {
|
| 322 | return -EOPNOTSUPP;
|
| 323 | }
|
| 324 | #endif
|
| 325 |
|
| 326 | ssize_t __kernel_write_iter(struct file *file, struct iov_iter *from, loff_t *pos);
|
| 327 |
|
| 328 | |
| 329 | * fs/attr.c
|
| 330 |
|
| 331 | struct mnt_idmap *alloc_mnt_idmap(struct user_namespace *mnt_userns);
|
| 332 | const struct mnt_idmap *mnt_idmap_get(const struct mnt_idmap *idmap);
|
| 333 | void mnt_idmap_put(const struct mnt_idmap *idmap);
|
| 334 | struct stashed_operations {
|
| 335 | struct dentry *(*stash_dentry)(struct dentry **stashed,
|
| 336 | struct dentry *dentry);
|
| 337 | void (*put_data)(void *data);
|
| 338 | int (*init_inode)(struct inode *inode, void *data);
|
| 339 | };
|
| 340 | int path_from_stashed(struct dentry **stashed, struct vfsmount *mnt, void *data,
|
| 341 | struct path *path);
|
| 342 | void stashed_dentry_prune(struct dentry *dentry);
|
| 343 | struct dentry *stash_dentry(struct dentry **stashed, struct dentry *dentry);
|
| 344 | struct dentry *stashed_dentry_get(struct dentry **stashed);
|
| 345 | |
| 346 | * path_mounted - check whether path is mounted
|
| 347 | * @path: path to check
|
| 348 | *
|
| 349 | * Determine whether @path refers to the root of a mount.
|
| 350 | *
|
| 351 | * Return: true if @path is the root of a mount, false if not.
|
| 352 |
|
| 353 | static inline bool path_mounted(const struct path *path)
|
| 354 | {
|
| 355 | return path->mnt->mnt_root == path->dentry;
|
| 356 | }
|
| 357 | void file_f_owner_release(struct file *file);
|
| 358 | bool file_seek_cur_needs_f_lock(struct file *file);
|
| 359 | int statmount_mnt_idmap(const struct mnt_idmap *idmap, struct seq_file *seq, bool uid_map);
|
| 360 | struct dentry *find_next_child(struct dentry *parent, struct dentry *prev);
|
| 361 | int anon_inode_getattr(const struct mnt_idmap *idmap, const struct path *path,
|
| 362 | struct kstat *stat, u32 request_mask,
|
| 363 | unsigned int query_flags);
|
| 364 | int anon_inode_setattr(const struct mnt_idmap *idmap, struct dentry *dentry,
|
| 365 | struct iattr *attr);
|
| 366 | void pidfs_get_root(struct path *path);
|
| 367 | void nsfs_get_root(struct path *path);
|
| 368 | void failfs_get_root(struct path *path);
|
| 369 | void __init failfs_init(void);
|
| 370 | bool failfs_mnt(const struct vfsmount *mnt);
|
| 371 | int failfs_current_chdir(void);
|