2011-11-23 19:26:23 -05:00
# include <linux/mount.h>
2011-12-06 12:21:54 -05:00
# include <linux/seq_file.h>
# include <linux/poll.h>
2014-10-31 22:56:04 -04:00
# include <linux/ns_common.h>
2015-01-10 19:01:08 -05:00
# include <linux/fs_pin.h>
2011-12-06 12:21:54 -05:00
struct mnt_namespace {
atomic_t count ;
2014-10-31 22:56:04 -04:00
struct ns_common ns ;
2011-12-06 13:32:36 -05:00
struct mount * root ;
2011-12-06 12:21:54 -05:00
struct list_head list ;
2012-07-26 21:08:32 -07:00
struct user_namespace * user_ns ;
2010-03-07 18:49:36 -08:00
u64 seq ; /* Sequence number to prevent loops */
2011-12-06 12:21:54 -05:00
wait_queue_head_t poll ;
2014-02-27 14:40:10 -05:00
u64 event ;
2011-12-06 12:21:54 -05:00
} ;
2011-11-23 19:26:23 -05:00
2011-11-24 22:53:09 -05:00
struct mnt_pcp {
int mnt_count ;
int mnt_writers ;
} ;
2013-03-15 10:53:28 -04:00
struct mountpoint {
2014-02-28 13:46:44 -05:00
struct hlist_node m_hash ;
2013-03-15 10:53:28 -04:00
struct dentry * m_dentry ;
2013-09-22 19:37:01 -07:00
struct hlist_head m_list ;
2013-03-15 10:53:28 -04:00
int m_count ;
} ;
2011-11-23 12:14:10 -05:00
struct mount {
2014-03-20 21:10:51 -04:00
struct hlist_node mnt_hash ;
2011-11-24 22:19:58 -05:00
struct mount * mnt_parent ;
2011-11-24 22:25:07 -05:00
struct dentry * mnt_mountpoint ;
2011-11-23 12:14:10 -05:00
struct vfsmount mnt ;
2014-08-08 13:08:20 -04:00
union {
struct rcu_head mnt_rcu ;
struct llist_node mnt_llist ;
} ;
2011-11-24 22:53:09 -05:00
# ifdef CONFIG_SMP
struct mnt_pcp __percpu * mnt_pcp ;
# else
int mnt_count ;
int mnt_writers ;
# endif
2011-11-24 23:24:33 -05: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 12:11:30 +01:00
struct list_head mnt_instance ; /* mount instance on sb->s_mounts */
2011-11-25 02:25:17 -05:00
const char * mnt_devname ; /* Name of device e.g. /dev/dsk/hda1 */
2011-11-25 02:19:55 -05:00
struct list_head mnt_list ;
2011-11-25 00:22:05 -05: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 00:10:28 -05:00
struct mount * mnt_master ; /* slave is on master->mnt_slave_list */
2011-11-25 00:46:35 -05:00
struct mnt_namespace * mnt_ns ; /* containing namespace */
2013-03-15 10:53:28 -04:00
struct mountpoint * mnt_mp ; /* where is it mounted */
2013-09-22 19:37:01 -07:00
struct hlist_node mnt_mp_list ; /* list mounts with the same mountpoint */
2011-11-25 02:35:16 -05:00
# ifdef CONFIG_FSNOTIFY
struct hlist_head mnt_fsnotify_marks ;
__u32 mnt_fsnotify_mask ;
# endif
2011-11-25 00:50:41 -05:00
int mnt_id ; /* mount identifier */
int mnt_group_id ; /* peer group identifier */
2011-11-25 00:57:42 -05:00
int mnt_expiry_mark ; /* true if marked for expiry */
2014-08-07 06:23:41 -04:00
struct hlist_head mnt_pins ;
2015-01-10 19:01:08 -05:00
struct fs_pin mnt_umount ;
struct dentry * mnt_ex_mountpoint ;
2011-11-23 12:14:10 -05:00
} ;
2012-06-09 00:59:08 -04:00
# define MNT_NS_INTERNAL ERR_PTR(-EINVAL) /* distinct from any mnt_namespace */
2011-11-23 12:14:10 -05:00
static inline struct mount * real_mount ( struct vfsmount * mnt )
{
return container_of ( mnt , struct mount , mnt ) ;
}
2011-11-24 21:47:05 -05:00
static inline int mnt_has_parent ( struct mount * mnt )
2011-11-23 19:26:23 -05:00
{
2011-11-24 22:19:58 -05:00
return mnt ! = mnt - > mnt_parent ;
2011-11-23 19:26:23 -05:00
}
2011-11-24 18:22:03 -05:00
2012-06-09 00:59:08 -04:00
static inline int is_mounted ( struct vfsmount * mnt )
{
/* neither detached nor internal? */
2014-01-20 15:26:15 -08:00
return ! IS_ERR_OR_NULL ( real_mount ( mnt ) - > mnt_ns ) ;
2012-06-09 00:59:08 -04:00
}
2013-10-01 16:11:26 -04:00
extern struct mount * __lookup_mnt ( struct vfsmount * , struct dentry * ) ;
extern struct mount * __lookup_mnt_last ( struct vfsmount * , struct dentry * ) ;
2011-12-06 12:21:54 -05:00
2015-05-08 11:43:53 -04:00
extern int __legitimize_mnt ( struct vfsmount * , unsigned ) ;
2013-09-29 22:06:07 -04:00
extern bool legitimize_mnt ( struct vfsmount * , unsigned ) ;
2013-10-03 01:31:18 -07:00
extern void __detach_mounts ( struct dentry * dentry ) ;
static inline void detach_mounts ( struct dentry * dentry )
{
if ( ! d_mountpoint ( dentry ) )
return ;
__detach_mounts ( dentry ) ;
}
2011-12-06 12:21:54 -05:00
static inline void get_mnt_ns ( struct mnt_namespace * ns )
{
atomic_inc ( & ns - > count ) ;
}
2013-09-29 22:06:07 -04:00
extern seqlock_t mount_lock ;
2013-09-29 11:24:49 -04:00
static inline void lock_mount_hash ( void )
{
2013-09-29 22:06:07 -04:00
write_seqlock ( & mount_lock ) ;
2013-09-29 11:24:49 -04:00
}
static inline void unlock_mount_hash ( void )
{
2013-09-29 22:06:07 -04:00
write_sequnlock ( & mount_lock ) ;
2013-09-29 11:24:49 -04:00
}
2011-12-06 12:21:54 -05:00
struct proc_mounts {
struct mnt_namespace * ns ;
struct path root ;
int ( * show ) ( struct seq_file * , struct vfsmount * ) ;
2014-02-27 14:40:10 -05:00
void * cached_mount ;
u64 cached_event ;
loff_t cached_index ;
2011-12-06 12:21:54 -05:00
} ;
extern const struct seq_operations mounts_op ;
2013-10-04 19:15:13 -07:00
extern bool __is_local_mountpoint ( struct dentry * dentry ) ;
static inline bool is_local_mountpoint ( struct dentry * dentry )
{
if ( ! d_mountpoint ( dentry ) )
return false ;
return __is_local_mountpoint ( dentry ) ;
}