Merge tag 'idmapped-mounts-v5.12' of git://git.kernel.org/pub/scm/linux/kernel/git...
[platform/kernel/linux-rpi.git] / fs / btrfs / ioctl.c
index 56f53d6..072e777 100644 (file)
@@ -528,6 +528,14 @@ static noinline int btrfs_ioctl_fitrim(struct btrfs_fs_info *fs_info,
                return -EPERM;
 
        /*
+        * btrfs_trim_block_group() depends on space cache, which is not
+        * available in zoned filesystem. So, disallow fitrim on a zoned
+        * filesystem for now.
+        */
+       if (btrfs_is_zoned(fs_info))
+               return -EOPNOTSUPP;
+
+       /*
         * If the fs is mounted with nologreplay, which requires it to be
         * mounted in RO mode as well, we can not allow discard on free space
         * inside block groups, because log trees refer to extents that are not
@@ -606,14 +614,13 @@ static noinline int create_subvol(struct inode *dir,
        int err;
        dev_t anon_dev = 0;
        u64 objectid;
-       u64 new_dirid = BTRFS_FIRST_FREE_OBJECTID;
        u64 index = 0;
 
        root_item = kzalloc(sizeof(*root_item), GFP_KERNEL);
        if (!root_item)
                return -ENOMEM;
 
-       ret = btrfs_find_free_objectid(fs_info->tree_root, &objectid);
+       ret = btrfs_get_free_objectid(fs_info->tree_root, &objectid);
        if (ret)
                goto fail_free;
 
@@ -693,7 +700,7 @@ static noinline int create_subvol(struct inode *dir,
        free_extent_buffer(leaf);
        leaf = NULL;
 
-       btrfs_set_root_dirid(root_item, new_dirid);
+       btrfs_set_root_dirid(root_item, BTRFS_FIRST_FREE_OBJECTID);
 
        key.objectid = objectid;
        key.offset = 0;
@@ -716,7 +723,7 @@ static noinline int create_subvol(struct inode *dir,
 
        btrfs_record_root_in_trans(trans, new_root);
 
-       ret = btrfs_create_subvol_root(trans, new_root, root, new_dirid);
+       ret = btrfs_create_subvol_root(trans, new_root, root);
        btrfs_put_root(new_root);
        if (ret) {
                /* We potentially lose an unused inode item here */
@@ -724,10 +731,6 @@ static noinline int create_subvol(struct inode *dir,
                goto fail;
        }
 
-       mutex_lock(&new_root->objectid_mutex);
-       new_root->highest_objectid = new_dirid;
-       mutex_unlock(&new_root->objectid_mutex);
-
        /*
         * insert the directory item
         */
@@ -1320,6 +1323,13 @@ again:
                if (!page)
                        break;
 
+               ret = set_page_extent_mapped(page);
+               if (ret < 0) {
+                       unlock_page(page);
+                       put_page(page);
+                       break;
+               }
+
                page_start = page_offset(page);
                page_end = page_start + PAGE_SIZE - 1;
                while (1) {
@@ -1441,7 +1451,6 @@ again:
        for (i = 0; i < i_done; i++) {
                clear_page_dirty_for_io(pages[i]);
                ClearPageChecked(pages[i]);
-               set_page_extent_mapped(pages[i]);
                set_page_dirty(pages[i]);
                unlock_page(pages[i]);
                put_page(pages[i]);
@@ -4954,7 +4963,7 @@ long btrfs_ioctl(struct file *file, unsigned int
        case BTRFS_IOC_SYNC: {
                int ret;
 
-               ret = btrfs_start_delalloc_roots(fs_info, U64_MAX, false);
+               ret = btrfs_start_delalloc_roots(fs_info, LONG_MAX, false);
                if (ret)
                        return ret;
                ret = btrfs_sync_fs(inode->i_sb, 1);