Commit ecb5ec04 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs

Pull vfs pile #3 from Al Viro:
 "Assorted fixes and patches from the last cycle"

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
  [regression] chunk lost from bd9b51
  vfs: make mounts and mountstats honor root dir like mountinfo does
  vfs: cleanup show_mountinfo
  init: fix read-write root mount
  unfuck binfmt_misc.c (broken by commit e6084d4a)
  vm_area_operations: kill ->migrate()
  new helper: iter_is_iovec()
  move_extent_per_page(): get rid of unused w_flags
  lustre: get rid of playing with ->fs
  btrfs: filp_open() returns ERR_PTR() on failure, not NULL...
parents 298647e3 e3bb504e
...@@ -42,28 +42,6 @@ ...@@ -42,28 +42,6 @@
#include "lustre_patchless_compat.h" #include "lustre_patchless_compat.h"
# define LOCK_FS_STRUCT(fs) spin_lock(&(fs)->lock)
# define UNLOCK_FS_STRUCT(fs) spin_unlock(&(fs)->lock)
static inline void ll_set_fs_pwd(struct fs_struct *fs, struct vfsmount *mnt,
struct dentry *dentry)
{
struct path path;
struct path old_pwd;
path.mnt = mnt;
path.dentry = dentry;
LOCK_FS_STRUCT(fs);
old_pwd = fs->pwd;
path_get(&path);
fs->pwd = path;
UNLOCK_FS_STRUCT(fs);
if (old_pwd.dentry)
path_put(&old_pwd);
}
/* /*
* set ATTR_BLOCKS to a high value to avoid any risk of collision with other * set ATTR_BLOCKS to a high value to avoid any risk of collision with other
* ATTR_* attributes (see bug 13828) * ATTR_* attributes (see bug 13828)
...@@ -110,8 +88,6 @@ static inline void ll_set_fs_pwd(struct fs_struct *fs, struct vfsmount *mnt, ...@@ -110,8 +88,6 @@ static inline void ll_set_fs_pwd(struct fs_struct *fs, struct vfsmount *mnt,
#define cfs_bio_io_error(a, b) bio_io_error((a)) #define cfs_bio_io_error(a, b) bio_io_error((a))
#define cfs_bio_endio(a, b, c) bio_endio((a), (c)) #define cfs_bio_endio(a, b, c) bio_endio((a), (c))
#define cfs_fs_pwd(fs) ((fs)->pwd.dentry)
#define cfs_fs_mnt(fs) ((fs)->pwd.mnt)
#define cfs_path_put(nd) path_put(&(nd)->path) #define cfs_path_put(nd) path_put(&(nd)->path)
......
...@@ -661,7 +661,7 @@ int ll_dir_setdirstripe(struct inode *dir, struct lmv_user_md *lump, ...@@ -661,7 +661,7 @@ int ll_dir_setdirstripe(struct inode *dir, struct lmv_user_md *lump,
int mode; int mode;
int err; int err;
mode = (0755 & (S_IRWXUGO|S_ISVTX) & ~current->fs->umask) | S_IFDIR; mode = (0755 & ~current_umask()) | S_IFDIR;
op_data = ll_prep_md_op_data(NULL, dir, NULL, filename, op_data = ll_prep_md_op_data(NULL, dir, NULL, filename,
strlen(filename), mode, LUSTRE_OPC_MKDIR, strlen(filename), mode, LUSTRE_OPC_MKDIR,
lump); lump);
......
...@@ -2372,21 +2372,6 @@ char *ll_get_fsname(struct super_block *sb, char *buf, int buflen) ...@@ -2372,21 +2372,6 @@ char *ll_get_fsname(struct super_block *sb, char *buf, int buflen)
return buf; return buf;
} }
static char *ll_d_path(struct dentry *dentry, char *buf, int bufsize)
{
char *path = NULL;
struct path p;
p.dentry = dentry;
p.mnt = current->fs->root.mnt;
path_get(&p);
path = d_path(&p, buf, bufsize);
path_put(&p);
return path;
}
void ll_dirty_page_discard_warn(struct page *page, int ioret) void ll_dirty_page_discard_warn(struct page *page, int ioret)
{ {
char *buf, *path = NULL; char *buf, *path = NULL;
...@@ -2398,7 +2383,7 @@ void ll_dirty_page_discard_warn(struct page *page, int ioret) ...@@ -2398,7 +2383,7 @@ void ll_dirty_page_discard_warn(struct page *page, int ioret)
if (buf != NULL) { if (buf != NULL) {
dentry = d_find_alias(page->mapping->host); dentry = d_find_alias(page->mapping->host);
if (dentry != NULL) if (dentry != NULL)
path = ll_d_path(dentry, buf, PAGE_SIZE); path = dentry_path_raw(dentry, buf, PAGE_SIZE);
} }
CDEBUG(D_WARNING, CDEBUG(D_WARNING,
......
...@@ -254,6 +254,7 @@ static char *scanarg(char *s, char del) ...@@ -254,6 +254,7 @@ static char *scanarg(char *s, char del)
return NULL; return NULL;
} }
} }
s[-1] ='\0';
return s; return s;
} }
...@@ -378,8 +379,7 @@ static Node *create_entry(const char __user *buffer, size_t count) ...@@ -378,8 +379,7 @@ static Node *create_entry(const char __user *buffer, size_t count)
p = scanarg(p, del); p = scanarg(p, del);
if (!p) if (!p)
goto einval; goto einval;
p[-1] = '\0'; if (!e->magic[0])
if (p == e->magic)
goto einval; goto einval;
if (USE_DEBUG) if (USE_DEBUG)
print_hex_dump_bytes( print_hex_dump_bytes(
...@@ -391,8 +391,7 @@ static Node *create_entry(const char __user *buffer, size_t count) ...@@ -391,8 +391,7 @@ static Node *create_entry(const char __user *buffer, size_t count)
p = scanarg(p, del); p = scanarg(p, del);
if (!p) if (!p)
goto einval; goto einval;
p[-1] = '\0'; if (!e->mask[0]) {
if (p == e->mask) {
e->mask = NULL; e->mask = NULL;
pr_debug("register: mask[raw]: none\n"); pr_debug("register: mask[raw]: none\n");
} else if (USE_DEBUG) } else if (USE_DEBUG)
......
...@@ -1485,7 +1485,7 @@ static void update_dev_time(char *path_name) ...@@ -1485,7 +1485,7 @@ static void update_dev_time(char *path_name)
struct file *filp; struct file *filp;
filp = filp_open(path_name, O_RDWR, 0); filp = filp_open(path_name, O_RDWR, 0);
if (!filp) if (IS_ERR(filp))
return; return;
file_update_time(filp); file_update_time(filp);
filp_close(filp, NULL); filp_close(filp, NULL);
......
...@@ -267,7 +267,6 @@ move_extent_per_page(struct file *o_filp, struct inode *donor_inode, ...@@ -267,7 +267,6 @@ move_extent_per_page(struct file *o_filp, struct inode *donor_inode,
handle_t *handle; handle_t *handle;
ext4_lblk_t orig_blk_offset, donor_blk_offset; ext4_lblk_t orig_blk_offset, donor_blk_offset;
unsigned long blocksize = orig_inode->i_sb->s_blocksize; unsigned long blocksize = orig_inode->i_sb->s_blocksize;
unsigned int w_flags = 0;
unsigned int tmp_data_size, data_size, replaced_size; unsigned int tmp_data_size, data_size, replaced_size;
int err2, jblocks, retries = 0; int err2, jblocks, retries = 0;
int replaced_count = 0; int replaced_count = 0;
...@@ -288,9 +287,6 @@ move_extent_per_page(struct file *o_filp, struct inode *donor_inode, ...@@ -288,9 +287,6 @@ move_extent_per_page(struct file *o_filp, struct inode *donor_inode,
return 0; return 0;
} }
if (segment_eq(get_fs(), KERNEL_DS))
w_flags |= AOP_FLAG_UNINTERRUPTIBLE;
orig_blk_offset = orig_page_offset * blocks_per_page + orig_blk_offset = orig_page_offset * blocks_per_page +
data_offset_in_page; data_offset_in_page;
......
...@@ -448,27 +448,6 @@ static struct mempolicy *kernfs_vma_get_policy(struct vm_area_struct *vma, ...@@ -448,27 +448,6 @@ static struct mempolicy *kernfs_vma_get_policy(struct vm_area_struct *vma,
return pol; return pol;
} }
static int kernfs_vma_migrate(struct vm_area_struct *vma,
const nodemask_t *from, const nodemask_t *to,
unsigned long flags)
{
struct file *file = vma->vm_file;
struct kernfs_open_file *of = kernfs_of(file);
int ret;
if (!of->vm_ops)
return 0;
if (!kernfs_get_active(of->kn))
return 0;
ret = 0;
if (of->vm_ops->migrate)
ret = of->vm_ops->migrate(vma, from, to, flags);
kernfs_put_active(of->kn);
return ret;
}
#endif #endif
static const struct vm_operations_struct kernfs_vm_ops = { static const struct vm_operations_struct kernfs_vm_ops = {
...@@ -479,7 +458,6 @@ static const struct vm_operations_struct kernfs_vm_ops = { ...@@ -479,7 +458,6 @@ static const struct vm_operations_struct kernfs_vm_ops = {
#ifdef CONFIG_NUMA #ifdef CONFIG_NUMA
.set_policy = kernfs_vma_set_policy, .set_policy = kernfs_vma_set_policy,
.get_policy = kernfs_vma_get_policy, .get_policy = kernfs_vma_get_policy,
.migrate = kernfs_vma_migrate,
#endif #endif
}; };
......
...@@ -91,6 +91,7 @@ static void show_type(struct seq_file *m, struct super_block *sb) ...@@ -91,6 +91,7 @@ static void show_type(struct seq_file *m, struct super_block *sb)
static int show_vfsmnt(struct seq_file *m, struct vfsmount *mnt) static int show_vfsmnt(struct seq_file *m, struct vfsmount *mnt)
{ {
struct proc_mounts *p = proc_mounts(m);
struct mount *r = real_mount(mnt); struct mount *r = real_mount(mnt);
int err = 0; int err = 0;
struct path mnt_path = { .dentry = mnt->mnt_root, .mnt = mnt }; struct path mnt_path = { .dentry = mnt->mnt_root, .mnt = mnt };
...@@ -104,7 +105,10 @@ static int show_vfsmnt(struct seq_file *m, struct vfsmount *mnt) ...@@ -104,7 +105,10 @@ static int show_vfsmnt(struct seq_file *m, struct vfsmount *mnt)
mangle(m, r->mnt_devname ? r->mnt_devname : "none"); mangle(m, r->mnt_devname ? r->mnt_devname : "none");
} }
seq_putc(m, ' '); seq_putc(m, ' ');
seq_path(m, &mnt_path, " \t\n\\"); /* mountpoints outside of chroot jail will give SEQ_SKIP on this */
err = seq_path_root(m, &mnt_path, &p->root, " \t\n\\");
if (err)
goto out;
seq_putc(m, ' '); seq_putc(m, ' ');
show_type(m, sb); show_type(m, sb);
seq_puts(m, __mnt_is_readonly(mnt) ? " ro" : " rw"); seq_puts(m, __mnt_is_readonly(mnt) ? " ro" : " rw");
...@@ -125,7 +129,6 @@ static int show_mountinfo(struct seq_file *m, struct vfsmount *mnt) ...@@ -125,7 +129,6 @@ static int show_mountinfo(struct seq_file *m, struct vfsmount *mnt)
struct mount *r = real_mount(mnt); struct mount *r = real_mount(mnt);
struct super_block *sb = mnt->mnt_sb; struct super_block *sb = mnt->mnt_sb;
struct path mnt_path = { .dentry = mnt->mnt_root, .mnt = mnt }; struct path mnt_path = { .dentry = mnt->mnt_root, .mnt = mnt };
struct path root = p->root;
int err = 0; int err = 0;
seq_printf(m, "%i %i %u:%u ", r->mnt_id, r->mnt_parent->mnt_id, seq_printf(m, "%i %i %u:%u ", r->mnt_id, r->mnt_parent->mnt_id,
...@@ -139,7 +142,7 @@ static int show_mountinfo(struct seq_file *m, struct vfsmount *mnt) ...@@ -139,7 +142,7 @@ static int show_mountinfo(struct seq_file *m, struct vfsmount *mnt)
seq_putc(m, ' '); seq_putc(m, ' ');
/* mountpoints outside of chroot jail will give SEQ_SKIP on this */ /* mountpoints outside of chroot jail will give SEQ_SKIP on this */
err = seq_path_root(m, &mnt_path, &root, " \t\n\\"); err = seq_path_root(m, &mnt_path, &p->root, " \t\n\\");
if (err) if (err)
goto out; goto out;
...@@ -182,6 +185,7 @@ static int show_mountinfo(struct seq_file *m, struct vfsmount *mnt) ...@@ -182,6 +185,7 @@ static int show_mountinfo(struct seq_file *m, struct vfsmount *mnt)
static int show_vfsstat(struct seq_file *m, struct vfsmount *mnt) static int show_vfsstat(struct seq_file *m, struct vfsmount *mnt)
{ {
struct proc_mounts *p = proc_mounts(m);
struct mount *r = real_mount(mnt); struct mount *r = real_mount(mnt);
struct path mnt_path = { .dentry = mnt->mnt_root, .mnt = mnt }; struct path mnt_path = { .dentry = mnt->mnt_root, .mnt = mnt };
struct super_block *sb = mnt_path.dentry->d_sb; struct super_block *sb = mnt_path.dentry->d_sb;
...@@ -201,7 +205,10 @@ static int show_vfsstat(struct seq_file *m, struct vfsmount *mnt) ...@@ -201,7 +205,10 @@ static int show_vfsstat(struct seq_file *m, struct vfsmount *mnt)
/* mount point */ /* mount point */
seq_puts(m, " mounted on "); seq_puts(m, " mounted on ");
seq_path(m, &mnt_path, " \t\n\\"); /* mountpoints outside of chroot jail will give SEQ_SKIP on this */
err = seq_path_root(m, &mnt_path, &p->root, " \t\n\\");
if (err)
goto out;
seq_putc(m, ' '); seq_putc(m, ' ');
/* file system type */ /* file system type */
...@@ -216,6 +223,7 @@ static int show_vfsstat(struct seq_file *m, struct vfsmount *mnt) ...@@ -216,6 +223,7 @@ static int show_vfsstat(struct seq_file *m, struct vfsmount *mnt)
} }
seq_putc(m, '\n'); seq_putc(m, '\n');
out:
return err; return err;
} }
......
...@@ -36,9 +36,6 @@ extern int migrate_pages(struct list_head *l, new_page_t new, free_page_t free, ...@@ -36,9 +36,6 @@ extern int migrate_pages(struct list_head *l, new_page_t new, free_page_t free,
extern int migrate_prep(void); extern int migrate_prep(void);
extern int migrate_prep_local(void); extern int migrate_prep_local(void);
extern int migrate_vmas(struct mm_struct *mm,
const nodemask_t *from, const nodemask_t *to,
unsigned long flags);
extern void migrate_page_copy(struct page *newpage, struct page *page); extern void migrate_page_copy(struct page *newpage, struct page *page);
extern int migrate_huge_page_move_mapping(struct address_space *mapping, extern int migrate_huge_page_move_mapping(struct address_space *mapping,
struct page *newpage, struct page *page); struct page *newpage, struct page *page);
...@@ -57,13 +54,6 @@ static inline int migrate_pages(struct list_head *l, new_page_t new, ...@@ -57,13 +54,6 @@ static inline int migrate_pages(struct list_head *l, new_page_t new,
static inline int migrate_prep(void) { return -ENOSYS; } static inline int migrate_prep(void) { return -ENOSYS; }
static inline int migrate_prep_local(void) { return -ENOSYS; } static inline int migrate_prep_local(void) { return -ENOSYS; }
static inline int migrate_vmas(struct mm_struct *mm,
const nodemask_t *from, const nodemask_t *to,
unsigned long flags)
{
return -ENOSYS;
}
static inline void migrate_page_copy(struct page *newpage, static inline void migrate_page_copy(struct page *newpage,
struct page *page) {} struct page *page) {}
......
...@@ -286,8 +286,6 @@ struct vm_operations_struct { ...@@ -286,8 +286,6 @@ struct vm_operations_struct {
*/ */
struct mempolicy *(*get_policy)(struct vm_area_struct *vma, struct mempolicy *(*get_policy)(struct vm_area_struct *vma,
unsigned long addr); unsigned long addr);
int (*migrate)(struct vm_area_struct *vma, const nodemask_t *from,
const nodemask_t *to, unsigned long flags);
#endif #endif
/* called by sys_remap_file_pages() to populate non-linear mapping */ /* called by sys_remap_file_pages() to populate non-linear mapping */
int (*remap_pages)(struct vm_area_struct *vma, unsigned long addr, int (*remap_pages)(struct vm_area_struct *vma, unsigned long addr,
......
...@@ -101,6 +101,11 @@ static inline size_t iov_iter_count(struct iov_iter *i) ...@@ -101,6 +101,11 @@ static inline size_t iov_iter_count(struct iov_iter *i)
return i->count; return i->count;
} }
static inline bool iter_is_iovec(struct iov_iter *i)
{
return !(i->type & (ITER_BVEC | ITER_KVEC));
}
/* /*
* Cap the iov_iter by given limit; note that the second argument is * Cap the iov_iter by given limit; note that the second argument is
* *not* the new size - it's upper limit for such. Passing it a value * *not* the new size - it's upper limit for such. Passing it a value
......
...@@ -395,8 +395,6 @@ void __init mount_block_root(char *name, int flags) ...@@ -395,8 +395,6 @@ void __init mount_block_root(char *name, int flags)
case 0: case 0:
goto out; goto out;
case -EACCES: case -EACCES:
flags |= MS_RDONLY;
goto retry;
case -EINVAL: case -EINVAL:
continue; continue;
} }
...@@ -419,6 +417,10 @@ void __init mount_block_root(char *name, int flags) ...@@ -419,6 +417,10 @@ void __init mount_block_root(char *name, int flags)
#endif #endif
panic("VFS: Unable to mount root fs on %s", b); panic("VFS: Unable to mount root fs on %s", b);
} }
if (!(flags & MS_RDONLY)) {
flags |= MS_RDONLY;
goto retry;
}
printk("List of all partitions:\n"); printk("List of all partitions:\n");
printk_all_partitions(); printk_all_partitions();
......
...@@ -2464,7 +2464,7 @@ ssize_t generic_perform_write(struct file *file, ...@@ -2464,7 +2464,7 @@ ssize_t generic_perform_write(struct file *file,
/* /*
* Copies from kernel address space cannot fail (NFSD is a big user). * Copies from kernel address space cannot fail (NFSD is a big user).
*/ */
if (segment_eq(get_fs(), KERNEL_DS)) if (!iter_is_iovec(i))
flags |= AOP_FLAG_UNINTERRUPTIBLE; flags |= AOP_FLAG_UNINTERRUPTIBLE;
do { do {
......
...@@ -1041,10 +1041,6 @@ int do_migrate_pages(struct mm_struct *mm, const nodemask_t *from, ...@@ -1041,10 +1041,6 @@ int do_migrate_pages(struct mm_struct *mm, const nodemask_t *from,
down_read(&mm->mmap_sem); down_read(&mm->mmap_sem);
err = migrate_vmas(mm, from, to, flags);
if (err)
goto out;
/* /*
* Find a 'source' bit set in 'tmp' whose corresponding 'dest' * Find a 'source' bit set in 'tmp' whose corresponding 'dest'
* bit in 'to' is not also set in 'tmp'. Clear the found 'source' * bit in 'to' is not also set in 'tmp'. Clear the found 'source'
...@@ -1124,7 +1120,6 @@ int do_migrate_pages(struct mm_struct *mm, const nodemask_t *from, ...@@ -1124,7 +1120,6 @@ int do_migrate_pages(struct mm_struct *mm, const nodemask_t *from,
if (err < 0) if (err < 0)
break; break;
} }
out:
up_read(&mm->mmap_sem); up_read(&mm->mmap_sem);
if (err < 0) if (err < 0)
return err; return err;
......
...@@ -1536,27 +1536,6 @@ SYSCALL_DEFINE6(move_pages, pid_t, pid, unsigned long, nr_pages, ...@@ -1536,27 +1536,6 @@ SYSCALL_DEFINE6(move_pages, pid_t, pid, unsigned long, nr_pages,
return err; return err;
} }
/*
* Call migration functions in the vma_ops that may prepare
* memory in a vm for migration. migration functions may perform
* the migration for vmas that do not have an underlying page struct.
*/
int migrate_vmas(struct mm_struct *mm, const nodemask_t *to,
const nodemask_t *from, unsigned long flags)
{
struct vm_area_struct *vma;
int err = 0;
for (vma = mm->mmap; vma && !err; vma = vma->vm_next) {
if (vma->vm_ops && vma->vm_ops->migrate) {
err = vma->vm_ops->migrate(vma, to, from, flags);
if (err)
break;
}
}
return err;
}
#ifdef CONFIG_NUMA_BALANCING #ifdef CONFIG_NUMA_BALANCING
/* /*
* Returns true if this is a safe migration target node for misplaced NUMA * Returns true if this is a safe migration target node for misplaced NUMA
......
...@@ -1536,7 +1536,7 @@ static ssize_t shmem_file_read_iter(struct kiocb *iocb, struct iov_iter *to) ...@@ -1536,7 +1536,7 @@ static ssize_t shmem_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
* holes of a sparse file, we actually need to allocate those pages, * holes of a sparse file, we actually need to allocate those pages,
* and even mark them dirty, so it cannot exceed the max_blocks limit. * and even mark them dirty, so it cannot exceed the max_blocks limit.
*/ */
if (segment_eq(get_fs(), KERNEL_DS)) if (!iter_is_iovec(to))
sgp = SGP_DIRTY; sgp = SGP_DIRTY;
index = *ppos >> PAGE_CACHE_SHIFT; index = *ppos >> PAGE_CACHE_SHIFT;
......
...@@ -372,7 +372,6 @@ struct file *sock_alloc_file(struct socket *sock, int flags, const char *dname) ...@@ -372,7 +372,6 @@ struct file *sock_alloc_file(struct socket *sock, int flags, const char *dname)
path.mnt = mntget(sock_mnt); path.mnt = mntget(sock_mnt);
d_instantiate(path.dentry, SOCK_INODE(sock)); d_instantiate(path.dentry, SOCK_INODE(sock));
SOCK_INODE(sock)->i_fop = &socket_file_ops;
file = alloc_file(&path, FMODE_READ | FMODE_WRITE, file = alloc_file(&path, FMODE_READ | FMODE_WRITE,
&socket_file_ops); &socket_file_ops);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment