diff options
Diffstat (limited to 'fs/btrfs')
-rw-r--r-- | fs/btrfs/delayed-inode.c | 2 | ||||
-rw-r--r-- | fs/btrfs/disk-io.c | 2 | ||||
-rw-r--r-- | fs/btrfs/extent-tree.c | 3 | ||||
-rw-r--r-- | fs/btrfs/file.c | 4 | ||||
-rw-r--r-- | fs/btrfs/inode.c | 4 | ||||
-rw-r--r-- | fs/btrfs/super.c | 38 | ||||
-rw-r--r-- | fs/btrfs/tree-log.c | 2 | ||||
-rw-r--r-- | fs/btrfs/xattr.c | 50 |
8 files changed, 41 insertions, 64 deletions
diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c index c7ddf8a01c54..9c1eccc2c503 100644 --- a/fs/btrfs/delayed-inode.c +++ b/fs/btrfs/delayed-inode.c | |||
@@ -1719,7 +1719,7 @@ int btrfs_fill_inode(struct inode *inode, u32 *rdev) | |||
1719 | inode->i_gid = btrfs_stack_inode_gid(inode_item); | 1719 | inode->i_gid = btrfs_stack_inode_gid(inode_item); |
1720 | btrfs_i_size_write(inode, btrfs_stack_inode_size(inode_item)); | 1720 | btrfs_i_size_write(inode, btrfs_stack_inode_size(inode_item)); |
1721 | inode->i_mode = btrfs_stack_inode_mode(inode_item); | 1721 | inode->i_mode = btrfs_stack_inode_mode(inode_item); |
1722 | inode->i_nlink = btrfs_stack_inode_nlink(inode_item); | 1722 | set_nlink(inode, btrfs_stack_inode_nlink(inode_item)); |
1723 | inode_set_bytes(inode, btrfs_stack_inode_nbytes(inode_item)); | 1723 | inode_set_bytes(inode, btrfs_stack_inode_nbytes(inode_item)); |
1724 | BTRFS_I(inode)->generation = btrfs_stack_inode_generation(inode_item); | 1724 | BTRFS_I(inode)->generation = btrfs_stack_inode_generation(inode_item); |
1725 | BTRFS_I(inode)->sequence = btrfs_stack_inode_sequence(inode_item); | 1725 | BTRFS_I(inode)->sequence = btrfs_stack_inode_sequence(inode_item); |
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 3f9d5551e582..f44b3928dc2d 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
@@ -2007,7 +2007,7 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
2007 | sb->s_bdi = &fs_info->bdi; | 2007 | sb->s_bdi = &fs_info->bdi; |
2008 | 2008 | ||
2009 | fs_info->btree_inode->i_ino = BTRFS_BTREE_INODE_OBJECTID; | 2009 | fs_info->btree_inode->i_ino = BTRFS_BTREE_INODE_OBJECTID; |
2010 | fs_info->btree_inode->i_nlink = 1; | 2010 | set_nlink(fs_info->btree_inode, 1); |
2011 | /* | 2011 | /* |
2012 | * we set the i_size on the btree inode to the max possible int. | 2012 | * we set the i_size on the btree inode to the max possible int. |
2013 | * the real end of the address space is determined by all of | 2013 | * the real end of the address space is determined by all of |
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 8603ee4e3dfd..f5fbe576d2ba 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -3416,7 +3416,8 @@ static int shrink_delalloc(struct btrfs_root *root, u64 to_reclaim, | |||
3416 | smp_mb(); | 3416 | smp_mb(); |
3417 | nr_pages = min_t(unsigned long, nr_pages, | 3417 | nr_pages = min_t(unsigned long, nr_pages, |
3418 | root->fs_info->delalloc_bytes >> PAGE_CACHE_SHIFT); | 3418 | root->fs_info->delalloc_bytes >> PAGE_CACHE_SHIFT); |
3419 | writeback_inodes_sb_nr_if_idle(root->fs_info->sb, nr_pages); | 3419 | writeback_inodes_sb_nr_if_idle(root->fs_info->sb, nr_pages, |
3420 | WB_REASON_FS_FREE_SPACE); | ||
3420 | 3421 | ||
3421 | spin_lock(&space_info->lock); | 3422 | spin_lock(&space_info->lock); |
3422 | if (reserved > space_info->bytes_may_use) | 3423 | if (reserved > space_info->bytes_may_use) |
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index cc7492c823f3..97fbe939c050 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
@@ -1167,6 +1167,8 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file, | |||
1167 | nrptrs = min((iov_iter_count(i) + PAGE_CACHE_SIZE - 1) / | 1167 | nrptrs = min((iov_iter_count(i) + PAGE_CACHE_SIZE - 1) / |
1168 | PAGE_CACHE_SIZE, PAGE_CACHE_SIZE / | 1168 | PAGE_CACHE_SIZE, PAGE_CACHE_SIZE / |
1169 | (sizeof(struct page *))); | 1169 | (sizeof(struct page *))); |
1170 | nrptrs = min(nrptrs, current->nr_dirtied_pause - current->nr_dirtied); | ||
1171 | nrptrs = max(nrptrs, 8); | ||
1170 | pages = kmalloc(nrptrs * sizeof(struct page *), GFP_KERNEL); | 1172 | pages = kmalloc(nrptrs * sizeof(struct page *), GFP_KERNEL); |
1171 | if (!pages) | 1173 | if (!pages) |
1172 | return -ENOMEM; | 1174 | return -ENOMEM; |
@@ -1836,7 +1838,7 @@ static loff_t btrfs_file_llseek(struct file *file, loff_t offset, int origin) | |||
1836 | switch (origin) { | 1838 | switch (origin) { |
1837 | case SEEK_END: | 1839 | case SEEK_END: |
1838 | case SEEK_CUR: | 1840 | case SEEK_CUR: |
1839 | offset = generic_file_llseek_unlocked(file, offset, origin); | 1841 | offset = generic_file_llseek(file, offset, origin); |
1840 | goto out; | 1842 | goto out; |
1841 | case SEEK_DATA: | 1843 | case SEEK_DATA: |
1842 | case SEEK_HOLE: | 1844 | case SEEK_HOLE: |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 13b0542015ff..fd1a06df5bc6 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -2358,7 +2358,7 @@ static void btrfs_read_locked_inode(struct inode *inode) | |||
2358 | inode_item = btrfs_item_ptr(leaf, path->slots[0], | 2358 | inode_item = btrfs_item_ptr(leaf, path->slots[0], |
2359 | struct btrfs_inode_item); | 2359 | struct btrfs_inode_item); |
2360 | inode->i_mode = btrfs_inode_mode(leaf, inode_item); | 2360 | inode->i_mode = btrfs_inode_mode(leaf, inode_item); |
2361 | inode->i_nlink = btrfs_inode_nlink(leaf, inode_item); | 2361 | set_nlink(inode, btrfs_inode_nlink(leaf, inode_item)); |
2362 | inode->i_uid = btrfs_inode_uid(leaf, inode_item); | 2362 | inode->i_uid = btrfs_inode_uid(leaf, inode_item); |
2363 | inode->i_gid = btrfs_inode_gid(leaf, inode_item); | 2363 | inode->i_gid = btrfs_inode_gid(leaf, inode_item); |
2364 | btrfs_i_size_write(inode, btrfs_inode_size(leaf, inode_item)); | 2364 | btrfs_i_size_write(inode, btrfs_inode_size(leaf, inode_item)); |
@@ -6698,7 +6698,7 @@ int btrfs_create_subvol_root(struct btrfs_trans_handle *trans, | |||
6698 | inode->i_op = &btrfs_dir_inode_operations; | 6698 | inode->i_op = &btrfs_dir_inode_operations; |
6699 | inode->i_fop = &btrfs_dir_file_operations; | 6699 | inode->i_fop = &btrfs_dir_file_operations; |
6700 | 6700 | ||
6701 | inode->i_nlink = 1; | 6701 | set_nlink(inode, 1); |
6702 | btrfs_i_size_write(inode, 0); | 6702 | btrfs_i_size_write(inode, 0); |
6703 | 6703 | ||
6704 | err = btrfs_update_inode(trans, new_root, inode); | 6704 | err = btrfs_update_inode(trans, new_root, inode); |
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 34a8b6112ea4..200f63bc6675 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c | |||
@@ -826,13 +826,9 @@ static char *setup_root_args(char *args) | |||
826 | static struct dentry *mount_subvol(const char *subvol_name, int flags, | 826 | static struct dentry *mount_subvol(const char *subvol_name, int flags, |
827 | const char *device_name, char *data) | 827 | const char *device_name, char *data) |
828 | { | 828 | { |
829 | struct super_block *s; | ||
830 | struct dentry *root; | 829 | struct dentry *root; |
831 | struct vfsmount *mnt; | 830 | struct vfsmount *mnt; |
832 | struct mnt_namespace *ns_private; | ||
833 | char *newargs; | 831 | char *newargs; |
834 | struct path path; | ||
835 | int error; | ||
836 | 832 | ||
837 | newargs = setup_root_args(data); | 833 | newargs = setup_root_args(data); |
838 | if (!newargs) | 834 | if (!newargs) |
@@ -843,39 +839,17 @@ static struct dentry *mount_subvol(const char *subvol_name, int flags, | |||
843 | if (IS_ERR(mnt)) | 839 | if (IS_ERR(mnt)) |
844 | return ERR_CAST(mnt); | 840 | return ERR_CAST(mnt); |
845 | 841 | ||
846 | ns_private = create_mnt_ns(mnt); | 842 | root = mount_subtree(mnt, subvol_name); |
847 | if (IS_ERR(ns_private)) { | ||
848 | mntput(mnt); | ||
849 | return ERR_CAST(ns_private); | ||
850 | } | ||
851 | 843 | ||
852 | /* | 844 | if (!IS_ERR(root) && !is_subvolume_inode(root->d_inode)) { |
853 | * This will trigger the automount of the subvol so we can just | 845 | struct super_block *s = root->d_sb; |
854 | * drop the mnt we have here and return the dentry that we | 846 | dput(root); |
855 | * found. | 847 | root = ERR_PTR(-EINVAL); |
856 | */ | 848 | deactivate_locked_super(s); |
857 | error = vfs_path_lookup(mnt->mnt_root, mnt, subvol_name, | ||
858 | LOOKUP_FOLLOW, &path); | ||
859 | put_mnt_ns(ns_private); | ||
860 | if (error) | ||
861 | return ERR_PTR(error); | ||
862 | |||
863 | if (!is_subvolume_inode(path.dentry->d_inode)) { | ||
864 | path_put(&path); | ||
865 | mntput(mnt); | ||
866 | error = -EINVAL; | ||
867 | printk(KERN_ERR "btrfs: '%s' is not a valid subvolume\n", | 849 | printk(KERN_ERR "btrfs: '%s' is not a valid subvolume\n", |
868 | subvol_name); | 850 | subvol_name); |
869 | return ERR_PTR(-EINVAL); | ||
870 | } | 851 | } |
871 | 852 | ||
872 | /* Get a ref to the sb and the dentry we found and return it */ | ||
873 | s = path.mnt->mnt_sb; | ||
874 | atomic_inc(&s->s_active); | ||
875 | root = dget(path.dentry); | ||
876 | path_put(&path); | ||
877 | down_write(&s->s_umount); | ||
878 | |||
879 | return root; | 853 | return root; |
880 | } | 854 | } |
881 | 855 | ||
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index f4d81c06d48f..3568374d419d 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c | |||
@@ -1031,7 +1031,7 @@ static noinline int fixup_inode_link_count(struct btrfs_trans_handle *trans, | |||
1031 | } | 1031 | } |
1032 | btrfs_release_path(path); | 1032 | btrfs_release_path(path); |
1033 | if (nlink != inode->i_nlink) { | 1033 | if (nlink != inode->i_nlink) { |
1034 | inode->i_nlink = nlink; | 1034 | set_nlink(inode, nlink); |
1035 | btrfs_update_inode(trans, root, inode); | 1035 | btrfs_update_inode(trans, root, inode); |
1036 | } | 1036 | } |
1037 | BTRFS_I(inode)->index_cnt = (u64)-1; | 1037 | BTRFS_I(inode)->index_cnt = (u64)-1; |
diff --git a/fs/btrfs/xattr.c b/fs/btrfs/xattr.c index a76e41c04b71..3848b04e310e 100644 --- a/fs/btrfs/xattr.c +++ b/fs/btrfs/xattr.c | |||
@@ -394,36 +394,36 @@ int btrfs_removexattr(struct dentry *dentry, const char *name) | |||
394 | XATTR_REPLACE); | 394 | XATTR_REPLACE); |
395 | } | 395 | } |
396 | 396 | ||
397 | int btrfs_xattr_security_init(struct btrfs_trans_handle *trans, | 397 | int btrfs_initxattrs(struct inode *inode, const struct xattr *xattr_array, |
398 | struct inode *inode, struct inode *dir, | 398 | void *fs_info) |
399 | const struct qstr *qstr) | ||
400 | { | 399 | { |
401 | int err; | 400 | const struct xattr *xattr; |
402 | size_t len; | 401 | struct btrfs_trans_handle *trans = fs_info; |
403 | void *value; | ||
404 | char *suffix; | ||
405 | char *name; | 402 | char *name; |
403 | int err = 0; | ||
406 | 404 | ||
407 | err = security_inode_init_security(inode, dir, qstr, &suffix, &value, | 405 | for (xattr = xattr_array; xattr->name != NULL; xattr++) { |
408 | &len); | 406 | name = kmalloc(XATTR_SECURITY_PREFIX_LEN + |
409 | if (err) { | 407 | strlen(xattr->name) + 1, GFP_NOFS); |
410 | if (err == -EOPNOTSUPP) | 408 | if (!name) { |
411 | return 0; | 409 | err = -ENOMEM; |
412 | return err; | 410 | break; |
413 | } | 411 | } |
414 | |||
415 | name = kmalloc(XATTR_SECURITY_PREFIX_LEN + strlen(suffix) + 1, | ||
416 | GFP_NOFS); | ||
417 | if (!name) { | ||
418 | err = -ENOMEM; | ||
419 | } else { | ||
420 | strcpy(name, XATTR_SECURITY_PREFIX); | 412 | strcpy(name, XATTR_SECURITY_PREFIX); |
421 | strcpy(name + XATTR_SECURITY_PREFIX_LEN, suffix); | 413 | strcpy(name + XATTR_SECURITY_PREFIX_LEN, xattr->name); |
422 | err = __btrfs_setxattr(trans, inode, name, value, len, 0); | 414 | err = __btrfs_setxattr(trans, inode, name, |
415 | xattr->value, xattr->value_len, 0); | ||
423 | kfree(name); | 416 | kfree(name); |
417 | if (err < 0) | ||
418 | break; | ||
424 | } | 419 | } |
425 | |||
426 | kfree(suffix); | ||
427 | kfree(value); | ||
428 | return err; | 420 | return err; |
429 | } | 421 | } |
422 | |||
423 | int btrfs_xattr_security_init(struct btrfs_trans_handle *trans, | ||
424 | struct inode *inode, struct inode *dir, | ||
425 | const struct qstr *qstr) | ||
426 | { | ||
427 | return security_inode_init_security(inode, dir, qstr, | ||
428 | &btrfs_initxattrs, trans); | ||
429 | } | ||