| #ifndef _LINUX_FS_STRUCT_H |
| #define _LINUX_FS_STRUCT_H |
| #ifdef __KERNEL__ |
| |
| #include <linux/mount.h> |
| #include <linux/dcache.h> |
| |
| struct fs_struct { |
| atomic_t count; |
| rwlock_t lock; |
| int umask; |
| struct dentry * root, * pwd, * altroot; |
| struct vfsmount * rootmnt, * pwdmnt, * altrootmnt; |
| }; |
| |
| #define INIT_FS { \ |
| ATOMIC_INIT(1), \ |
| RW_LOCK_UNLOCKED, \ |
| 0022, \ |
| NULL, NULL, NULL, NULL, NULL, NULL \ |
| } |
| |
| extern void exit_fs(struct task_struct *); |
| extern void set_fs_altroot(void); |
| |
| /* |
| * Replace the fs->{rootmnt,root} with {mnt,dentry}. Put the old values. |
| * It can block. Requires the big lock held. |
| */ |
| |
| static inline void set_fs_root(struct fs_struct *fs, |
| struct vfsmount *mnt, |
| struct dentry *dentry) |
| { |
| struct dentry *old_root; |
| struct vfsmount *old_rootmnt; |
| write_lock(&fs->lock); |
| old_root = fs->root; |
| old_rootmnt = fs->rootmnt; |
| fs->rootmnt = mntget(mnt); |
| fs->root = dget(dentry); |
| write_unlock(&fs->lock); |
| if (old_root) { |
| dput(old_root); |
| mntput(old_rootmnt); |
| } |
| } |
| |
| /* |
| * Replace the fs->{pwdmnt,pwd} with {mnt,dentry}. Put the old values. |
| * It can block. Requires the big lock held. |
| */ |
| |
| static inline void set_fs_pwd(struct fs_struct *fs, |
| struct vfsmount *mnt, |
| struct dentry *dentry) |
| { |
| struct dentry *old_pwd; |
| struct vfsmount *old_pwdmnt; |
| write_lock(&fs->lock); |
| old_pwd = fs->pwd; |
| old_pwdmnt = fs->pwdmnt; |
| fs->pwdmnt = mntget(mnt); |
| fs->pwd = dget(dentry); |
| write_unlock(&fs->lock); |
| if (old_pwd) { |
| dput(old_pwd); |
| mntput(old_pwdmnt); |
| } |
| } |
| |
| struct fs_struct *copy_fs_struct(struct fs_struct *old); |
| void put_fs_struct(struct fs_struct *fs); |
| |
| #endif |
| #endif |