fs: fs_struct rwlock to spinlock
[linux-2.6.git] / include / linux / fs_struct.h
index 11a36ceddf73a1e8670c1efb81a10cd8c0bf3e67..a42b5bf02f8bcfec3ea20ecef765df3f4d690250 100644 (file)
@@ -1,30 +1,51 @@
 #ifndef _LINUX_FS_STRUCT_H
 #define _LINUX_FS_STRUCT_H
 
 #ifndef _LINUX_FS_STRUCT_H
 #define _LINUX_FS_STRUCT_H
 
-struct dentry;
-struct vfsmount;
+#include <linux/path.h>
 
 struct fs_struct {
 
 struct fs_struct {
-       atomic_t count;
-       rwlock_t lock;
+       int users;
+       spinlock_t lock;
        int umask;
        int umask;
-       struct dentry * root, * pwd, * altroot;
-       struct vfsmount * rootmnt, * pwdmnt, * altrootmnt;
+       int in_exec;
+       struct path root, pwd;
 };
 
 };
 
-#define INIT_FS {                              \
-       .count          = ATOMIC_INIT(1),       \
-       .lock           = RW_LOCK_UNLOCKED,     \
-       .umask          = 0022, \
-}
-
 extern struct kmem_cache *fs_cachep;
 
 extern void exit_fs(struct task_struct *);
 extern struct kmem_cache *fs_cachep;
 
 extern void exit_fs(struct task_struct *);
-extern void set_fs_altroot(void);
-extern void set_fs_root(struct fs_struct *, struct vfsmount *, struct dentry *);
-extern void set_fs_pwd(struct fs_struct *, struct vfsmount *, struct dentry *);
+extern void set_fs_root(struct fs_struct *, struct path *);
+extern void set_fs_pwd(struct fs_struct *, struct path *);
 extern struct fs_struct *copy_fs_struct(struct fs_struct *);
 extern struct fs_struct *copy_fs_struct(struct fs_struct *);
-extern void put_fs_struct(struct fs_struct *);
+extern void free_fs_struct(struct fs_struct *);
+extern void daemonize_fs_struct(void);
+extern int unshare_fs_struct(void);
+
+static inline void get_fs_root(struct fs_struct *fs, struct path *root)
+{
+       spin_lock(&fs->lock);
+       *root = fs->root;
+       path_get(root);
+       spin_unlock(&fs->lock);
+}
+
+static inline void get_fs_pwd(struct fs_struct *fs, struct path *pwd)
+{
+       spin_lock(&fs->lock);
+       *pwd = fs->pwd;
+       path_get(pwd);
+       spin_unlock(&fs->lock);
+}
+
+static inline void get_fs_root_and_pwd(struct fs_struct *fs, struct path *root,
+                                      struct path *pwd)
+{
+       spin_lock(&fs->lock);
+       *root = fs->root;
+       path_get(root);
+       *pwd = fs->pwd;
+       path_get(pwd);
+       spin_unlock(&fs->lock);
+}
 
 #endif /* _LINUX_FS_STRUCT_H */
 
 #endif /* _LINUX_FS_STRUCT_H */