Having the filesystem in an error state, meaning we had a transaction
abort, is unexpected. Mark every check for the error state with the
unlikely annotation to convey that and to allow the compiler to generate
better code.
On x86_64, using gcc 14.2.0-19 from Debian, resulted in a slightly
reduced object size and better code.
Before:
$ size fs/btrfs/btrfs.ko
text data bss dec hex filename
2008598 175912 15592
2200102 219226 fs/btrfs/btrfs.ko
After:
$ size fs/btrfs/btrfs.ko
text data bss dec hex filename
2008450 175912 15592
2199954 219192 fs/btrfs/btrfs.ko
Reviewed-by: Anand Jain <asj@kernel.org>
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
wake_up_process(fs_info->cleaner_kthread);
mutex_unlock(&fs_info->transaction_kthread_mutex);
- if (BTRFS_FS_ERROR(fs_info))
+ if (unlikely(BTRFS_FS_ERROR(fs_info)))
btrfs_cleanup_transaction(fs_info);
if (!kthread_should_stop() &&
(!btrfs_transaction_blocked(fs_info) ||
drop_ref = true;
spin_unlock(&fs_info->fs_roots_radix_lock);
- if (BTRFS_FS_ERROR(fs_info)) {
+ if (unlikely(BTRFS_FS_ERROR(fs_info))) {
ASSERT(root->log_root == NULL);
if (root->reloc_root) {
btrfs_put_root(root->reloc_root);
* and it only returns 0 or errors.
*/
ASSERT(ret <= 0);
- if (!ret && BTRFS_FS_ERROR(fs_info))
+ if (unlikely(!ret && BTRFS_FS_ERROR(fs_info)))
ret = -EROFS;
if (ctx.zoned_bg)
* have opened a file as writable, we have to stop this write operation
* to ensure consistency.
*/
- if (BTRFS_FS_ERROR(inode->root->fs_info))
+ if (unlikely(BTRFS_FS_ERROR(inode->root->fs_info)))
return -EROFS;
if (encoded && (iocb->ki_flags & IOCB_NOWAIT))
{
struct btrfs_fs_info *fs_info = root->fs_info;
- if (BTRFS_FS_ERROR(fs_info))
+ if (unlikely(BTRFS_FS_ERROR(fs_info)))
return -EROFS;
return start_delalloc_inodes(root, NULL, true, in_reclaim_context);
}
LIST_HEAD(splice);
int ret;
- if (BTRFS_FS_ERROR(fs_info))
+ if (unlikely(BTRFS_FS_ERROR(fs_info)))
return -EROFS;
mutex_lock(&fs_info->delalloc_root_mutex);
memcpy(curr, STATE_STRING_PREFACE, sizeof(STATE_STRING_PREFACE));
curr += sizeof(STATE_STRING_PREFACE) - 1;
- if (BTRFS_FS_ERROR(info)) {
+ if (unlikely(BTRFS_FS_ERROR(info))) {
*curr++ = 'E';
states_printed = true;
}
struct page *page;
struct btrfs_fs_info *fs_info = sctx->fs_info;
- if (BTRFS_FS_ERROR(fs_info))
+ if (unlikely(BTRFS_FS_ERROR(fs_info)))
return -EROFS;
page = alloc_page(GFP_KERNEL);
{
int ret;
- if (BTRFS_FS_ERROR(fs_info)) {
+ if (unlikely(BTRFS_FS_ERROR(fs_info))) {
btrfs_err(fs_info,
"remounting read-write after error is not allowed");
return -EINVAL;
spin_lock(&fs_info->trans_lock);
loop:
/* The file system has been taken offline. No new transactions. */
- if (BTRFS_FS_ERROR(fs_info)) {
+ if (unlikely(BTRFS_FS_ERROR(fs_info))) {
spin_unlock(&fs_info->trans_lock);
return -EROFS;
}
btrfs_lockdep_release(fs_info, btrfs_trans_num_writers);
kfree(cur_trans);
goto loop;
- } else if (BTRFS_FS_ERROR(fs_info)) {
+ } else if (unlikely(BTRFS_FS_ERROR(fs_info))) {
spin_unlock(&fs_info->trans_lock);
btrfs_lockdep_release(fs_info, btrfs_trans_num_extwriters);
btrfs_lockdep_release(fs_info, btrfs_trans_num_writers);
bool do_chunk_alloc = false;
int ret;
- if (BTRFS_FS_ERROR(fs_info))
+ if (unlikely(BTRFS_FS_ERROR(fs_info)))
return ERR_PTR(-EROFS);
if (current->journal_info) {
if (throttle)
btrfs_run_delayed_iputs(info);
- if (TRANS_ABORTED(trans) || BTRFS_FS_ERROR(info)) {
+ if (unlikely(TRANS_ABORTED(trans) || BTRFS_FS_ERROR(info))) {
wake_up_process(info->transaction_kthread);
if (TRANS_ABORTED(trans))
ret = trans->aborted;
* abort to prevent writing a new superblock that reflects a
* corrupt state (pointing to trees with unwritten nodes/leafs).
*/
- if (BTRFS_FS_ERROR(fs_info)) {
+ if (unlikely(BTRFS_FS_ERROR(fs_info))) {
spin_unlock(&fs_info->trans_lock);
ret = -EROFS;
goto lockdep_release;
* writing the super here would result in transid mismatches. If there
* is an error here just bail.
*/
- if (BTRFS_FS_ERROR(fs_info)) {
+ if (unlikely(BTRFS_FS_ERROR(fs_info))) {
ret = -EIO;
btrfs_set_log_full_commit(trans);
btrfs_abort_transaction(trans, ret);
* If we had a transaction abort, stop all running scrubs.
* See transaction.c:cleanup_transaction() why we do it here.
*/
- if (BTRFS_FS_ERROR(fs_info))
+ if (unlikely(BTRFS_FS_ERROR(fs_info)))
btrfs_scrub_cancel(fs_info);
return ret;
}