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 | 2 | ||||
-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, 39 insertions, 64 deletions
diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c index 6a1a6800776c..5b163572e0ca 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 94abc25392f6..632f8f3cc9db 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 813c6bb96c9a..f0d5718d2587 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 f2e928289600..dafdfa059bf6 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
@@ -1832,7 +1832,7 @@ static loff_t btrfs_file_llseek(struct file *file, loff_t offset, int origin) | |||
1832 | switch (origin) { | 1832 | switch (origin) { |
1833 | case SEEK_END: | 1833 | case SEEK_END: |
1834 | case SEEK_CUR: | 1834 | case SEEK_CUR: |
1835 | offset = generic_file_llseek_unlocked(file, offset, origin); | 1835 | offset = generic_file_llseek(file, offset, origin); |
1836 | goto out; | 1836 | goto out; |
1837 | case SEEK_DATA: | 1837 | case SEEK_DATA: |
1838 | case SEEK_HOLE: | 1838 | case SEEK_HOLE: |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index c5ccec23984c..2c984f7d4c2a 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -2318,7 +2318,7 @@ static void btrfs_read_locked_inode(struct inode *inode) | |||
2318 | inode_item = btrfs_item_ptr(leaf, path->slots[0], | 2318 | inode_item = btrfs_item_ptr(leaf, path->slots[0], |
2319 | struct btrfs_inode_item); | 2319 | struct btrfs_inode_item); |
2320 | inode->i_mode = btrfs_inode_mode(leaf, inode_item); | 2320 | inode->i_mode = btrfs_inode_mode(leaf, inode_item); |
2321 | inode->i_nlink = btrfs_inode_nlink(leaf, inode_item); | 2321 | set_nlink(inode, btrfs_inode_nlink(leaf, inode_item)); |
2322 | inode->i_uid = btrfs_inode_uid(leaf, inode_item); | 2322 | inode->i_uid = btrfs_inode_uid(leaf, inode_item); |
2323 | inode->i_gid = btrfs_inode_gid(leaf, inode_item); | 2323 | inode->i_gid = btrfs_inode_gid(leaf, inode_item); |
2324 | btrfs_i_size_write(inode, btrfs_inode_size(leaf, inode_item)); | 2324 | btrfs_i_size_write(inode, btrfs_inode_size(leaf, inode_item)); |
@@ -6593,7 +6593,7 @@ int btrfs_create_subvol_root(struct btrfs_trans_handle *trans, | |||
6593 | inode->i_op = &btrfs_dir_inode_operations; | 6593 | inode->i_op = &btrfs_dir_inode_operations; |
6594 | inode->i_fop = &btrfs_dir_file_operations; | 6594 | inode->i_fop = &btrfs_dir_file_operations; |
6595 | 6595 | ||
6596 | inode->i_nlink = 1; | 6596 | set_nlink(inode, 1); |
6597 | btrfs_i_size_write(inode, 0); | 6597 | btrfs_i_size_write(inode, 0); |
6598 | 6598 | ||
6599 | err = btrfs_update_inode(trans, new_root, inode); | 6599 | err = btrfs_update_inode(trans, new_root, inode); |
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 1a3ce9e0b495..e28ad4baf483 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c | |||
@@ -825,13 +825,9 @@ static char *setup_root_args(char *args) | |||
825 | static struct dentry *mount_subvol(const char *subvol_name, int flags, | 825 | static struct dentry *mount_subvol(const char *subvol_name, int flags, |
826 | const char *device_name, char *data) | 826 | const char *device_name, char *data) |
827 | { | 827 | { |
828 | struct super_block *s; | ||
829 | struct dentry *root; | 828 | struct dentry *root; |
830 | struct vfsmount *mnt; | 829 | struct vfsmount *mnt; |
831 | struct mnt_namespace *ns_private; | ||
832 | char *newargs; | 830 | char *newargs; |
833 | struct path path; | ||
834 | int error; | ||
835 | 831 | ||
836 | newargs = setup_root_args(data); | 832 | newargs = setup_root_args(data); |
837 | if (!newargs) | 833 | if (!newargs) |
@@ -842,39 +838,17 @@ static struct dentry *mount_subvol(const char *subvol_name, int flags, | |||
842 | if (IS_ERR(mnt)) | 838 | if (IS_ERR(mnt)) |
843 | return ERR_CAST(mnt); | 839 | return ERR_CAST(mnt); |
844 | 840 | ||
845 | ns_private = create_mnt_ns(mnt); | 841 | root = mount_subtree(mnt, subvol_name); |
846 | if (IS_ERR(ns_private)) { | ||
847 | mntput(mnt); | ||
848 | return ERR_CAST(ns_private); | ||
849 | } | ||
850 | 842 | ||
851 | /* | 843 | if (!IS_ERR(root) && !is_subvolume_inode(root->d_inode)) { |
852 | * This will trigger the automount of the subvol so we can just | 844 | struct super_block *s = root->d_sb; |
853 | * drop the mnt we have here and return the dentry that we | 845 | dput(root); |
854 | * found. | 846 | root = ERR_PTR(-EINVAL); |
855 | */ | 847 | deactivate_locked_super(s); |
856 | error = vfs_path_lookup(mnt->mnt_root, mnt, subvol_name, | ||
857 | LOOKUP_FOLLOW, &path); | ||
858 | put_mnt_ns(ns_private); | ||
859 | if (error) | ||
860 | return ERR_PTR(error); | ||
861 | |||
862 | if (!is_subvolume_inode(path.dentry->d_inode)) { | ||
863 | path_put(&path); | ||
864 | mntput(mnt); | ||
865 | error = -EINVAL; | ||
866 | printk(KERN_ERR "btrfs: '%s' is not a valid subvolume\n", | 848 | printk(KERN_ERR "btrfs: '%s' is not a valid subvolume\n", |
867 | subvol_name); | 849 | subvol_name); |
868 | return ERR_PTR(-EINVAL); | ||
869 | } | 850 | } |
870 | 851 | ||
871 | /* Get a ref to the sb and the dentry we found and return it */ | ||
872 | s = path.mnt->mnt_sb; | ||
873 | atomic_inc(&s->s_active); | ||
874 | root = dget(path.dentry); | ||
875 | path_put(&path); | ||
876 | down_write(&s->s_umount); | ||
877 | |||
878 | return root; | 852 | return root; |
879 | } | 853 | } |
880 | 854 | ||
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 | } | ||