forked from Minki/linux
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 e6084d4
)
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...
This commit is contained in:
commit
ecb5ec044a
@ -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,
|
|||||||
#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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
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 @@ again:
|
|||||||
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,
|
|||||||
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 = {
|
|||||||
#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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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 @@ out:
|
|||||||
|
|
||||||
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)
|
|||||||
|
|
||||||
/* 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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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,
|
|||||||
|
|
||||||
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,
|
|||||||
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 {
|
|||||||
*/
|
*/
|
||||||
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)
|
|||||||
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 @@ retry:
|
|||||||
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 @@ retry:
|
|||||||
#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,
|
|||||||
/*
|
/*
|
||||||
* 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,
|
|||||||
|
|
||||||
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,
|
|||||||
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;
|
||||||
|
21
mm/migrate.c
21
mm/migrate.c
@ -1536,27 +1536,6 @@ out:
|
|||||||
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)
|
|||||||
* 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)
|
|||||||
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);
|
||||||
|
Loading…
Reference in New Issue
Block a user