patch-2.3.99-pre7 linux/include/linux/fs.h

Next file: linux/include/linux/fs_struct.h
Previous file: linux/include/linux/filter.h
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.3.99-pre6/linux/include/linux/fs.h linux/include/linux/fs.h
@@ -20,6 +20,7 @@
 #include <linux/stat.h>
 #include <linux/cache.h>
 #include <linux/stddef.h>
+#include <linux/string.h>
 
 #include <asm/atomic.h>
 #include <asm/bitops.h>
@@ -78,7 +79,11 @@
 #define FS_NO_PRELIM	4 /* prevent preloading of dentries, even if
 			   * FS_NO_DCACHE is not set.
 			   */
-
+#define FS_SINGLE	8 /*
+			   * Filesystem that can have only one superblock;
+			   * kernel-wide vfsmnt is kept in ->kern_mnt.
+			   */
+#define FS_NOMOUNT	16 /* Never mount from userland */
 /*
  * These are the fs-independent mount-flags: up to 16 flags are supported
  */
@@ -173,7 +178,6 @@
 
 #ifdef __KERNEL__
 
-#include <linux/string.h>
 #include <asm/semaphore.h>
 #include <asm/byteorder.h>
 
@@ -251,7 +255,7 @@
 
 extern void set_bh_page(struct buffer_head *bh, struct page *page, unsigned long offset);
 
-#define touch_buffer(bh)	set_bit(PG_referenced, &bh->b_page->flags)
+#define touch_buffer(bh)	SetPageReferenced(bh->b_page)
 
 
 #include <linux/pipe_fs_i.h>
@@ -338,8 +342,8 @@
 struct address_space;
 
 struct address_space_operations {
-	int (*writepage)(struct file *, struct dentry *, struct page *);
-	int (*readpage)(struct dentry *, struct page *);
+	int (*writepage)(struct file *, struct page *);
+	int (*readpage)(struct file *, struct page *);
 	int (*sync_page)(struct page *);
 	int (*prepare_write)(struct file *, struct page *, unsigned, unsigned);
 	int (*commit_write)(struct file *, struct page *, unsigned, unsigned);
@@ -625,6 +629,7 @@
 	struct list_head	s_files;
 
 	struct block_device	*s_bdev;
+	struct list_head	s_mounts;	/* vfsmount(s) of this one */
 	struct quota_mount_options s_dquot;	/* Diskquota specific options */
 
 	union {
@@ -769,6 +774,7 @@
 	int fs_flags;
 	struct super_block *(*read_super) (struct super_block *, void *, int);
 	struct module *owner;
+	struct vfsmount *kern_mnt; /* For kernel mount, if it's FS_SINGLE fs */
 	struct file_system_type * next;
 };
 
@@ -785,16 +791,11 @@
 
 extern int register_filesystem(struct file_system_type *);
 extern int unregister_filesystem(struct file_system_type *);
+extern struct vfsmount *kern_mount(struct file_system_type *);
+extern void kern_umount(struct vfsmount *);
+extern int may_umount(struct vfsmount *);
 
-static inline int vfs_statfs(struct super_block *sb, struct statfs *buf)
-{
-	if (!sb)
-		return -ENODEV;
-	if (!sb->s_op || !sb->s_op->statfs)
-		return -ENOSYS;
-	memset(buf, 0, sizeof(struct statfs));
-	return sb->s_op->statfs(sb, buf);
-}
+extern int vfs_statfs(struct super_block *, struct statfs *);
 
 /* Return value for VFS lock functions - tells locks.c to lock conventionally
  * REALLY kosha for root NFS and nfs_lock
@@ -821,7 +822,7 @@
 	return 0;
 }
 
-extern inline int locks_verify_area(int read_write, struct inode *inode,
+static inline int locks_verify_area(int read_write, struct inode *inode,
 				    struct file *filp, loff_t offset,
 				    size_t count)
 {
@@ -830,7 +831,7 @@
 	return 0;
 }
 
-extern inline int locks_verify_truncate(struct inode *inode,
+static inline int locks_verify_truncate(struct inode *inode,
 				    struct file *filp,
 				    loff_t size)
 {
@@ -898,7 +899,6 @@
 extern struct file_operations rdwr_pipe_fops;
 
 extern int fs_may_remount_ro(struct super_block *);
-extern int fs_may_mount(kdev_t);
 
 extern int try_to_free_buffers(struct page *);
 extern void refile_buffer(struct buffer_head * buf);
@@ -912,7 +912,7 @@
 /*
  * This is called by bh->b_end_io() handlers when I/O has completed.
  */
-extern inline void mark_buffer_uptodate(struct buffer_head * bh, int on)
+static inline void mark_buffer_uptodate(struct buffer_head * bh, int on)
 {
 	if (on)
 		set_bit(BH_Uptodate, &bh->b_state);
@@ -922,12 +922,12 @@
 
 #define atomic_set_buffer_clean(bh) test_and_clear_bit(BH_Dirty, &(bh)->b_state)
 
-extern inline void __mark_buffer_clean(struct buffer_head *bh)
+static inline void __mark_buffer_clean(struct buffer_head *bh)
 {
 	refile_buffer(bh);
 }
 
-extern inline void mark_buffer_clean(struct buffer_head * bh)
+static inline void mark_buffer_clean(struct buffer_head * bh)
 {
 	if (atomic_set_buffer_clean(bh))
 		__mark_buffer_clean(bh);
@@ -935,12 +935,12 @@
 
 #define atomic_set_buffer_protected(bh) test_and_set_bit(BH_Protected, &(bh)->b_state)
 
-extern inline void __mark_buffer_protected(struct buffer_head *bh)
+static inline void __mark_buffer_protected(struct buffer_head *bh)
 {
 	refile_buffer(bh);
 }
 
-extern inline void mark_buffer_protected(struct buffer_head * bh)
+static inline void mark_buffer_protected(struct buffer_head * bh)
 {
 	if (!atomic_set_buffer_protected(bh))
 		__mark_buffer_protected(bh);
@@ -968,7 +968,6 @@
 extern int permission(struct inode *, int);
 extern int get_write_access(struct inode *);
 extern void put_write_access(struct inode *);
-extern struct dentry * do_mknod(const char *, int, dev_t);
 extern int do_pipe(int *);
 
 extern int open_namei(const char *, int, int, struct nameidata *);
@@ -1031,14 +1030,16 @@
 /* needed for stackable file system support */
 extern loff_t default_llseek(struct file *file, loff_t offset, int origin);
 
-extern struct dentry * lookup_dentry(const char *, unsigned int);
-extern int walk_init(const char *, unsigned, struct nameidata *);
-extern int walk_name(const char *, struct nameidata *);
+extern int __user_walk(const char *, unsigned, struct nameidata *);
+extern int path_init(const char *, unsigned, struct nameidata *);
+extern int path_walk(const char *, struct nameidata *);
+extern void path_release(struct nameidata *);
+extern int follow_down(struct vfsmount **, struct dentry **);
+extern int follow_up(struct vfsmount **, struct dentry **);
 extern struct dentry * lookup_one(const char *, struct dentry *);
-extern struct dentry * __namei(const char *, unsigned int);
-
-#define namei(pathname)		__namei(pathname, LOOKUP_FOLLOW)
-#define lnamei(pathname)	__namei(pathname, 0)
+extern struct dentry * lookup_hash(struct qstr *, struct dentry *);
+#define user_path_walk(name,nd)	 __user_walk(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, nd)
+#define user_path_walk_link(name,nd) __user_walk(name, LOOKUP_POSITIVE, nd)
 
 extern void iput(struct inode *);
 extern struct inode * igrab(struct inode *);
@@ -1064,13 +1065,13 @@
 extern void ll_rw_block(int, int, struct buffer_head * bh[]);
 extern int is_read_only(kdev_t);
 extern void __brelse(struct buffer_head *);
-extern inline void brelse(struct buffer_head *buf)
+static inline void brelse(struct buffer_head *buf)
 {
 	if (buf)
 		__brelse(buf);
 }
 extern void __bforget(struct buffer_head *);
-extern inline void bforget(struct buffer_head *buf)
+static inline void bforget(struct buffer_head *buf)
 {
 	if (buf)
 		__bforget(buf);
@@ -1083,7 +1084,6 @@
 
 extern int brw_page(int, struct page *, kdev_t, int [], int);
 
-typedef int (*writepage_t)(struct file *, struct page *, unsigned long, unsigned long, const char *);
 typedef int (get_block_t)(struct inode*,long,struct buffer_head*,int);
 
 /* Generic buffer handling for block filesystems.. */
@@ -1119,7 +1119,6 @@
 
 extern struct super_block *get_super(kdev_t);
 struct super_block *get_empty_super(void);
-void remove_vfsmnt(kdev_t dev);
 extern void put_super(kdev_t);
 unsigned long generate_cluster(kdev_t, int b[], int);
 unsigned long generate_cluster_swab32(kdev_t, int b[], int);

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)