LCOV - code coverage report
Current view: top level - fs/btrfs - inode-map.c (source / functions) Hit Total Coverage
Test: btrfstest.info Lines: 59 222 26.6 %
Date: 2014-11-28 Functions: 7 13 53.8 %

          Line data    Source code
       1             : /*
       2             :  * Copyright (C) 2007 Oracle.  All rights reserved.
       3             :  *
       4             :  * This program is free software; you can redistribute it and/or
       5             :  * modify it under the terms of the GNU General Public
       6             :  * License v2 as published by the Free Software Foundation.
       7             :  *
       8             :  * This program is distributed in the hope that it will be useful,
       9             :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      10             :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      11             :  * General Public License for more details.
      12             :  *
      13             :  * You should have received a copy of the GNU General Public
      14             :  * License along with this program; if not, write to the
      15             :  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
      16             :  * Boston, MA 021110-1307, USA.
      17             :  */
      18             : 
      19             : #include <linux/delay.h>
      20             : #include <linux/kthread.h>
      21             : #include <linux/pagemap.h>
      22             : 
      23             : #include "ctree.h"
      24             : #include "disk-io.h"
      25             : #include "free-space-cache.h"
      26             : #include "inode-map.h"
      27             : #include "transaction.h"
      28             : 
      29           0 : static int caching_kthread(void *data)
      30             : {
      31             :         struct btrfs_root *root = data;
      32           0 :         struct btrfs_fs_info *fs_info = root->fs_info;
      33           0 :         struct btrfs_free_space_ctl *ctl = root->free_ino_ctl;
      34             :         struct btrfs_key key;
      35             :         struct btrfs_path *path;
      36           0 :         struct extent_buffer *leaf;
      37             :         u64 last = (u64)-1;
      38             :         int slot;
      39             :         int ret;
      40             : 
      41           0 :         if (!btrfs_test_opt(root, INODE_MAP_CACHE))
      42             :                 return 0;
      43             : 
      44           0 :         path = btrfs_alloc_path();
      45           0 :         if (!path)
      46             :                 return -ENOMEM;
      47             : 
      48             :         /* Since the commit root is read-only, we can safely skip locking. */
      49           0 :         path->skip_locking = 1;
      50           0 :         path->search_commit_root = 1;
      51           0 :         path->reada = 2;
      52             : 
      53           0 :         key.objectid = BTRFS_FIRST_FREE_OBJECTID;
      54           0 :         key.offset = 0;
      55           0 :         key.type = BTRFS_INODE_ITEM_KEY;
      56             : again:
      57             :         /* need to make sure the commit_root doesn't disappear */
      58           0 :         down_read(&fs_info->commit_root_sem);
      59             : 
      60           0 :         ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
      61           0 :         if (ret < 0)
      62             :                 goto out;
      63             : 
      64             :         while (1) {
      65           0 :                 if (btrfs_fs_closing(fs_info))
      66             :                         goto out;
      67             : 
      68           0 :                 leaf = path->nodes[0];
      69           0 :                 slot = path->slots[0];
      70           0 :                 if (slot >= btrfs_header_nritems(leaf)) {
      71           0 :                         ret = btrfs_next_leaf(root, path);
      72           0 :                         if (ret < 0)
      73             :                                 goto out;
      74           0 :                         else if (ret > 0)
      75             :                                 break;
      76             : 
      77           0 :                         if (need_resched() ||
      78           0 :                             btrfs_transaction_in_commit(fs_info)) {
      79           0 :                                 leaf = path->nodes[0];
      80             : 
      81           0 :                                 if (WARN_ON(btrfs_header_nritems(leaf) == 0))
      82             :                                         break;
      83             : 
      84             :                                 /*
      85             :                                  * Save the key so we can advances forward
      86             :                                  * in the next search.
      87             :                                  */
      88           0 :                                 btrfs_item_key_to_cpu(leaf, &key, 0);
      89           0 :                                 btrfs_release_path(path);
      90           0 :                                 root->cache_progress = last;
      91           0 :                                 up_read(&fs_info->commit_root_sem);
      92           0 :                                 schedule_timeout(1);
      93           0 :                                 goto again;
      94             :                         } else
      95           0 :                                 continue;
      96             :                 }
      97             : 
      98           0 :                 btrfs_item_key_to_cpu(leaf, &key, slot);
      99             : 
     100           0 :                 if (key.type != BTRFS_INODE_ITEM_KEY)
     101             :                         goto next;
     102             : 
     103           0 :                 if (key.objectid >= root->highest_objectid)
     104             :                         break;
     105             : 
     106           0 :                 if (last != (u64)-1 && last + 1 != key.objectid) {
     107           0 :                         __btrfs_add_free_space(ctl, last + 1,
     108           0 :                                                key.objectid - last - 1);
     109           0 :                         wake_up(&root->cache_wait);
     110             :                 }
     111             : 
     112           0 :                 last = key.objectid;
     113             : next:
     114           0 :                 path->slots[0]++;
     115             :         }
     116             : 
     117           0 :         if (last < root->highest_objectid - 1) {
     118           0 :                 __btrfs_add_free_space(ctl, last + 1,
     119           0 :                                        root->highest_objectid - last - 1);
     120             :         }
     121             : 
     122             :         spin_lock(&root->cache_lock);
     123           0 :         root->cached = BTRFS_CACHE_FINISHED;
     124             :         spin_unlock(&root->cache_lock);
     125             : 
     126           0 :         root->cache_progress = (u64)-1;
     127           0 :         btrfs_unpin_free_ino(root);
     128             : out:
     129           0 :         wake_up(&root->cache_wait);
     130           0 :         up_read(&fs_info->commit_root_sem);
     131             : 
     132           0 :         btrfs_free_path(path);
     133             : 
     134           0 :         return ret;
     135             : }
     136             : 
     137           0 : static void start_caching(struct btrfs_root *root)
     138             : {
     139           0 :         struct btrfs_free_space_ctl *ctl = root->free_ino_ctl;
     140             :         struct task_struct *tsk;
     141             :         int ret;
     142             :         u64 objectid;
     143             : 
     144           0 :         if (!btrfs_test_opt(root, INODE_MAP_CACHE))
     145           0 :                 return;
     146             : 
     147             :         spin_lock(&root->cache_lock);
     148           0 :         if (root->cached != BTRFS_CACHE_NO) {
     149             :                 spin_unlock(&root->cache_lock);
     150             :                 return;
     151             :         }
     152             : 
     153           0 :         root->cached = BTRFS_CACHE_STARTED;
     154             :         spin_unlock(&root->cache_lock);
     155             : 
     156           0 :         ret = load_free_ino_cache(root->fs_info, root);
     157           0 :         if (ret == 1) {
     158             :                 spin_lock(&root->cache_lock);
     159           0 :                 root->cached = BTRFS_CACHE_FINISHED;
     160             :                 spin_unlock(&root->cache_lock);
     161             :                 return;
     162             :         }
     163             : 
     164             :         /*
     165             :          * It can be quite time-consuming to fill the cache by searching
     166             :          * through the extent tree, and this can keep ino allocation path
     167             :          * waiting. Therefore at start we quickly find out the highest
     168             :          * inode number and we know we can use inode numbers which fall in
     169             :          * [highest_ino + 1, BTRFS_LAST_FREE_OBJECTID].
     170             :          */
     171           0 :         ret = btrfs_find_free_objectid(root, &objectid);
     172           0 :         if (!ret && objectid <= BTRFS_LAST_FREE_OBJECTID) {
     173           0 :                 __btrfs_add_free_space(ctl, objectid,
     174             :                                        BTRFS_LAST_FREE_OBJECTID - objectid + 1);
     175             :         }
     176             : 
     177           0 :         tsk = kthread_run(caching_kthread, root, "btrfs-ino-cache-%llu",
     178             :                           root->root_key.objectid);
     179           0 :         if (IS_ERR(tsk)) {
     180           0 :                 btrfs_warn(root->fs_info, "failed to start inode caching task");
     181           0 :                 btrfs_clear_and_info(root, CHANGE_INODE_CACHE,
     182             :                                 "disabling inode map caching");
     183             :         }
     184             : }
     185             : 
     186       20423 : int btrfs_find_free_ino(struct btrfs_root *root, u64 *objectid)
     187             : {
     188       20423 :         if (!btrfs_test_opt(root, INODE_MAP_CACHE))
     189       20423 :                 return btrfs_find_free_objectid(root, objectid);
     190             : 
     191             : again:
     192           0 :         *objectid = btrfs_find_ino_for_alloc(root);
     193             : 
     194           0 :         if (*objectid != 0)
     195             :                 return 0;
     196             : 
     197           0 :         start_caching(root);
     198             : 
     199           0 :         wait_event(root->cache_wait,
     200             :                    root->cached == BTRFS_CACHE_FINISHED ||
     201             :                    root->free_ino_ctl->free_space > 0);
     202             : 
     203           0 :         if (root->cached == BTRFS_CACHE_FINISHED &&
     204           0 :             root->free_ino_ctl->free_space == 0)
     205             :                 return -ENOSPC;
     206             :         else
     207             :                 goto again;
     208             : }
     209             : 
     210        6866 : void btrfs_return_ino(struct btrfs_root *root, u64 objectid)
     211             : {
     212        6866 :         struct btrfs_free_space_ctl *pinned = root->free_ino_pinned;
     213             : 
     214        6866 :         if (!btrfs_test_opt(root, INODE_MAP_CACHE))
     215        6866 :                 return;
     216             : again:
     217           0 :         if (root->cached == BTRFS_CACHE_FINISHED) {
     218           0 :                 __btrfs_add_free_space(pinned, objectid, 1);
     219             :         } else {
     220           0 :                 down_write(&root->fs_info->commit_root_sem);
     221             :                 spin_lock(&root->cache_lock);
     222           0 :                 if (root->cached == BTRFS_CACHE_FINISHED) {
     223             :                         spin_unlock(&root->cache_lock);
     224           0 :                         up_write(&root->fs_info->commit_root_sem);
     225           0 :                         goto again;
     226             :                 }
     227             :                 spin_unlock(&root->cache_lock);
     228             : 
     229           0 :                 start_caching(root);
     230             : 
     231           0 :                 __btrfs_add_free_space(pinned, objectid, 1);
     232             : 
     233           0 :                 up_write(&root->fs_info->commit_root_sem);
     234             :         }
     235             : }
     236             : 
     237             : /*
     238             :  * When a transaction is committed, we'll move those inode numbers which
     239             :  * are smaller than root->cache_progress from pinned tree to free_ino tree,
     240             :  * and others will just be dropped, because the commit root we were
     241             :  * searching has changed.
     242             :  *
     243             :  * Must be called with root->fs_info->commit_root_sem held
     244             :  */
     245        1888 : void btrfs_unpin_free_ino(struct btrfs_root *root)
     246             : {
     247        1888 :         struct btrfs_free_space_ctl *ctl = root->free_ino_ctl;
     248        1888 :         struct rb_root *rbroot = &root->free_ino_pinned->free_space_offset;
     249             :         struct btrfs_free_space *info;
     250             :         struct rb_node *n;
     251             :         u64 count;
     252             : 
     253        1888 :         if (!btrfs_test_opt(root, INODE_MAP_CACHE))
     254        1888 :                 return;
     255             : 
     256             :         while (1) {
     257           0 :                 n = rb_first(rbroot);
     258           0 :                 if (!n)
     259             :                         break;
     260             : 
     261             :                 info = rb_entry(n, struct btrfs_free_space, offset_index);
     262           0 :                 BUG_ON(info->bitmap); /* Logic error */
     263             : 
     264           0 :                 if (info->offset > root->cache_progress)
     265             :                         goto free;
     266           0 :                 else if (info->offset + info->bytes > root->cache_progress)
     267           0 :                         count = root->cache_progress - info->offset + 1;
     268             :                 else
     269             :                         count = info->bytes;
     270             : 
     271           0 :                 __btrfs_add_free_space(ctl, info->offset, count);
     272             : free:
     273           0 :                 rb_erase(&info->offset_index, rbroot);
     274           0 :                 kfree(info);
     275           0 :         }
     276             : }
     277             : 
     278             : #define INIT_THRESHOLD  (((1024 * 32) / 2) / sizeof(struct btrfs_free_space))
     279             : #define INODES_PER_BITMAP (PAGE_CACHE_SIZE * 8)
     280             : 
     281             : /*
     282             :  * The goal is to keep the memory used by the free_ino tree won't
     283             :  * exceed the memory if we use bitmaps only.
     284             :  */
     285           0 : static void recalculate_thresholds(struct btrfs_free_space_ctl *ctl)
     286             : {
     287             :         struct btrfs_free_space *info;
     288             :         struct rb_node *n;
     289             :         int max_ino;
     290             :         int max_bitmaps;
     291             : 
     292           0 :         n = rb_last(&ctl->free_space_offset);
     293           0 :         if (!n) {
     294           0 :                 ctl->extents_thresh = INIT_THRESHOLD;
     295           0 :                 return;
     296             :         }
     297             :         info = rb_entry(n, struct btrfs_free_space, offset_index);
     298             : 
     299             :         /*
     300             :          * Find the maximum inode number in the filesystem. Note we
     301             :          * ignore the fact that this can be a bitmap, because we are
     302             :          * not doing precise calculation.
     303             :          */
     304           0 :         max_ino = info->bytes - 1;
     305             : 
     306           0 :         max_bitmaps = ALIGN(max_ino, INODES_PER_BITMAP) / INODES_PER_BITMAP;
     307           0 :         if (max_bitmaps <= ctl->total_bitmaps) {
     308           0 :                 ctl->extents_thresh = 0;
     309           0 :                 return;
     310             :         }
     311             : 
     312           0 :         ctl->extents_thresh = (max_bitmaps - ctl->total_bitmaps) *
     313           0 :                                 PAGE_CACHE_SIZE / sizeof(*info);
     314             : }
     315             : 
     316             : /*
     317             :  * We don't fall back to bitmap, if we are below the extents threshold
     318             :  * or this chunk of inode numbers is a big one.
     319             :  */
     320           0 : static bool use_bitmap(struct btrfs_free_space_ctl *ctl,
     321             :                        struct btrfs_free_space *info)
     322             : {
     323           0 :         if (ctl->free_extents < ctl->extents_thresh ||
     324           0 :             info->bytes > INODES_PER_BITMAP / 10)
     325             :                 return false;
     326             : 
     327           0 :         return true;
     328             : }
     329             : 
     330             : static struct btrfs_free_space_op free_ino_op = {
     331             :         .recalc_thresholds      = recalculate_thresholds,
     332             :         .use_bitmap             = use_bitmap,
     333             : };
     334             : 
     335           0 : static void pinned_recalc_thresholds(struct btrfs_free_space_ctl *ctl)
     336             : {
     337           0 : }
     338             : 
     339           0 : static bool pinned_use_bitmap(struct btrfs_free_space_ctl *ctl,
     340             :                               struct btrfs_free_space *info)
     341             : {
     342             :         /*
     343             :          * We always use extents for two reasons:
     344             :          *
     345             :          * - The pinned tree is only used during the process of caching
     346             :          *   work.
     347             :          * - Make code simpler. See btrfs_unpin_free_ino().
     348             :          */
     349           0 :         return false;
     350             : }
     351             : 
     352             : static struct btrfs_free_space_op pinned_free_ino_op = {
     353             :         .recalc_thresholds      = pinned_recalc_thresholds,
     354             :         .use_bitmap             = pinned_use_bitmap,
     355             : };
     356             : 
     357         688 : void btrfs_init_free_ino_ctl(struct btrfs_root *root)
     358             : {
     359         688 :         struct btrfs_free_space_ctl *ctl = root->free_ino_ctl;
     360         688 :         struct btrfs_free_space_ctl *pinned = root->free_ino_pinned;
     361             : 
     362         688 :         spin_lock_init(&ctl->tree_lock);
     363         688 :         ctl->unit = 1;
     364         688 :         ctl->start = 0;
     365         688 :         ctl->private = NULL;
     366         688 :         ctl->op = &free_ino_op;
     367             : 
     368             :         /*
     369             :          * Initially we allow to use 16K of ram to cache chunks of
     370             :          * inode numbers before we resort to bitmaps. This is somewhat
     371             :          * arbitrary, but it will be adjusted in runtime.
     372             :          */
     373         688 :         ctl->extents_thresh = INIT_THRESHOLD;
     374             : 
     375         688 :         spin_lock_init(&pinned->tree_lock);
     376         688 :         pinned->unit = 1;
     377         688 :         pinned->start = 0;
     378         688 :         pinned->private = NULL;
     379         688 :         pinned->extents_thresh = 0;
     380         688 :         pinned->op = &pinned_free_ino_op;
     381         688 : }
     382             : 
     383        2548 : int btrfs_save_ino_cache(struct btrfs_root *root,
     384             :                          struct btrfs_trans_handle *trans)
     385             : {
     386        2548 :         struct btrfs_free_space_ctl *ctl = root->free_ino_ctl;
     387             :         struct btrfs_path *path;
     388           0 :         struct inode *inode;
     389             :         struct btrfs_block_rsv *rsv;
     390             :         u64 num_bytes;
     391        2548 :         u64 alloc_hint = 0;
     392             :         int ret;
     393             :         int prealloc;
     394             :         bool retry = false;
     395             : 
     396             :         /* only fs tree and subvol/snap needs ino cache */
     397        2548 :         if (root->root_key.objectid != BTRFS_FS_TREE_OBJECTID &&
     398             :             (root->root_key.objectid < BTRFS_FIRST_FREE_OBJECTID ||
     399             :              root->root_key.objectid > BTRFS_LAST_FREE_OBJECTID))
     400             :                 return 0;
     401             : 
     402             :         /* Don't save inode cache if we are deleting this root */
     403        2424 :         if (btrfs_root_refs(&root->root_item) == 0)
     404             :                 return 0;
     405             : 
     406        1620 :         if (!btrfs_test_opt(root, INODE_MAP_CACHE))
     407             :                 return 0;
     408             : 
     409           0 :         path = btrfs_alloc_path();
     410           0 :         if (!path)
     411             :                 return -ENOMEM;
     412             : 
     413           0 :         rsv = trans->block_rsv;
     414           0 :         trans->block_rsv = &root->fs_info->trans_block_rsv;
     415             : 
     416           0 :         num_bytes = trans->bytes_reserved;
     417             :         /*
     418             :          * 1 item for inode item insertion if need
     419             :          * 4 items for inode item update (in the worst case)
     420             :          * 1 items for slack space if we need do truncation
     421             :          * 1 item for free space object
     422             :          * 3 items for pre-allocation
     423             :          */
     424           0 :         trans->bytes_reserved = btrfs_calc_trans_metadata_size(root, 10);
     425           0 :         ret = btrfs_block_rsv_add(root, trans->block_rsv,
     426             :                                   trans->bytes_reserved,
     427             :                                   BTRFS_RESERVE_NO_FLUSH);
     428           0 :         if (ret)
     429             :                 goto out;
     430           0 :         trace_btrfs_space_reservation(root->fs_info, "ino_cache",
     431             :                                       trans->transid, trans->bytes_reserved, 1);
     432             : again:
     433           0 :         inode = lookup_free_ino_inode(root, path);
     434           0 :         if (IS_ERR(inode) && (PTR_ERR(inode) != -ENOENT || retry)) {
     435           0 :                 ret = PTR_ERR(inode);
     436           0 :                 goto out_release;
     437             :         }
     438             : 
     439           0 :         if (IS_ERR(inode)) {
     440           0 :                 BUG_ON(retry); /* Logic error */
     441             :                 retry = true;
     442             : 
     443           0 :                 ret = create_free_ino_inode(root, trans, path);
     444           0 :                 if (ret)
     445             :                         goto out_release;
     446             :                 goto again;
     447             :         }
     448             : 
     449           0 :         BTRFS_I(inode)->generation = 0;
     450           0 :         ret = btrfs_update_inode(trans, root, inode);
     451           0 :         if (ret) {
     452           0 :                 btrfs_abort_transaction(trans, root, ret);
     453           0 :                 goto out_put;
     454             :         }
     455             : 
     456           0 :         if (i_size_read(inode) > 0) {
     457           0 :                 ret = btrfs_truncate_free_space_cache(root, trans, inode);
     458           0 :                 if (ret) {
     459           0 :                         if (ret != -ENOSPC)
     460           0 :                                 btrfs_abort_transaction(trans, root, ret);
     461             :                         goto out_put;
     462             :                 }
     463             :         }
     464             : 
     465             :         spin_lock(&root->cache_lock);
     466           0 :         if (root->cached != BTRFS_CACHE_FINISHED) {
     467             :                 ret = -1;
     468             :                 spin_unlock(&root->cache_lock);
     469             :                 goto out_put;
     470             :         }
     471             :         spin_unlock(&root->cache_lock);
     472             : 
     473             :         spin_lock(&ctl->tree_lock);
     474           0 :         prealloc = sizeof(struct btrfs_free_space) * ctl->free_extents;
     475           0 :         prealloc = ALIGN(prealloc, PAGE_CACHE_SIZE);
     476           0 :         prealloc += ctl->total_bitmaps * PAGE_CACHE_SIZE;
     477             :         spin_unlock(&ctl->tree_lock);
     478             : 
     479             :         /* Just to make sure we have enough space */
     480           0 :         prealloc += 8 * PAGE_CACHE_SIZE;
     481             : 
     482           0 :         ret = btrfs_delalloc_reserve_space(inode, prealloc);
     483           0 :         if (ret)
     484             :                 goto out_put;
     485             : 
     486           0 :         ret = btrfs_prealloc_file_range_trans(inode, trans, 0, 0, prealloc,
     487             :                                               prealloc, prealloc, &alloc_hint);
     488           0 :         if (ret) {
     489           0 :                 btrfs_delalloc_release_space(inode, prealloc);
     490           0 :                 goto out_put;
     491             :         }
     492           0 :         btrfs_free_reserved_data_space(inode, prealloc);
     493             : 
     494           0 :         ret = btrfs_write_out_ino_cache(root, trans, path, inode);
     495             : out_put:
     496           0 :         iput(inode);
     497             : out_release:
     498           0 :         trace_btrfs_space_reservation(root->fs_info, "ino_cache",
     499             :                                       trans->transid, trans->bytes_reserved, 0);
     500           0 :         btrfs_block_rsv_release(root, trans->block_rsv, trans->bytes_reserved);
     501             : out:
     502           0 :         trans->block_rsv = rsv;
     503           0 :         trans->bytes_reserved = num_bytes;
     504             : 
     505           0 :         btrfs_free_path(path);
     506           0 :         return ret;
     507             : }
     508             : 
     509         238 : static int btrfs_find_highest_objectid(struct btrfs_root *root, u64 *objectid)
     510             : {
     511             :         struct btrfs_path *path;
     512             :         int ret;
     513             :         struct extent_buffer *l;
     514             :         struct btrfs_key search_key;
     515             :         struct btrfs_key found_key;
     516             :         int slot;
     517             : 
     518         238 :         path = btrfs_alloc_path();
     519         238 :         if (!path)
     520             :                 return -ENOMEM;
     521             : 
     522         238 :         search_key.objectid = BTRFS_LAST_FREE_OBJECTID;
     523         238 :         search_key.type = -1;
     524         238 :         search_key.offset = (u64)-1;
     525         238 :         ret = btrfs_search_slot(NULL, root, &search_key, path, 0, 0);
     526         238 :         if (ret < 0)
     527             :                 goto error;
     528         238 :         BUG_ON(ret == 0); /* Corruption */
     529         238 :         if (path->slots[0] > 0) {
     530         238 :                 slot = path->slots[0] - 1;
     531         238 :                 l = path->nodes[0];
     532         238 :                 btrfs_item_key_to_cpu(l, &found_key, slot);
     533         238 :                 *objectid = max_t(u64, found_key.objectid,
     534             :                                   BTRFS_FIRST_FREE_OBJECTID - 1);
     535             :         } else {
     536           0 :                 *objectid = BTRFS_FIRST_FREE_OBJECTID - 1;
     537             :         }
     538             :         ret = 0;
     539             : error:
     540         238 :         btrfs_free_path(path);
     541         238 :         return ret;
     542             : }
     543             : 
     544       20869 : int btrfs_find_free_objectid(struct btrfs_root *root, u64 *objectid)
     545             : {
     546             :         int ret;
     547       20869 :         mutex_lock(&root->objectid_mutex);
     548             : 
     549       20869 :         if (unlikely(root->highest_objectid < BTRFS_FIRST_FREE_OBJECTID)) {
     550         238 :                 ret = btrfs_find_highest_objectid(root,
     551             :                                                   &root->highest_objectid);
     552         238 :                 if (ret)
     553             :                         goto out;
     554             :         }
     555             : 
     556       20869 :         if (unlikely(root->highest_objectid >= BTRFS_LAST_FREE_OBJECTID)) {
     557             :                 ret = -ENOSPC;
     558             :                 goto out;
     559             :         }
     560             : 
     561       20869 :         *objectid = ++root->highest_objectid;
     562             :         ret = 0;
     563             : out:
     564       20869 :         mutex_unlock(&root->objectid_mutex);
     565       20869 :         return ret;
     566             : }

Generated by: LCOV version 1.10