Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6: (52 commits) init: Open /dev/console from rootfs mqueue: fix typo "failues" -> "failures" mqueue: only set error codes if they are really necessary mqueue: simplify do_open() error handling mqueue: apply mathematics distributivity on mq_bytes calculation mqueue: remove unneeded info->messages initialization mqueue: fix mq_open() file descriptor leak on user-space processes fix race in d_splice_alias() set S_DEAD on unlink() and non-directory rename() victims vfs: add NOFOLLOW flag to umount(2) get rid of ->mnt_parent in tomoyo/realpath hppfs can use existing proc_mnt, no need for do_kern_mount() in there Mirror MS_KERNMOUNT in ->mnt_flags get rid of useless vfsmount_lock use in put_mnt_ns() Take vfsmount_lock to fs/internal.h get rid of insanity with namespace roots in tomoyo take check for new events in namespace (guts of mounts_poll()) to namespace.c Don't mess with generic_permission() under ->d_lock in hpfs sanitize const/signedness for udf nilfs: sanitize const/signedness in dealing with ->d_name.name ... Fix up fairly trivial (famous last words...) conflicts in drivers/infiniband/core/uverbs_main.c and security/tomoyo/realpath.c
This commit is contained in:
commit
0f2cc4ecd8
73 changed files with 794 additions and 1101 deletions
|
|
@ -424,7 +424,7 @@ extern void audit_syscall_exit(int failed, long return_code);
|
|||
extern void __audit_getname(const char *name);
|
||||
extern void audit_putname(const char *name);
|
||||
extern void __audit_inode(const char *name, const struct dentry *dentry);
|
||||
extern void __audit_inode_child(const char *dname, const struct dentry *dentry,
|
||||
extern void __audit_inode_child(const struct dentry *dentry,
|
||||
const struct inode *parent);
|
||||
extern void __audit_ptrace(struct task_struct *t);
|
||||
|
||||
|
|
@ -442,11 +442,10 @@ static inline void audit_inode(const char *name, const struct dentry *dentry) {
|
|||
if (unlikely(!audit_dummy_context()))
|
||||
__audit_inode(name, dentry);
|
||||
}
|
||||
static inline void audit_inode_child(const char *dname,
|
||||
const struct dentry *dentry,
|
||||
static inline void audit_inode_child(const struct dentry *dentry,
|
||||
const struct inode *parent) {
|
||||
if (unlikely(!audit_dummy_context()))
|
||||
__audit_inode_child(dname, dentry, parent);
|
||||
__audit_inode_child(dentry, parent);
|
||||
}
|
||||
void audit_core_dumps(long signr);
|
||||
|
||||
|
|
@ -544,9 +543,9 @@ extern int audit_signals;
|
|||
#define audit_getname(n) do { ; } while (0)
|
||||
#define audit_putname(n) do { ; } while (0)
|
||||
#define __audit_inode(n,d) do { ; } while (0)
|
||||
#define __audit_inode_child(d,i,p) do { ; } while (0)
|
||||
#define __audit_inode_child(i,p) do { ; } while (0)
|
||||
#define audit_inode(n,d) do { ; } while (0)
|
||||
#define audit_inode_child(d,i,p) do { ; } while (0)
|
||||
#define audit_inode_child(i,p) do { ; } while (0)
|
||||
#define audit_core_dumps(i) do { ; } while (0)
|
||||
#define auditsc_get_stamp(c,t,s) (0)
|
||||
#define audit_get_loginuid(t) (-1)
|
||||
|
|
|
|||
|
|
@ -1305,6 +1305,8 @@ extern int send_sigurg(struct fown_struct *fown);
|
|||
#define MNT_FORCE 0x00000001 /* Attempt to forcibily umount */
|
||||
#define MNT_DETACH 0x00000002 /* Just detach from the tree */
|
||||
#define MNT_EXPIRE 0x00000004 /* Mark for expiry */
|
||||
#define UMOUNT_NOFOLLOW 0x00000008 /* Don't follow symlink on umount */
|
||||
#define UMOUNT_UNUSED 0x80000000 /* Flag guaranteed to be unused */
|
||||
|
||||
extern struct list_head super_blocks;
|
||||
extern spinlock_t sb_lock;
|
||||
|
|
@ -1314,9 +1316,9 @@ extern spinlock_t sb_lock;
|
|||
struct super_block {
|
||||
struct list_head s_list; /* Keep this first */
|
||||
dev_t s_dev; /* search index; _not_ kdev_t */
|
||||
unsigned long s_blocksize;
|
||||
unsigned char s_blocksize_bits;
|
||||
unsigned char s_dirt;
|
||||
unsigned char s_blocksize_bits;
|
||||
unsigned long s_blocksize;
|
||||
loff_t s_maxbytes; /* Max file size */
|
||||
struct file_system_type *s_type;
|
||||
const struct super_operations *s_op;
|
||||
|
|
@ -1357,16 +1359,16 @@ struct super_block {
|
|||
void *s_fs_info; /* Filesystem private info */
|
||||
fmode_t s_mode;
|
||||
|
||||
/* Granularity of c/m/atime in ns.
|
||||
Cannot be worse than a second */
|
||||
u32 s_time_gran;
|
||||
|
||||
/*
|
||||
* The next field is for VFS *only*. No filesystems have any business
|
||||
* even looking at it. You had been warned.
|
||||
*/
|
||||
struct mutex s_vfs_rename_mutex; /* Kludge */
|
||||
|
||||
/* Granularity of c/m/atime in ns.
|
||||
Cannot be worse than a second */
|
||||
u32 s_time_gran;
|
||||
|
||||
/*
|
||||
* Filesystem subtype. If non-empty the filesystem type field
|
||||
* in /proc/mounts will be "type.subtype"
|
||||
|
|
@ -1794,7 +1796,8 @@ extern int may_umount(struct vfsmount *);
|
|||
extern long do_mount(char *, char *, char *, unsigned long, void *);
|
||||
extern struct vfsmount *collect_mounts(struct path *);
|
||||
extern void drop_collected_mounts(struct vfsmount *);
|
||||
|
||||
extern int iterate_mounts(int (*)(struct vfsmount *, void *), void *,
|
||||
struct vfsmount *);
|
||||
extern int vfs_statfs(struct dentry *, struct kstatfs *);
|
||||
|
||||
extern int current_umask(void);
|
||||
|
|
@ -2058,12 +2061,6 @@ extern int invalidate_inodes(struct super_block *);
|
|||
unsigned long invalidate_mapping_pages(struct address_space *mapping,
|
||||
pgoff_t start, pgoff_t end);
|
||||
|
||||
static inline unsigned long __deprecated
|
||||
invalidate_inode_pages(struct address_space *mapping)
|
||||
{
|
||||
return invalidate_mapping_pages(mapping, 0, ~0UL);
|
||||
}
|
||||
|
||||
static inline void invalidate_remote_inode(struct inode *inode)
|
||||
{
|
||||
if (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
|
||||
|
|
@ -2132,6 +2129,7 @@ extern struct file * open_exec(const char *);
|
|||
|
||||
/* fs/dcache.c -- generic fs support functions */
|
||||
extern int is_subdir(struct dentry *, struct dentry *);
|
||||
extern int path_is_under(struct path *, struct path *);
|
||||
extern ino_t find_inode_number(struct dentry *, struct qstr *);
|
||||
|
||||
#include <linux/err.h>
|
||||
|
|
@ -2340,8 +2338,6 @@ extern int simple_rename(struct inode *, struct dentry *, struct inode *, struct
|
|||
extern int simple_sync_file(struct file *, struct dentry *, int);
|
||||
extern int simple_empty(struct dentry *);
|
||||
extern int simple_readpage(struct file *file, struct page *page);
|
||||
extern int simple_prepare_write(struct file *file, struct page *page,
|
||||
unsigned offset, unsigned to);
|
||||
extern int simple_write_begin(struct file *file, struct address_space *mapping,
|
||||
loff_t pos, unsigned len, unsigned flags,
|
||||
struct page **pagep, void **fsdata);
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ static inline void fsnotify_link_count(struct inode *inode)
|
|||
* fsnotify_move - file old_name at old_dir was moved to new_name at new_dir
|
||||
*/
|
||||
static inline void fsnotify_move(struct inode *old_dir, struct inode *new_dir,
|
||||
const char *old_name, const char *new_name,
|
||||
const char *old_name,
|
||||
int isdir, struct inode *target, struct dentry *moved)
|
||||
{
|
||||
struct inode *source = moved->d_inode;
|
||||
|
|
@ -73,6 +73,7 @@ static inline void fsnotify_move(struct inode *old_dir, struct inode *new_dir,
|
|||
u32 fs_cookie = fsnotify_get_cookie();
|
||||
__u32 old_dir_mask = (FS_EVENT_ON_CHILD | FS_MOVED_FROM);
|
||||
__u32 new_dir_mask = (FS_EVENT_ON_CHILD | FS_MOVED_TO);
|
||||
const char *new_name = moved->d_name.name;
|
||||
|
||||
if (old_dir == new_dir)
|
||||
old_dir_mask |= FS_DN_RENAME;
|
||||
|
|
@ -103,7 +104,7 @@ static inline void fsnotify_move(struct inode *old_dir, struct inode *new_dir,
|
|||
inotify_inode_queue_event(source, IN_MOVE_SELF, 0, NULL, NULL);
|
||||
fsnotify(source, FS_MOVE_SELF, moved->d_inode, FSNOTIFY_EVENT_INODE, NULL, 0);
|
||||
}
|
||||
audit_inode_child(new_name, moved, new_dir);
|
||||
audit_inode_child(moved, new_dir);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -146,7 +147,7 @@ static inline void fsnotify_create(struct inode *inode, struct dentry *dentry)
|
|||
{
|
||||
inotify_inode_queue_event(inode, IN_CREATE, 0, dentry->d_name.name,
|
||||
dentry->d_inode);
|
||||
audit_inode_child(dentry->d_name.name, dentry, inode);
|
||||
audit_inode_child(dentry, inode);
|
||||
|
||||
fsnotify(inode, FS_CREATE, dentry->d_inode, FSNOTIFY_EVENT_INODE, dentry->d_name.name, 0);
|
||||
}
|
||||
|
|
@ -161,7 +162,7 @@ static inline void fsnotify_link(struct inode *dir, struct inode *inode, struct
|
|||
inotify_inode_queue_event(dir, IN_CREATE, 0, new_dentry->d_name.name,
|
||||
inode);
|
||||
fsnotify_link_count(inode);
|
||||
audit_inode_child(new_dentry->d_name.name, new_dentry, dir);
|
||||
audit_inode_child(new_dentry, dir);
|
||||
|
||||
fsnotify(dir, FS_CREATE, inode, FSNOTIFY_EVENT_INODE, new_dentry->d_name.name, 0);
|
||||
}
|
||||
|
|
@ -175,7 +176,7 @@ static inline void fsnotify_mkdir(struct inode *inode, struct dentry *dentry)
|
|||
struct inode *d_inode = dentry->d_inode;
|
||||
|
||||
inotify_inode_queue_event(inode, mask, 0, dentry->d_name.name, d_inode);
|
||||
audit_inode_child(dentry->d_name.name, dentry, inode);
|
||||
audit_inode_child(dentry, inode);
|
||||
|
||||
fsnotify(inode, mask, d_inode, FSNOTIFY_EVENT_INODE, dentry->d_name.name, 0);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -52,7 +52,6 @@
|
|||
#define CGROUP_SUPER_MAGIC 0x27e0eb
|
||||
|
||||
#define FUTEXFS_SUPER_MAGIC 0xBAD1DEA
|
||||
#define INOTIFYFS_SUPER_MAGIC 0x2BAD1DEA
|
||||
|
||||
#define STACK_END_MAGIC 0x57AC6E9D
|
||||
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@ static inline void get_mnt_ns(struct mnt_namespace *ns)
|
|||
extern const struct seq_operations mounts_op;
|
||||
extern const struct seq_operations mountinfo_op;
|
||||
extern const struct seq_operations mountstats_op;
|
||||
extern int mnt_had_events(struct proc_mounts *);
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -34,7 +34,18 @@ struct mnt_namespace;
|
|||
|
||||
#define MNT_SHARED 0x1000 /* if the vfsmount is a shared mount */
|
||||
#define MNT_UNBINDABLE 0x2000 /* if the vfsmount is a unbindable mount */
|
||||
#define MNT_PNODE_MASK 0x3000 /* propagation flag mask */
|
||||
/*
|
||||
* MNT_SHARED_MASK is the set of flags that should be cleared when a
|
||||
* mount becomes shared. Currently, this is only the flag that says a
|
||||
* mount cannot be bind mounted, since this is how we create a mount
|
||||
* that shares events with another mount. If you add a new MNT_*
|
||||
* flag, consider how it interacts with shared mounts.
|
||||
*/
|
||||
#define MNT_SHARED_MASK (MNT_UNBINDABLE)
|
||||
#define MNT_PROPAGATION_MASK (MNT_SHARED | MNT_UNBINDABLE)
|
||||
|
||||
|
||||
#define MNT_INTERNAL 0x4000
|
||||
|
||||
struct vfsmount {
|
||||
struct list_head mnt_hash;
|
||||
|
|
@ -123,7 +134,6 @@ extern int do_add_mount(struct vfsmount *newmnt, struct path *path,
|
|||
|
||||
extern void mark_mounts_for_expiry(struct list_head *mounts);
|
||||
|
||||
extern spinlock_t vfsmount_lock;
|
||||
extern dev_t name_to_dev_t(char *name);
|
||||
|
||||
#endif /* _LINUX_MOUNT_H */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue