aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs')
-rw-r--r--fs/btrfs/delayed-inode.c2
-rw-r--r--fs/btrfs/disk-io.c2
-rw-r--r--fs/btrfs/extent-tree.c3
-rw-r--r--fs/btrfs/file.c4
-rw-r--r--fs/btrfs/inode.c4
-rw-r--r--fs/btrfs/super.c38
-rw-r--r--fs/btrfs/tree-log.c2
-rw-r--r--fs/btrfs/xattr.c50
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)
826static struct dentry *mount_subvol(const char *subvol_name, int flags, 826static 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
397int btrfs_xattr_security_init(struct btrfs_trans_handle *trans, 397int 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
423int 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}