2011-11-24 04:26:23 +04:00
# include <linux/mount.h>
2011-12-06 21:21:54 +04:00
# include <linux/seq_file.h>
# include <linux/poll.h>
struct mnt_namespace {
atomic_t count ;
2011-06-15 21:21:48 +04:00
unsigned int proc_inum ;
2011-12-06 22:32:36 +04:00
struct mount * root ;
2011-12-06 21:21:54 +04:00
struct list_head list ;
2012-07-27 08:08:32 +04:00
struct user_namespace * user_ns ;
2010-03-08 05:49:36 +03:00
u64 seq ; /* Sequence number to prevent loops */
2011-12-06 21:21:54 +04:00
wait_queue_head_t poll ;
int event ;
} ;
2011-11-24 04:26:23 +04:00
2011-11-25 07:53:09 +04:00
struct mnt_pcp {
int mnt_count ;
int mnt_writers ;
} ;
2013-03-15 18:53:28 +04:00
struct mountpoint {
struct list_head m_hash ;
struct dentry * m_dentry ;
int m_count ;
} ;
2011-11-23 21:14:10 +04:00
struct mount {
2011-11-25 06:01:32 +04:00
struct list_head mnt_hash ;
2011-11-25 07:19:58 +04:00
struct mount * mnt_parent ;
2011-11-25 07:25:07 +04:00
struct dentry * mnt_mountpoint ;
2011-11-23 21:14:10 +04:00
struct vfsmount mnt ;
2011-11-25 07:53:09 +04:00
# ifdef CONFIG_SMP
struct mnt_pcp __percpu * mnt_pcp ;
# else
int mnt_count ;
int mnt_writers ;
# endif
2011-11-25 08:24:33 +04:00
struct list_head mnt_mounts ; /* list of children, anchored here */
struct list_head mnt_child ; /* and going through their mnt_child */
2011-11-21 15:11:30 +04:00
struct list_head mnt_instance ; /* mount instance on sb->s_mounts */
2011-11-25 11:25:17 +04:00
const char * mnt_devname ; /* Name of device e.g. /dev/dsk/hda1 */
2011-11-25 11:19:55 +04:00
struct list_head mnt_list ;
2011-11-25 09:22:05 +04:00
struct list_head mnt_expire ; /* link in fs-specific expiry list */
struct list_head mnt_share ; /* circular list of shared mounts */
struct list_head mnt_slave_list ; /* list of slave mounts */
struct list_head mnt_slave ; /* slave list entry */
2011-11-25 09:10:28 +04:00
struct mount * mnt_master ; /* slave is on master->mnt_slave_list */
2011-11-25 09:46:35 +04:00
struct mnt_namespace * mnt_ns ; /* containing namespace */
2013-03-15 18:53:28 +04:00
struct mountpoint * mnt_mp ; /* where is it mounted */
2011-11-25 11:35:16 +04:00
# ifdef CONFIG_FSNOTIFY
struct hlist_head mnt_fsnotify_marks ;
__u32 mnt_fsnotify_mask ;
# endif
2011-11-25 09:50:41 +04:00
int mnt_id ; /* mount identifier */
int mnt_group_id ; /* peer group identifier */
2011-11-25 09:57:42 +04:00
int mnt_expiry_mark ; /* true if marked for expiry */
int mnt_pinned ;
int mnt_ghosts ;
2011-11-23 21:14:10 +04:00
} ;
2012-06-09 08:59:08 +04:00
# define MNT_NS_INTERNAL ERR_PTR(-EINVAL) /* distinct from any mnt_namespace */
2011-11-23 21:14:10 +04:00
static inline struct mount * real_mount ( struct vfsmount * mnt )
{
return container_of ( mnt , struct mount , mnt ) ;
}
2011-11-25 06:47:05 +04:00
static inline int mnt_has_parent ( struct mount * mnt )
2011-11-24 04:26:23 +04:00
{
2011-11-25 07:19:58 +04:00
return mnt ! = mnt - > mnt_parent ;
2011-11-24 04:26:23 +04:00
}
2011-11-25 03:22:03 +04:00
2012-06-09 08:59:08 +04:00
static inline int is_mounted ( struct vfsmount * mnt )
{
/* neither detached nor internal? */
return ! IS_ERR_OR_NULL ( real_mount ( mnt ) ) ;
}
2011-11-25 03:22:03 +04:00
extern struct mount * __lookup_mnt ( struct vfsmount * , struct dentry * , int ) ;
2011-12-06 21:21:54 +04:00
static inline void get_mnt_ns ( struct mnt_namespace * ns )
{
atomic_inc ( & ns - > count ) ;
}
struct proc_mounts {
2012-06-09 09:16:59 +04:00
struct seq_file m ;
2011-12-06 21:21:54 +04:00
struct mnt_namespace * ns ;
struct path root ;
int ( * show ) ( struct seq_file * , struct vfsmount * ) ;
} ;
2012-06-09 09:16:59 +04:00
# define proc_mounts(p) (container_of((p), struct proc_mounts, m))
2011-12-06 21:21:54 +04:00
extern const struct seq_operations mounts_op ;