^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (C) 2007 Oracle. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <linux/blkdev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/pagemap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/highmem.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/time.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/seq_file.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/backing-dev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/mount.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/writeback.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/statfs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/compat.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/parser.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/ctype.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <linux/namei.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <linux/miscdevice.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <linux/magic.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <linux/cleancache.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include <linux/ratelimit.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include <linux/crc32c.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include <linux/btrfs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #include "delayed-inode.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #include "ctree.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #include "disk-io.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #include "transaction.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #include "btrfs_inode.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #include "print-tree.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #include "props.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #include "xattr.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #include "volumes.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #include "export.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #include "compression.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #include "rcu-string.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #include "dev-replace.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #include "free-space-cache.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #include "backref.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #include "space-info.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #include "sysfs.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #include "tests/btrfs-tests.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #include "block-group.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #include "discard.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #include "qgroup.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define CREATE_TRACE_POINTS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #include <trace/events/btrfs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) static const struct super_operations btrfs_super_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) * Types for mounting the default subvolume and a subvolume explicitly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) * requested by subvol=/path. That way the callchain is straightforward and we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) * don't have to play tricks with the mount options and recursive calls to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) * btrfs_mount.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) * The new btrfs_root_fs_type also servers as a tag for the bdev_holder.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) static struct file_system_type btrfs_fs_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) static struct file_system_type btrfs_root_fs_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) static int btrfs_remount(struct super_block *sb, int *flags, char *data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) * Generally the error codes correspond to their respective errors, but there
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) * are a few special cases.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) * EUCLEAN: Any sort of corruption that we encounter. The tree-checker for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) * instance will return EUCLEAN if any of the blocks are corrupted in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) * a way that is problematic. We want to reserve EUCLEAN for these
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) * sort of corruptions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) * EROFS: If we check BTRFS_FS_STATE_ERROR and fail out with a return error, we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) * need to use EROFS for this case. We will have no idea of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) * original failure, that will have been reported at the time we tripped
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) * over the error. Each subsequent error that doesn't have any context
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) * of the original error should use EROFS when handling BTRFS_FS_STATE_ERROR.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) const char * __attribute_const__ btrfs_decode_error(int errno)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) char *errstr = "unknown";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) switch (errno) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) case -ENOENT: /* -2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) errstr = "No such entry";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) case -EIO: /* -5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) errstr = "IO failure";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) case -ENOMEM: /* -12*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) errstr = "Out of memory";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) case -EEXIST: /* -17 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) errstr = "Object already exists";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) case -ENOSPC: /* -28 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) errstr = "No space left";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) case -EROFS: /* -30 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) errstr = "Readonly filesystem";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) case -EOPNOTSUPP: /* -95 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) errstr = "Operation not supported";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) case -EUCLEAN: /* -117 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) errstr = "Filesystem corrupted";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) case -EDQUOT: /* -122 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) errstr = "Quota exceeded";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) return errstr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) * __btrfs_handle_fs_error decodes expected errors from the caller and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) * invokes the appropriate error response.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) __cold
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) void __btrfs_handle_fs_error(struct btrfs_fs_info *fs_info, const char *function,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) unsigned int line, int errno, const char *fmt, ...)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) struct super_block *sb = fs_info->sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) #ifdef CONFIG_PRINTK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) const char *errstr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) * Special case: if the error is EROFS, and we're already
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) * under SB_RDONLY, then it is safe here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) if (errno == -EROFS && sb_rdonly(sb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) #ifdef CONFIG_PRINTK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) errstr = btrfs_decode_error(errno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) if (fmt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) struct va_format vaf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) va_list args;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) va_start(args, fmt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) vaf.fmt = fmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) vaf.va = &args;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) pr_crit("BTRFS: error (device %s) in %s:%d: errno=%d %s (%pV)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) sb->s_id, function, line, errno, errstr, &vaf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) va_end(args);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) pr_crit("BTRFS: error (device %s) in %s:%d: errno=%d %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) sb->s_id, function, line, errno, errstr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) * Today we only save the error info to memory. Long term we'll
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) * also send it down to the disk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) set_bit(BTRFS_FS_STATE_ERROR, &fs_info->fs_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) /* Don't go through full error handling during mount */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) if (!(sb->s_flags & SB_BORN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) if (sb_rdonly(sb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) btrfs_discard_stop(fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) /* btrfs handle error by forcing the filesystem readonly */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) sb->s_flags |= SB_RDONLY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) btrfs_info(fs_info, "forced readonly");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) * Note that a running device replace operation is not canceled here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) * although there is no way to update the progress. It would add the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) * risk of a deadlock, therefore the canceling is omitted. The only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) * penalty is that some I/O remains active until the procedure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) * completes. The next time when the filesystem is mounted writable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) * again, the device replace operation continues.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) #ifdef CONFIG_PRINTK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) static const char * const logtypes[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) "emergency",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) "alert",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) "critical",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) "error",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) "warning",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) "notice",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) "info",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) "debug",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) * Use one ratelimit state per log level so that a flood of less important
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) * messages doesn't cause more important ones to be dropped.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) static struct ratelimit_state printk_limits[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) RATELIMIT_STATE_INIT(printk_limits[0], DEFAULT_RATELIMIT_INTERVAL, 100),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) RATELIMIT_STATE_INIT(printk_limits[1], DEFAULT_RATELIMIT_INTERVAL, 100),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) RATELIMIT_STATE_INIT(printk_limits[2], DEFAULT_RATELIMIT_INTERVAL, 100),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) RATELIMIT_STATE_INIT(printk_limits[3], DEFAULT_RATELIMIT_INTERVAL, 100),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) RATELIMIT_STATE_INIT(printk_limits[4], DEFAULT_RATELIMIT_INTERVAL, 100),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) RATELIMIT_STATE_INIT(printk_limits[5], DEFAULT_RATELIMIT_INTERVAL, 100),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) RATELIMIT_STATE_INIT(printk_limits[6], DEFAULT_RATELIMIT_INTERVAL, 100),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) RATELIMIT_STATE_INIT(printk_limits[7], DEFAULT_RATELIMIT_INTERVAL, 100),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) void __cold btrfs_printk(const struct btrfs_fs_info *fs_info, const char *fmt, ...)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) char lvl[PRINTK_MAX_SINGLE_HEADER_LEN + 1] = "\0";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) struct va_format vaf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) va_list args;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) int kern_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) const char *type = logtypes[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) struct ratelimit_state *ratelimit = &printk_limits[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) va_start(args, fmt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) while ((kern_level = printk_get_level(fmt)) != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) size_t size = printk_skip_level(fmt) - fmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) if (kern_level >= '0' && kern_level <= '7') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) memcpy(lvl, fmt, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) lvl[size] = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) type = logtypes[kern_level - '0'];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) ratelimit = &printk_limits[kern_level - '0'];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) fmt += size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) vaf.fmt = fmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) vaf.va = &args;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) if (__ratelimit(ratelimit))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) printk("%sBTRFS %s (device %s): %pV\n", lvl, type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) fs_info ? fs_info->sb->s_id : "<unknown>", &vaf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) va_end(args);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) * We only mark the transaction aborted and then set the file system read-only.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) * This will prevent new transactions from starting or trying to join this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) * one.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) * This means that error recovery at the call site is limited to freeing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) * any local memory allocations and passing the error code up without
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) * further cleanup. The transaction should complete as it normally would
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) * in the call path but will return -EIO.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) * We'll complete the cleanup in btrfs_end_transaction and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) * btrfs_commit_transaction.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) __cold
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) void __btrfs_abort_transaction(struct btrfs_trans_handle *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) const char *function,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) unsigned int line, int errno)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) struct btrfs_fs_info *fs_info = trans->fs_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) WRITE_ONCE(trans->aborted, errno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) /* Nothing used. The other threads that have joined this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) * transaction may be able to continue. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) if (!trans->dirty && list_empty(&trans->new_bgs)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) const char *errstr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) errstr = btrfs_decode_error(errno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) btrfs_warn(fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) "%s:%d: Aborting unused transaction(%s).",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) function, line, errstr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) WRITE_ONCE(trans->transaction->aborted, errno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) /* Wake up anybody who may be waiting on this transaction */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) wake_up(&fs_info->transaction_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) wake_up(&fs_info->transaction_blocked_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) __btrfs_handle_fs_error(fs_info, function, line, errno, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) * __btrfs_panic decodes unexpected, fatal errors from the caller,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) * issues an alert, and either panics or BUGs, depending on mount options.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) __cold
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) void __btrfs_panic(struct btrfs_fs_info *fs_info, const char *function,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) unsigned int line, int errno, const char *fmt, ...)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) char *s_id = "<unknown>";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) const char *errstr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) struct va_format vaf = { .fmt = fmt };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) va_list args;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) if (fs_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) s_id = fs_info->sb->s_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) va_start(args, fmt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) vaf.va = &args;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) errstr = btrfs_decode_error(errno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) if (fs_info && (btrfs_test_opt(fs_info, PANIC_ON_FATAL_ERROR)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) panic(KERN_CRIT "BTRFS panic (device %s) in %s:%d: %pV (errno=%d %s)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) s_id, function, line, &vaf, errno, errstr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) btrfs_crit(fs_info, "panic in %s:%d: %pV (errno=%d %s)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) function, line, &vaf, errno, errstr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) va_end(args);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) /* Caller calls BUG() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) static void btrfs_put_super(struct super_block *sb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) close_ctree(btrfs_sb(sb));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) Opt_acl, Opt_noacl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) Opt_clear_cache,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) Opt_commit_interval,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) Opt_compress,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) Opt_compress_force,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) Opt_compress_force_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) Opt_compress_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) Opt_degraded,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) Opt_device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) Opt_fatal_errors,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) Opt_flushoncommit, Opt_noflushoncommit,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) Opt_inode_cache, Opt_noinode_cache,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) Opt_max_inline,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) Opt_barrier, Opt_nobarrier,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) Opt_datacow, Opt_nodatacow,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) Opt_datasum, Opt_nodatasum,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) Opt_defrag, Opt_nodefrag,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) Opt_discard, Opt_nodiscard,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) Opt_discard_mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) Opt_norecovery,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) Opt_ratio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) Opt_rescan_uuid_tree,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) Opt_skip_balance,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) Opt_space_cache, Opt_no_space_cache,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) Opt_space_cache_version,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) Opt_ssd, Opt_nossd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) Opt_ssd_spread, Opt_nossd_spread,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) Opt_subvol,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) Opt_subvol_empty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) Opt_subvolid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) Opt_thread_pool,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) Opt_treelog, Opt_notreelog,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) Opt_user_subvol_rm_allowed,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) /* Rescue options */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) Opt_rescue,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) Opt_usebackuproot,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) Opt_nologreplay,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) /* Deprecated options */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) Opt_recovery,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) /* Debugging options */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) Opt_check_integrity,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) Opt_check_integrity_including_extent_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) Opt_check_integrity_print_mask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) Opt_enospc_debug, Opt_noenospc_debug,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) #ifdef CONFIG_BTRFS_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) Opt_fragment_data, Opt_fragment_metadata, Opt_fragment_all,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) #ifdef CONFIG_BTRFS_FS_REF_VERIFY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) Opt_ref_verify,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) Opt_err,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) static const match_table_t tokens = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) {Opt_acl, "acl"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) {Opt_noacl, "noacl"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) {Opt_clear_cache, "clear_cache"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) {Opt_commit_interval, "commit=%u"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) {Opt_compress, "compress"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) {Opt_compress_type, "compress=%s"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) {Opt_compress_force, "compress-force"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) {Opt_compress_force_type, "compress-force=%s"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) {Opt_degraded, "degraded"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) {Opt_device, "device=%s"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) {Opt_fatal_errors, "fatal_errors=%s"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) {Opt_flushoncommit, "flushoncommit"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) {Opt_noflushoncommit, "noflushoncommit"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) {Opt_inode_cache, "inode_cache"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) {Opt_noinode_cache, "noinode_cache"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) {Opt_max_inline, "max_inline=%s"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) {Opt_barrier, "barrier"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) {Opt_nobarrier, "nobarrier"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) {Opt_datacow, "datacow"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) {Opt_nodatacow, "nodatacow"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) {Opt_datasum, "datasum"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) {Opt_nodatasum, "nodatasum"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) {Opt_defrag, "autodefrag"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) {Opt_nodefrag, "noautodefrag"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) {Opt_discard, "discard"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) {Opt_discard_mode, "discard=%s"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) {Opt_nodiscard, "nodiscard"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) {Opt_norecovery, "norecovery"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) {Opt_ratio, "metadata_ratio=%u"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) {Opt_rescan_uuid_tree, "rescan_uuid_tree"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) {Opt_skip_balance, "skip_balance"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) {Opt_space_cache, "space_cache"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) {Opt_no_space_cache, "nospace_cache"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) {Opt_space_cache_version, "space_cache=%s"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) {Opt_ssd, "ssd"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) {Opt_nossd, "nossd"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) {Opt_ssd_spread, "ssd_spread"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) {Opt_nossd_spread, "nossd_spread"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) {Opt_subvol, "subvol=%s"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) {Opt_subvol_empty, "subvol="},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) {Opt_subvolid, "subvolid=%s"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) {Opt_thread_pool, "thread_pool=%u"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) {Opt_treelog, "treelog"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) {Opt_notreelog, "notreelog"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) {Opt_user_subvol_rm_allowed, "user_subvol_rm_allowed"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) /* Rescue options */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) {Opt_rescue, "rescue=%s"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) /* Deprecated, with alias rescue=nologreplay */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) {Opt_nologreplay, "nologreplay"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) /* Deprecated, with alias rescue=usebackuproot */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) {Opt_usebackuproot, "usebackuproot"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) /* Deprecated options */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) {Opt_recovery, "recovery"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) /* Debugging options */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) {Opt_check_integrity, "check_int"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) {Opt_check_integrity_including_extent_data, "check_int_data"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) {Opt_check_integrity_print_mask, "check_int_print_mask=%u"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) {Opt_enospc_debug, "enospc_debug"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) {Opt_noenospc_debug, "noenospc_debug"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) #ifdef CONFIG_BTRFS_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) {Opt_fragment_data, "fragment=data"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) {Opt_fragment_metadata, "fragment=metadata"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) {Opt_fragment_all, "fragment=all"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) #ifdef CONFIG_BTRFS_FS_REF_VERIFY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) {Opt_ref_verify, "ref_verify"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) {Opt_err, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) static const match_table_t rescue_tokens = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) {Opt_usebackuproot, "usebackuproot"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) {Opt_nologreplay, "nologreplay"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) {Opt_err, NULL},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) static int parse_rescue_options(struct btrfs_fs_info *info, const char *options)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) char *opts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) char *orig;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) char *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) substring_t args[MAX_OPT_ARGS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) opts = kstrdup(options, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) if (!opts)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) orig = opts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) while ((p = strsep(&opts, ":")) != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) int token;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) if (!*p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) token = match_token(p, rescue_tokens, args);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) switch (token){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) case Opt_usebackuproot:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) btrfs_info(info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) "trying to use backup root at mount time");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) btrfs_set_opt(info->mount_opt, USEBACKUPROOT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) case Opt_nologreplay:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) btrfs_set_and_info(info, NOLOGREPLAY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) "disabling log replay at mount time");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) case Opt_err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) btrfs_info(info, "unrecognized rescue option '%s'", p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) kfree(orig);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) * Regular mount options parser. Everything that is needed only when
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) * reading in a new superblock is parsed here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) * XXX JDM: This needs to be cleaned up for remount.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) int btrfs_parse_options(struct btrfs_fs_info *info, char *options,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) unsigned long new_flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) substring_t args[MAX_OPT_ARGS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) char *p, *num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) u64 cache_gen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) int intarg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) char *compress_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) bool compress_force = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) enum btrfs_compression_type saved_compress_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) int saved_compress_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) bool saved_compress_force;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) int no_compress = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) cache_gen = btrfs_super_cache_generation(info->super_copy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) if (btrfs_fs_compat_ro(info, FREE_SPACE_TREE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) btrfs_set_opt(info->mount_opt, FREE_SPACE_TREE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) else if (cache_gen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) btrfs_set_opt(info->mount_opt, SPACE_CACHE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) * Even the options are empty, we still need to do extra check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) * against new flags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) if (!options)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) goto check;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) while ((p = strsep(&options, ",")) != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) int token;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) if (!*p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) token = match_token(p, tokens, args);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) switch (token) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) case Opt_degraded:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) btrfs_info(info, "allowing degraded mounts");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) btrfs_set_opt(info->mount_opt, DEGRADED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) case Opt_subvol:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) case Opt_subvol_empty:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) case Opt_subvolid:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) case Opt_device:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) * These are parsed by btrfs_parse_subvol_options or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) * btrfs_parse_device_options and can be ignored here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) case Opt_nodatasum:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) btrfs_set_and_info(info, NODATASUM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) "setting nodatasum");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) case Opt_datasum:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) if (btrfs_test_opt(info, NODATASUM)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) if (btrfs_test_opt(info, NODATACOW))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) btrfs_info(info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) "setting datasum, datacow enabled");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) btrfs_info(info, "setting datasum");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) btrfs_clear_opt(info->mount_opt, NODATACOW);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) btrfs_clear_opt(info->mount_opt, NODATASUM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) case Opt_nodatacow:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) if (!btrfs_test_opt(info, NODATACOW)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) if (!btrfs_test_opt(info, COMPRESS) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) !btrfs_test_opt(info, FORCE_COMPRESS)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) btrfs_info(info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) "setting nodatacow, compression disabled");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) btrfs_info(info, "setting nodatacow");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) btrfs_clear_opt(info->mount_opt, COMPRESS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) btrfs_clear_opt(info->mount_opt, FORCE_COMPRESS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) btrfs_set_opt(info->mount_opt, NODATACOW);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) btrfs_set_opt(info->mount_opt, NODATASUM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) case Opt_datacow:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) btrfs_clear_and_info(info, NODATACOW,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) "setting datacow");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) case Opt_compress_force:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) case Opt_compress_force_type:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) compress_force = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) case Opt_compress:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) case Opt_compress_type:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) saved_compress_type = btrfs_test_opt(info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) COMPRESS) ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) info->compress_type : BTRFS_COMPRESS_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) saved_compress_force =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) btrfs_test_opt(info, FORCE_COMPRESS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) saved_compress_level = info->compress_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) if (token == Opt_compress ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) token == Opt_compress_force ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) strncmp(args[0].from, "zlib", 4) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) compress_type = "zlib";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) info->compress_type = BTRFS_COMPRESS_ZLIB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) info->compress_level = BTRFS_ZLIB_DEFAULT_LEVEL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) * args[0] contains uninitialized data since
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) * for these tokens we don't expect any
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) * parameter.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) if (token != Opt_compress &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) token != Opt_compress_force)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) info->compress_level =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) btrfs_compress_str2level(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) BTRFS_COMPRESS_ZLIB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) args[0].from + 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) btrfs_set_opt(info->mount_opt, COMPRESS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) btrfs_clear_opt(info->mount_opt, NODATACOW);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) btrfs_clear_opt(info->mount_opt, NODATASUM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) no_compress = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) } else if (strncmp(args[0].from, "lzo", 3) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) compress_type = "lzo";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) info->compress_type = BTRFS_COMPRESS_LZO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) info->compress_level = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) btrfs_set_opt(info->mount_opt, COMPRESS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) btrfs_clear_opt(info->mount_opt, NODATACOW);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) btrfs_clear_opt(info->mount_opt, NODATASUM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) btrfs_set_fs_incompat(info, COMPRESS_LZO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) no_compress = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) } else if (strncmp(args[0].from, "zstd", 4) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) compress_type = "zstd";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) info->compress_type = BTRFS_COMPRESS_ZSTD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) info->compress_level =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) btrfs_compress_str2level(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) BTRFS_COMPRESS_ZSTD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) args[0].from + 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) btrfs_set_opt(info->mount_opt, COMPRESS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) btrfs_clear_opt(info->mount_opt, NODATACOW);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) btrfs_clear_opt(info->mount_opt, NODATASUM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) btrfs_set_fs_incompat(info, COMPRESS_ZSTD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) no_compress = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) } else if (strncmp(args[0].from, "no", 2) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) compress_type = "no";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) info->compress_level = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) info->compress_type = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) btrfs_clear_opt(info->mount_opt, COMPRESS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) btrfs_clear_opt(info->mount_opt, FORCE_COMPRESS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) compress_force = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) no_compress++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) if (compress_force) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) btrfs_set_opt(info->mount_opt, FORCE_COMPRESS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) * If we remount from compress-force=xxx to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) * compress=xxx, we need clear FORCE_COMPRESS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) * flag, otherwise, there is no way for users
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) * to disable forcible compression separately.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) btrfs_clear_opt(info->mount_opt, FORCE_COMPRESS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) if (no_compress == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) btrfs_info(info, "use no compression");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) } else if ((info->compress_type != saved_compress_type) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) (compress_force != saved_compress_force) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) (info->compress_level != saved_compress_level)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) btrfs_info(info, "%s %s compression, level %d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) (compress_force) ? "force" : "use",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) compress_type, info->compress_level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) compress_force = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) case Opt_ssd:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) btrfs_set_and_info(info, SSD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) "enabling ssd optimizations");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) btrfs_clear_opt(info->mount_opt, NOSSD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) case Opt_ssd_spread:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) btrfs_set_and_info(info, SSD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) "enabling ssd optimizations");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) btrfs_set_and_info(info, SSD_SPREAD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) "using spread ssd allocation scheme");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) btrfs_clear_opt(info->mount_opt, NOSSD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) case Opt_nossd:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) btrfs_set_opt(info->mount_opt, NOSSD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) btrfs_clear_and_info(info, SSD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) "not using ssd optimizations");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) case Opt_nossd_spread:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) btrfs_clear_and_info(info, SSD_SPREAD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) "not using spread ssd allocation scheme");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) case Opt_barrier:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) btrfs_clear_and_info(info, NOBARRIER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) "turning on barriers");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) case Opt_nobarrier:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) btrfs_set_and_info(info, NOBARRIER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) "turning off barriers");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) case Opt_thread_pool:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) ret = match_int(&args[0], &intarg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) } else if (intarg == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) info->thread_pool_size = intarg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) case Opt_max_inline:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) num = match_strdup(&args[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) if (num) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) info->max_inline = memparse(num, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) kfree(num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) if (info->max_inline) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) info->max_inline = min_t(u64,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) info->max_inline,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) info->sectorsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) btrfs_info(info, "max_inline at %llu",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) info->max_inline);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) ret = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) case Opt_acl:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) #ifdef CONFIG_BTRFS_FS_POSIX_ACL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) info->sb->s_flags |= SB_POSIXACL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) btrfs_err(info, "support for ACL not compiled in!");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) case Opt_noacl:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) info->sb->s_flags &= ~SB_POSIXACL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) case Opt_notreelog:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) btrfs_set_and_info(info, NOTREELOG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) "disabling tree log");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) case Opt_treelog:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) btrfs_clear_and_info(info, NOTREELOG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) "enabling tree log");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) case Opt_norecovery:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) case Opt_nologreplay:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) btrfs_warn(info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) "'nologreplay' is deprecated, use 'rescue=nologreplay' instead");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) btrfs_set_and_info(info, NOLOGREPLAY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) "disabling log replay at mount time");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) case Opt_flushoncommit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) btrfs_set_and_info(info, FLUSHONCOMMIT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) "turning on flush-on-commit");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) case Opt_noflushoncommit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) btrfs_clear_and_info(info, FLUSHONCOMMIT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) "turning off flush-on-commit");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) case Opt_ratio:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) ret = match_int(&args[0], &intarg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) info->metadata_ratio = intarg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) btrfs_info(info, "metadata ratio %u",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) info->metadata_ratio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) case Opt_discard:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) case Opt_discard_mode:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) if (token == Opt_discard ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) strcmp(args[0].from, "sync") == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) btrfs_clear_opt(info->mount_opt, DISCARD_ASYNC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) btrfs_set_and_info(info, DISCARD_SYNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) "turning on sync discard");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) } else if (strcmp(args[0].from, "async") == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) btrfs_clear_opt(info->mount_opt, DISCARD_SYNC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) btrfs_set_and_info(info, DISCARD_ASYNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) "turning on async discard");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) case Opt_nodiscard:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) btrfs_clear_and_info(info, DISCARD_SYNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) "turning off discard");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) btrfs_clear_and_info(info, DISCARD_ASYNC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) "turning off async discard");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) case Opt_space_cache:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) case Opt_space_cache_version:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) if (token == Opt_space_cache ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) strcmp(args[0].from, "v1") == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) btrfs_clear_opt(info->mount_opt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) FREE_SPACE_TREE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) btrfs_set_and_info(info, SPACE_CACHE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) "enabling disk space caching");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) } else if (strcmp(args[0].from, "v2") == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) btrfs_clear_opt(info->mount_opt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) SPACE_CACHE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) btrfs_set_and_info(info, FREE_SPACE_TREE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) "enabling free space tree");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) case Opt_rescan_uuid_tree:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) btrfs_set_opt(info->mount_opt, RESCAN_UUID_TREE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) case Opt_no_space_cache:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) if (btrfs_test_opt(info, SPACE_CACHE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) btrfs_clear_and_info(info, SPACE_CACHE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) "disabling disk space caching");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) if (btrfs_test_opt(info, FREE_SPACE_TREE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) btrfs_clear_and_info(info, FREE_SPACE_TREE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) "disabling free space tree");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) case Opt_inode_cache:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) btrfs_warn(info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) "the 'inode_cache' option is deprecated and will have no effect from 5.11");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) btrfs_set_pending_and_info(info, INODE_MAP_CACHE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) "enabling inode map caching");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) case Opt_noinode_cache:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) btrfs_clear_pending_and_info(info, INODE_MAP_CACHE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) "disabling inode map caching");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) case Opt_clear_cache:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) btrfs_set_and_info(info, CLEAR_CACHE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) "force clearing of disk cache");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) case Opt_user_subvol_rm_allowed:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) btrfs_set_opt(info->mount_opt, USER_SUBVOL_RM_ALLOWED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) case Opt_enospc_debug:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) btrfs_set_opt(info->mount_opt, ENOSPC_DEBUG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) case Opt_noenospc_debug:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) btrfs_clear_opt(info->mount_opt, ENOSPC_DEBUG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) case Opt_defrag:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) btrfs_set_and_info(info, AUTO_DEFRAG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) "enabling auto defrag");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) case Opt_nodefrag:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) btrfs_clear_and_info(info, AUTO_DEFRAG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) "disabling auto defrag");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) case Opt_recovery:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) case Opt_usebackuproot:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) btrfs_warn(info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) "'%s' is deprecated, use 'rescue=usebackuproot' instead",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) token == Opt_recovery ? "recovery" :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) "usebackuproot");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) btrfs_info(info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) "trying to use backup root at mount time");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) btrfs_set_opt(info->mount_opt, USEBACKUPROOT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) case Opt_skip_balance:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) btrfs_set_opt(info->mount_opt, SKIP_BALANCE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) #ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) case Opt_check_integrity_including_extent_data:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) btrfs_info(info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) "enabling check integrity including extent data");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) btrfs_set_opt(info->mount_opt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) CHECK_INTEGRITY_INCLUDING_EXTENT_DATA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) btrfs_set_opt(info->mount_opt, CHECK_INTEGRITY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) case Opt_check_integrity:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) btrfs_info(info, "enabling check integrity");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) btrfs_set_opt(info->mount_opt, CHECK_INTEGRITY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) case Opt_check_integrity_print_mask:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) ret = match_int(&args[0], &intarg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) info->check_integrity_print_mask = intarg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) btrfs_info(info, "check_integrity_print_mask 0x%x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) info->check_integrity_print_mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) case Opt_check_integrity_including_extent_data:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) case Opt_check_integrity:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) case Opt_check_integrity_print_mask:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) btrfs_err(info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) "support for check_integrity* not compiled in!");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) case Opt_fatal_errors:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) if (strcmp(args[0].from, "panic") == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) btrfs_set_opt(info->mount_opt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) PANIC_ON_FATAL_ERROR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) else if (strcmp(args[0].from, "bug") == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) btrfs_clear_opt(info->mount_opt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) PANIC_ON_FATAL_ERROR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) case Opt_commit_interval:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) intarg = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) ret = match_int(&args[0], &intarg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) if (intarg == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) btrfs_info(info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) "using default commit interval %us",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) BTRFS_DEFAULT_COMMIT_INTERVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) intarg = BTRFS_DEFAULT_COMMIT_INTERVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) } else if (intarg > 300) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) btrfs_warn(info, "excessive commit interval %d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) intarg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) info->commit_interval = intarg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) case Opt_rescue:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) ret = parse_rescue_options(info, args[0].from);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) #ifdef CONFIG_BTRFS_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) case Opt_fragment_all:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) btrfs_info(info, "fragmenting all space");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) btrfs_set_opt(info->mount_opt, FRAGMENT_DATA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) btrfs_set_opt(info->mount_opt, FRAGMENT_METADATA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) case Opt_fragment_metadata:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) btrfs_info(info, "fragmenting metadata");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) btrfs_set_opt(info->mount_opt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) FRAGMENT_METADATA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) case Opt_fragment_data:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) btrfs_info(info, "fragmenting data");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) btrfs_set_opt(info->mount_opt, FRAGMENT_DATA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) #ifdef CONFIG_BTRFS_FS_REF_VERIFY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) case Opt_ref_verify:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) btrfs_info(info, "doing ref verification");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) btrfs_set_opt(info->mount_opt, REF_VERIFY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) case Opt_err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) btrfs_err(info, "unrecognized mount option '%s'", p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) check:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) * Extra check for current option against current flag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) if (btrfs_test_opt(info, NOLOGREPLAY) && !(new_flags & SB_RDONLY)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) btrfs_err(info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) "nologreplay must be used with ro mount option");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) if (btrfs_fs_compat_ro(info, FREE_SPACE_TREE) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) !btrfs_test_opt(info, FREE_SPACE_TREE) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) !btrfs_test_opt(info, CLEAR_CACHE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) btrfs_err(info, "cannot disable free space tree");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) if (!ret && btrfs_test_opt(info, SPACE_CACHE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) btrfs_info(info, "disk space caching is enabled");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) if (!ret && btrfs_test_opt(info, FREE_SPACE_TREE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) btrfs_info(info, "using free space tree");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) * Parse mount options that are required early in the mount process.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) * All other options will be parsed on much later in the mount process and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) * only when we need to allocate a new super block.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) static int btrfs_parse_device_options(const char *options, fmode_t flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) void *holder)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) substring_t args[MAX_OPT_ARGS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) char *device_name, *opts, *orig, *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) struct btrfs_device *device = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) int error = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) lockdep_assert_held(&uuid_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) if (!options)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) * strsep changes the string, duplicate it because btrfs_parse_options
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) * gets called later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) opts = kstrdup(options, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) if (!opts)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) orig = opts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) while ((p = strsep(&opts, ",")) != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) int token;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) if (!*p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) token = match_token(p, tokens, args);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) if (token == Opt_device) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) device_name = match_strdup(&args[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) if (!device_name) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) error = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) device = btrfs_scan_one_device(device_name, flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) holder);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) kfree(device_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) if (IS_ERR(device)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) error = PTR_ERR(device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) kfree(orig);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) * Parse mount options that are related to subvolume id
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) * The value is later passed to mount_subvol()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) static int btrfs_parse_subvol_options(const char *options, char **subvol_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) u64 *subvol_objectid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) substring_t args[MAX_OPT_ARGS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) char *opts, *orig, *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) int error = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) u64 subvolid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) if (!options)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) * strsep changes the string, duplicate it because
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) * btrfs_parse_device_options gets called later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) opts = kstrdup(options, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) if (!opts)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) orig = opts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) while ((p = strsep(&opts, ",")) != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) int token;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) if (!*p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) token = match_token(p, tokens, args);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) switch (token) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) case Opt_subvol:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) kfree(*subvol_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) *subvol_name = match_strdup(&args[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) if (!*subvol_name) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) error = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) case Opt_subvolid:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) error = match_u64(&args[0], &subvolid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) if (error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) /* we want the original fs_tree */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) if (subvolid == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) subvolid = BTRFS_FS_TREE_OBJECTID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) *subvol_objectid = subvolid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) kfree(orig);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) char *btrfs_get_subvol_name_from_objectid(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) u64 subvol_objectid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) struct btrfs_root *root = fs_info->tree_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) struct btrfs_root *fs_root = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) struct btrfs_root_ref *root_ref;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) struct btrfs_inode_ref *inode_ref;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) struct btrfs_key key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) struct btrfs_path *path = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) char *name = NULL, *ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) u64 dirid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) int len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) path = btrfs_alloc_path();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) if (!path) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) ret = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) path->leave_spinning = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) name = kmalloc(PATH_MAX, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) if (!name) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) ret = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) ptr = name + PATH_MAX - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) ptr[0] = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) * Walk up the subvolume trees in the tree of tree roots by root
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) * backrefs until we hit the top-level subvolume.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) while (subvol_objectid != BTRFS_FS_TREE_OBJECTID) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) key.objectid = subvol_objectid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) key.type = BTRFS_ROOT_BACKREF_KEY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) key.offset = (u64)-1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) } else if (ret > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) ret = btrfs_previous_item(root, path, subvol_objectid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) BTRFS_ROOT_BACKREF_KEY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) } else if (ret > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) ret = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) subvol_objectid = key.offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) root_ref = btrfs_item_ptr(path->nodes[0], path->slots[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) struct btrfs_root_ref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) len = btrfs_root_ref_name_len(path->nodes[0], root_ref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) ptr -= len + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) if (ptr < name) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) ret = -ENAMETOOLONG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) read_extent_buffer(path->nodes[0], ptr + 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) (unsigned long)(root_ref + 1), len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) ptr[0] = '/';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) dirid = btrfs_root_ref_dirid(path->nodes[0], root_ref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) btrfs_release_path(path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) fs_root = btrfs_get_fs_root(fs_info, subvol_objectid, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) if (IS_ERR(fs_root)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) ret = PTR_ERR(fs_root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) fs_root = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) * Walk up the filesystem tree by inode refs until we hit the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) * root directory.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) while (dirid != BTRFS_FIRST_FREE_OBJECTID) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) key.objectid = dirid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) key.type = BTRFS_INODE_REF_KEY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) key.offset = (u64)-1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) ret = btrfs_search_slot(NULL, fs_root, &key, path, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) } else if (ret > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) ret = btrfs_previous_item(fs_root, path, dirid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) BTRFS_INODE_REF_KEY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) } else if (ret > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) ret = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) dirid = key.offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) inode_ref = btrfs_item_ptr(path->nodes[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) path->slots[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) struct btrfs_inode_ref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) len = btrfs_inode_ref_name_len(path->nodes[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) inode_ref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) ptr -= len + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) if (ptr < name) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) ret = -ENAMETOOLONG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) read_extent_buffer(path->nodes[0], ptr + 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) (unsigned long)(inode_ref + 1), len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) ptr[0] = '/';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) btrfs_release_path(path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) btrfs_put_root(fs_root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) fs_root = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) btrfs_free_path(path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) if (ptr == name + PATH_MAX - 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) name[0] = '/';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) name[1] = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) memmove(name, ptr, name + PATH_MAX - ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) return name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) btrfs_put_root(fs_root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) btrfs_free_path(path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) kfree(name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) return ERR_PTR(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) static int get_default_subvol_objectid(struct btrfs_fs_info *fs_info, u64 *objectid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) struct btrfs_root *root = fs_info->tree_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) struct btrfs_dir_item *di;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) struct btrfs_path *path;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) struct btrfs_key location;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) u64 dir_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) path = btrfs_alloc_path();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) if (!path)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) path->leave_spinning = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) * Find the "default" dir item which points to the root item that we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) * will mount by default if we haven't been given a specific subvolume
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) * to mount.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) dir_id = btrfs_super_root_dir(fs_info->super_copy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) di = btrfs_lookup_dir_item(NULL, root, path, dir_id, "default", 7, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) if (IS_ERR(di)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) btrfs_free_path(path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) return PTR_ERR(di);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) if (!di) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) * Ok the default dir item isn't there. This is weird since
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) * it's always been there, but don't freak out, just try and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) * mount the top-level subvolume.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) btrfs_free_path(path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) *objectid = BTRFS_FS_TREE_OBJECTID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) btrfs_dir_item_key_to_cpu(path->nodes[0], di, &location);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) btrfs_free_path(path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) *objectid = location.objectid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) static int btrfs_fill_super(struct super_block *sb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) struct btrfs_fs_devices *fs_devices,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) struct inode *inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) struct btrfs_fs_info *fs_info = btrfs_sb(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) sb->s_maxbytes = MAX_LFS_FILESIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) sb->s_magic = BTRFS_SUPER_MAGIC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) sb->s_op = &btrfs_super_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) sb->s_d_op = &btrfs_dentry_operations;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) sb->s_export_op = &btrfs_export_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) sb->s_xattr = btrfs_xattr_handlers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) sb->s_time_gran = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) #ifdef CONFIG_BTRFS_FS_POSIX_ACL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) sb->s_flags |= SB_POSIXACL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) sb->s_flags |= SB_I_VERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) sb->s_iflags |= SB_I_CGROUPWB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) err = super_setup_bdi(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) btrfs_err(fs_info, "super_setup_bdi failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) err = open_ctree(sb, fs_devices, (char *)data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) btrfs_err(fs_info, "open_ctree failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) inode = btrfs_iget(sb, BTRFS_FIRST_FREE_OBJECTID, fs_info->fs_root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) if (IS_ERR(inode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) err = PTR_ERR(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) goto fail_close;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) sb->s_root = d_make_root(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) if (!sb->s_root) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) goto fail_close;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) cleancache_init_fs(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) sb->s_flags |= SB_ACTIVE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) fail_close:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) close_ctree(fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) int btrfs_sync_fs(struct super_block *sb, int wait)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) struct btrfs_trans_handle *trans;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) struct btrfs_fs_info *fs_info = btrfs_sb(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) struct btrfs_root *root = fs_info->tree_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) trace_btrfs_sync_fs(fs_info, wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) if (!wait) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) filemap_flush(fs_info->btree_inode->i_mapping);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) btrfs_wait_ordered_roots(fs_info, U64_MAX, 0, (u64)-1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) trans = btrfs_attach_transaction_barrier(root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) if (IS_ERR(trans)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) /* no transaction, don't bother */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) if (PTR_ERR(trans) == -ENOENT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) * Exit unless we have some pending changes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) * that need to go through commit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) if (fs_info->pending_changes == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) * A non-blocking test if the fs is frozen. We must not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) * start a new transaction here otherwise a deadlock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) * happens. The pending operations are delayed to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) * next commit after thawing.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) if (sb_start_write_trylock(sb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) sb_end_write(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) trans = btrfs_start_transaction(root, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) if (IS_ERR(trans))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) return PTR_ERR(trans);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) return btrfs_commit_transaction(trans);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) static int btrfs_show_options(struct seq_file *seq, struct dentry *dentry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) struct btrfs_fs_info *info = btrfs_sb(dentry->d_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) const char *compress_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) const char *subvol_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) if (btrfs_test_opt(info, DEGRADED))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) seq_puts(seq, ",degraded");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) if (btrfs_test_opt(info, NODATASUM))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) seq_puts(seq, ",nodatasum");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) if (btrfs_test_opt(info, NODATACOW))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) seq_puts(seq, ",nodatacow");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) if (btrfs_test_opt(info, NOBARRIER))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) seq_puts(seq, ",nobarrier");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) if (info->max_inline != BTRFS_DEFAULT_MAX_INLINE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) seq_printf(seq, ",max_inline=%llu", info->max_inline);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) if (info->thread_pool_size != min_t(unsigned long,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) num_online_cpus() + 2, 8))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) seq_printf(seq, ",thread_pool=%u", info->thread_pool_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) if (btrfs_test_opt(info, COMPRESS)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) compress_type = btrfs_compress_type2str(info->compress_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) if (btrfs_test_opt(info, FORCE_COMPRESS))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) seq_printf(seq, ",compress-force=%s", compress_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) seq_printf(seq, ",compress=%s", compress_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) if (info->compress_level)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) seq_printf(seq, ":%d", info->compress_level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) if (btrfs_test_opt(info, NOSSD))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) seq_puts(seq, ",nossd");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) if (btrfs_test_opt(info, SSD_SPREAD))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) seq_puts(seq, ",ssd_spread");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) else if (btrfs_test_opt(info, SSD))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) seq_puts(seq, ",ssd");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) if (btrfs_test_opt(info, NOTREELOG))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) seq_puts(seq, ",notreelog");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) if (btrfs_test_opt(info, NOLOGREPLAY))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) seq_puts(seq, ",rescue=nologreplay");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) if (btrfs_test_opt(info, FLUSHONCOMMIT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) seq_puts(seq, ",flushoncommit");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) if (btrfs_test_opt(info, DISCARD_SYNC))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) seq_puts(seq, ",discard");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) if (btrfs_test_opt(info, DISCARD_ASYNC))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) seq_puts(seq, ",discard=async");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) if (!(info->sb->s_flags & SB_POSIXACL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) seq_puts(seq, ",noacl");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) if (btrfs_test_opt(info, SPACE_CACHE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) seq_puts(seq, ",space_cache");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) else if (btrfs_test_opt(info, FREE_SPACE_TREE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) seq_puts(seq, ",space_cache=v2");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) seq_puts(seq, ",nospace_cache");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) if (btrfs_test_opt(info, RESCAN_UUID_TREE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) seq_puts(seq, ",rescan_uuid_tree");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) if (btrfs_test_opt(info, CLEAR_CACHE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) seq_puts(seq, ",clear_cache");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) if (btrfs_test_opt(info, USER_SUBVOL_RM_ALLOWED))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) seq_puts(seq, ",user_subvol_rm_allowed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) if (btrfs_test_opt(info, ENOSPC_DEBUG))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) seq_puts(seq, ",enospc_debug");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) if (btrfs_test_opt(info, AUTO_DEFRAG))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) seq_puts(seq, ",autodefrag");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) if (btrfs_test_opt(info, INODE_MAP_CACHE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) seq_puts(seq, ",inode_cache");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) if (btrfs_test_opt(info, SKIP_BALANCE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) seq_puts(seq, ",skip_balance");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) #ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) if (btrfs_test_opt(info, CHECK_INTEGRITY_INCLUDING_EXTENT_DATA))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) seq_puts(seq, ",check_int_data");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) else if (btrfs_test_opt(info, CHECK_INTEGRITY))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) seq_puts(seq, ",check_int");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) if (info->check_integrity_print_mask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) seq_printf(seq, ",check_int_print_mask=%d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) info->check_integrity_print_mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) if (info->metadata_ratio)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) seq_printf(seq, ",metadata_ratio=%u", info->metadata_ratio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) if (btrfs_test_opt(info, PANIC_ON_FATAL_ERROR))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) seq_puts(seq, ",fatal_errors=panic");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) if (info->commit_interval != BTRFS_DEFAULT_COMMIT_INTERVAL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) seq_printf(seq, ",commit=%u", info->commit_interval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) #ifdef CONFIG_BTRFS_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) if (btrfs_test_opt(info, FRAGMENT_DATA))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) seq_puts(seq, ",fragment=data");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) if (btrfs_test_opt(info, FRAGMENT_METADATA))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) seq_puts(seq, ",fragment=metadata");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) if (btrfs_test_opt(info, REF_VERIFY))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) seq_puts(seq, ",ref_verify");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) seq_printf(seq, ",subvolid=%llu",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) BTRFS_I(d_inode(dentry))->root->root_key.objectid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) subvol_name = btrfs_get_subvol_name_from_objectid(info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) BTRFS_I(d_inode(dentry))->root->root_key.objectid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) if (!IS_ERR(subvol_name)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) seq_puts(seq, ",subvol=");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) seq_escape(seq, subvol_name, " \t\n\\");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) kfree(subvol_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) static int btrfs_test_super(struct super_block *s, void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) struct btrfs_fs_info *p = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) struct btrfs_fs_info *fs_info = btrfs_sb(s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) return fs_info->fs_devices == p->fs_devices;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) static int btrfs_set_super(struct super_block *s, void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) int err = set_anon_super(s, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) if (!err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) s->s_fs_info = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) * subvolumes are identified by ino 256
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) static inline int is_subvolume_inode(struct inode *inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) if (inode && inode->i_ino == BTRFS_FIRST_FREE_OBJECTID)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) static struct dentry *mount_subvol(const char *subvol_name, u64 subvol_objectid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) struct vfsmount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) struct dentry *root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) if (!subvol_name) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) if (!subvol_objectid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) ret = get_default_subvol_objectid(btrfs_sb(mnt->mnt_sb),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) &subvol_objectid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) root = ERR_PTR(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) subvol_name = btrfs_get_subvol_name_from_objectid(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) btrfs_sb(mnt->mnt_sb), subvol_objectid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) if (IS_ERR(subvol_name)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) root = ERR_CAST(subvol_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) subvol_name = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) root = mount_subtree(mnt, subvol_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) /* mount_subtree() drops our reference on the vfsmount. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) mnt = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) if (!IS_ERR(root)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) struct super_block *s = root->d_sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) struct btrfs_fs_info *fs_info = btrfs_sb(s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) struct inode *root_inode = d_inode(root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) u64 root_objectid = BTRFS_I(root_inode)->root->root_key.objectid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) if (!is_subvolume_inode(root_inode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) btrfs_err(fs_info, "'%s' is not a valid subvolume",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) subvol_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) if (subvol_objectid && root_objectid != subvol_objectid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) * This will also catch a race condition where a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) * subvolume which was passed by ID is renamed and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) * another subvolume is renamed over the old location.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) btrfs_err(fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) "subvol '%s' does not match subvolid %llu",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) subvol_name, subvol_objectid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) dput(root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) root = ERR_PTR(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) deactivate_locked_super(s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) mntput(mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) kfree(subvol_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) return root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) * Find a superblock for the given device / mount point.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) * Note: This is based on mount_bdev from fs/super.c with a few additions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) * for multiple device setup. Make sure to keep it in sync.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) static struct dentry *btrfs_mount_root(struct file_system_type *fs_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) int flags, const char *device_name, void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) struct block_device *bdev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) struct super_block *s;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) struct btrfs_device *device = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) struct btrfs_fs_devices *fs_devices = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) struct btrfs_fs_info *fs_info = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) void *new_sec_opts = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) fmode_t mode = FMODE_READ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) int error = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) if (!(flags & SB_RDONLY))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) mode |= FMODE_WRITE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) if (data) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) error = security_sb_eat_lsm_opts(data, &new_sec_opts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) if (error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) return ERR_PTR(error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) * Setup a dummy root and fs_info for test/set super. This is because
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) * we don't actually fill this stuff out until open_ctree, but we need
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) * then open_ctree will properly initialize the file system specific
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) * settings later. btrfs_init_fs_info initializes the static elements
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) * of the fs_info (locks and such) to make cleanup easier if we find a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) * superblock with our given fs_devices later on at sget() time.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) fs_info = kvzalloc(sizeof(struct btrfs_fs_info), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) if (!fs_info) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) error = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) goto error_sec_opts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) btrfs_init_fs_info(fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) fs_info->super_copy = kzalloc(BTRFS_SUPER_INFO_SIZE, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) fs_info->super_for_commit = kzalloc(BTRFS_SUPER_INFO_SIZE, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) if (!fs_info->super_copy || !fs_info->super_for_commit) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) error = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) goto error_fs_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) mutex_lock(&uuid_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) error = btrfs_parse_device_options(data, mode, fs_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) if (error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) mutex_unlock(&uuid_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) goto error_fs_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) device = btrfs_scan_one_device(device_name, mode, fs_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) if (IS_ERR(device)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) mutex_unlock(&uuid_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) error = PTR_ERR(device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) goto error_fs_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) fs_devices = device->fs_devices;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) fs_info->fs_devices = fs_devices;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) error = btrfs_open_devices(fs_devices, mode, fs_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) mutex_unlock(&uuid_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) if (error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) goto error_fs_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) if (!(flags & SB_RDONLY) && fs_devices->rw_devices == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) error = -EACCES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) goto error_close_devices;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) bdev = fs_devices->latest_bdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) s = sget(fs_type, btrfs_test_super, btrfs_set_super, flags | SB_NOSEC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) if (IS_ERR(s)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) error = PTR_ERR(s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) goto error_close_devices;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) if (s->s_root) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) btrfs_close_devices(fs_devices);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) btrfs_free_fs_info(fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) if ((flags ^ s->s_flags) & SB_RDONLY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) error = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) snprintf(s->s_id, sizeof(s->s_id), "%pg", bdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) btrfs_sb(s)->bdev_holder = fs_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) if (!strstr(crc32c_impl(), "generic"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) set_bit(BTRFS_FS_CSUM_IMPL_FAST, &fs_info->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) error = btrfs_fill_super(s, fs_devices, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) if (!error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) error = security_sb_set_mnt_opts(s, new_sec_opts, 0, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) security_free_mnt_opts(&new_sec_opts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) if (error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) deactivate_locked_super(s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) return ERR_PTR(error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) return dget(s->s_root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) error_close_devices:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) btrfs_close_devices(fs_devices);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) error_fs_info:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) btrfs_free_fs_info(fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) error_sec_opts:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) security_free_mnt_opts(&new_sec_opts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) return ERR_PTR(error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) * Mount function which is called by VFS layer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) * In order to allow mounting a subvolume directly, btrfs uses mount_subtree()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) * which needs vfsmount* of device's root (/). This means device's root has to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) * be mounted internally in any case.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) * Operation flow:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) * 1. Parse subvol id related options for later use in mount_subvol().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) * 2. Mount device's root (/) by calling vfs_kern_mount().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) * NOTE: vfs_kern_mount() is used by VFS to call btrfs_mount() in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) * first place. In order to avoid calling btrfs_mount() again, we use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) * different file_system_type which is not registered to VFS by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) * register_filesystem() (btrfs_root_fs_type). As a result,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) * btrfs_mount_root() is called. The return value will be used by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) * mount_subtree() in mount_subvol().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) * 3. Call mount_subvol() to get the dentry of subvolume. Since there is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) * "btrfs subvolume set-default", mount_subvol() is called always.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) static struct dentry *btrfs_mount(struct file_system_type *fs_type, int flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) const char *device_name, void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) struct vfsmount *mnt_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) struct dentry *root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) char *subvol_name = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) u64 subvol_objectid = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) int error = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) error = btrfs_parse_subvol_options(data, &subvol_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) &subvol_objectid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) if (error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) kfree(subvol_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) return ERR_PTR(error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) /* mount device's root (/) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) mnt_root = vfs_kern_mount(&btrfs_root_fs_type, flags, device_name, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) if (PTR_ERR_OR_ZERO(mnt_root) == -EBUSY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) if (flags & SB_RDONLY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) mnt_root = vfs_kern_mount(&btrfs_root_fs_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) flags & ~SB_RDONLY, device_name, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) mnt_root = vfs_kern_mount(&btrfs_root_fs_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) flags | SB_RDONLY, device_name, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) if (IS_ERR(mnt_root)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) root = ERR_CAST(mnt_root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) kfree(subvol_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) down_write(&mnt_root->mnt_sb->s_umount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) error = btrfs_remount(mnt_root->mnt_sb, &flags, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) up_write(&mnt_root->mnt_sb->s_umount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) if (error < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) root = ERR_PTR(error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) mntput(mnt_root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) kfree(subvol_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) if (IS_ERR(mnt_root)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) root = ERR_CAST(mnt_root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) kfree(subvol_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) /* mount_subvol() will free subvol_name and mnt_root */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) root = mount_subvol(subvol_name, subvol_objectid, mnt_root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) return root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) static void btrfs_resize_thread_pool(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) u32 new_pool_size, u32 old_pool_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) if (new_pool_size == old_pool_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) fs_info->thread_pool_size = new_pool_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) btrfs_info(fs_info, "resize thread pool %d -> %d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) old_pool_size, new_pool_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) btrfs_workqueue_set_max(fs_info->workers, new_pool_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) btrfs_workqueue_set_max(fs_info->delalloc_workers, new_pool_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) btrfs_workqueue_set_max(fs_info->caching_workers, new_pool_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) btrfs_workqueue_set_max(fs_info->endio_workers, new_pool_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) btrfs_workqueue_set_max(fs_info->endio_meta_workers, new_pool_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) btrfs_workqueue_set_max(fs_info->endio_meta_write_workers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) new_pool_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) btrfs_workqueue_set_max(fs_info->endio_write_workers, new_pool_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) btrfs_workqueue_set_max(fs_info->endio_freespace_worker, new_pool_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) btrfs_workqueue_set_max(fs_info->delayed_workers, new_pool_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) btrfs_workqueue_set_max(fs_info->readahead_workers, new_pool_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) btrfs_workqueue_set_max(fs_info->scrub_wr_completion_workers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) new_pool_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) static inline void btrfs_remount_begin(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) unsigned long old_opts, int flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) if (btrfs_raw_test_opt(old_opts, AUTO_DEFRAG) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) (!btrfs_raw_test_opt(fs_info->mount_opt, AUTO_DEFRAG) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) (flags & SB_RDONLY))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) /* wait for any defraggers to finish */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) wait_event(fs_info->transaction_wait,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) (atomic_read(&fs_info->defrag_running) == 0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) if (flags & SB_RDONLY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) sync_filesystem(fs_info->sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) static inline void btrfs_remount_cleanup(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) unsigned long old_opts)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) * We need to cleanup all defragable inodes if the autodefragment is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) * close or the filesystem is read only.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) if (btrfs_raw_test_opt(old_opts, AUTO_DEFRAG) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) (!btrfs_raw_test_opt(fs_info->mount_opt, AUTO_DEFRAG) || sb_rdonly(fs_info->sb))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) btrfs_cleanup_defrag_inodes(fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) /* If we toggled discard async */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) if (!btrfs_raw_test_opt(old_opts, DISCARD_ASYNC) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) btrfs_test_opt(fs_info, DISCARD_ASYNC))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) btrfs_discard_resume(fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) else if (btrfs_raw_test_opt(old_opts, DISCARD_ASYNC) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) !btrfs_test_opt(fs_info, DISCARD_ASYNC))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) btrfs_discard_cleanup(fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) static int btrfs_remount(struct super_block *sb, int *flags, char *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) struct btrfs_fs_info *fs_info = btrfs_sb(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) struct btrfs_root *root = fs_info->tree_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) unsigned old_flags = sb->s_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) unsigned long old_opts = fs_info->mount_opt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) unsigned long old_compress_type = fs_info->compress_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) u64 old_max_inline = fs_info->max_inline;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) u32 old_thread_pool_size = fs_info->thread_pool_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) u32 old_metadata_ratio = fs_info->metadata_ratio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) sync_filesystem(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) set_bit(BTRFS_FS_STATE_REMOUNTING, &fs_info->fs_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) if (data) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) void *new_sec_opts = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) ret = security_sb_eat_lsm_opts(data, &new_sec_opts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) ret = security_sb_remount(sb, new_sec_opts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) security_free_mnt_opts(&new_sec_opts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) goto restore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) ret = btrfs_parse_options(fs_info, data, *flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) goto restore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) btrfs_remount_begin(fs_info, old_opts, *flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) btrfs_resize_thread_pool(fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) fs_info->thread_pool_size, old_thread_pool_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) if ((bool)(*flags & SB_RDONLY) == sb_rdonly(sb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) if (*flags & SB_RDONLY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) * this also happens on 'umount -rf' or on shutdown, when
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) * the filesystem is busy.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) cancel_work_sync(&fs_info->async_reclaim_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) cancel_work_sync(&fs_info->async_data_reclaim_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) btrfs_discard_cleanup(fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) /* wait for the uuid_scan task to finish */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) down(&fs_info->uuid_tree_rescan_sem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) /* avoid complains from lockdep et al. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) up(&fs_info->uuid_tree_rescan_sem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) sb->s_flags |= SB_RDONLY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) * Setting SB_RDONLY will put the cleaner thread to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) * sleep at the next loop if it's already active.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) * If it's already asleep, we'll leave unused block
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) * groups on disk until we're mounted read-write again
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) * unless we clean them up here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) btrfs_delete_unused_bgs(fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) btrfs_dev_replace_suspend_for_unmount(fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) btrfs_scrub_cancel(fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) btrfs_pause_balance(fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) * Pause the qgroup rescan worker if it is running. We don't want
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) * it to be still running after we are in RO mode, as after that,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) * by the time we unmount, it might have left a transaction open,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) * so we would leak the transaction and/or crash.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) btrfs_qgroup_wait_for_completion(fs_info, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) ret = btrfs_commit_super(fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) goto restore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) if (test_bit(BTRFS_FS_STATE_ERROR, &fs_info->fs_state)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) btrfs_err(fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) "Remounting read-write after error is not allowed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) goto restore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) if (fs_info->fs_devices->rw_devices == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) ret = -EACCES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) goto restore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) if (!btrfs_check_rw_degradable(fs_info, NULL)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) btrfs_warn(fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) "too many missing devices, writable remount is not allowed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) ret = -EACCES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) goto restore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) if (btrfs_super_log_root(fs_info->super_copy) != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) btrfs_warn(fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) "mount required to replay tree-log, cannot remount read-write");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) goto restore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) ret = btrfs_cleanup_fs_roots(fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) goto restore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) /* recover relocation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) mutex_lock(&fs_info->cleaner_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) ret = btrfs_recover_relocation(root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) mutex_unlock(&fs_info->cleaner_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) goto restore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) ret = btrfs_resume_balance_async(fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) goto restore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) ret = btrfs_resume_dev_replace_async(fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) btrfs_warn(fs_info, "failed to resume dev_replace");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) goto restore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) btrfs_qgroup_rescan_resume(fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) if (!fs_info->uuid_root) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) btrfs_info(fs_info, "creating UUID tree");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) ret = btrfs_create_uuid_tree(fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) btrfs_warn(fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) "failed to create the UUID tree %d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) goto restore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) sb->s_flags &= ~SB_RDONLY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) set_bit(BTRFS_FS_OPEN, &fs_info->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) * We need to set SB_I_VERSION here otherwise it'll get cleared by VFS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) * since the absence of the flag means it can be toggled off by remount.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) *flags |= SB_I_VERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) wake_up_process(fs_info->transaction_kthread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) btrfs_remount_cleanup(fs_info, old_opts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) clear_bit(BTRFS_FS_STATE_REMOUNTING, &fs_info->fs_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) restore:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) /* We've hit an error - don't reset SB_RDONLY */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) if (sb_rdonly(sb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) old_flags |= SB_RDONLY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) sb->s_flags = old_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) fs_info->mount_opt = old_opts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) fs_info->compress_type = old_compress_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) fs_info->max_inline = old_max_inline;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) btrfs_resize_thread_pool(fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) old_thread_pool_size, fs_info->thread_pool_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) fs_info->metadata_ratio = old_metadata_ratio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) btrfs_remount_cleanup(fs_info, old_opts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) clear_bit(BTRFS_FS_STATE_REMOUNTING, &fs_info->fs_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) /* Used to sort the devices by max_avail(descending sort) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) static inline int btrfs_cmp_device_free_bytes(const void *dev_info1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) const void *dev_info2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) if (((struct btrfs_device_info *)dev_info1)->max_avail >
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) ((struct btrfs_device_info *)dev_info2)->max_avail)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) else if (((struct btrfs_device_info *)dev_info1)->max_avail <
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) ((struct btrfs_device_info *)dev_info2)->max_avail)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) * sort the devices by max_avail, in which max free extent size of each device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) * is stored.(Descending Sort)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) static inline void btrfs_descending_sort_devices(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) struct btrfs_device_info *devices,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) size_t nr_devices)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) sort(devices, nr_devices, sizeof(struct btrfs_device_info),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) btrfs_cmp_device_free_bytes, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) * The helper to calc the free space on the devices that can be used to store
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) * file data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) static inline int btrfs_calc_avail_data_space(struct btrfs_fs_info *fs_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) u64 *free_bytes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) struct btrfs_device_info *devices_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) struct btrfs_fs_devices *fs_devices = fs_info->fs_devices;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) struct btrfs_device *device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) u64 type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) u64 avail_space;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) u64 min_stripe_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) int num_stripes = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) int i = 0, nr_devices;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) const struct btrfs_raid_attr *rattr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) * We aren't under the device list lock, so this is racy-ish, but good
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) * enough for our purposes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) nr_devices = fs_info->fs_devices->open_devices;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) if (!nr_devices) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051) smp_mb();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) nr_devices = fs_info->fs_devices->open_devices;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) ASSERT(nr_devices);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054) if (!nr_devices) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) *free_bytes = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) devices_info = kmalloc_array(nr_devices, sizeof(*devices_info),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) if (!devices_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) /* calc min stripe number for data space allocation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) type = btrfs_data_alloc_profile(fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) rattr = &btrfs_raid_array[btrfs_bg_flags_to_raid_index(type)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) if (type & BTRFS_BLOCK_GROUP_RAID0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) num_stripes = nr_devices;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) else if (type & BTRFS_BLOCK_GROUP_RAID1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) num_stripes = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) else if (type & BTRFS_BLOCK_GROUP_RAID1C3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074) num_stripes = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) else if (type & BTRFS_BLOCK_GROUP_RAID1C4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076) num_stripes = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077) else if (type & BTRFS_BLOCK_GROUP_RAID10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078) num_stripes = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) /* Adjust for more than 1 stripe per device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) min_stripe_size = rattr->dev_stripes * BTRFS_STRIPE_LEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) list_for_each_entry_rcu(device, &fs_devices->devices, dev_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) if (!test_bit(BTRFS_DEV_STATE_IN_FS_METADATA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086) &device->dev_state) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) !device->bdev ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088) test_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) if (i >= nr_devices)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094) avail_space = device->total_bytes - device->bytes_used;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) /* align with stripe_len */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) avail_space = rounddown(avail_space, BTRFS_STRIPE_LEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) * In order to avoid overwriting the superblock on the drive,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) * btrfs starts at an offset of at least 1MB when doing chunk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) * allocation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) * This ensures we have at least min_stripe_size free space
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) * after excluding 1MB.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107) if (avail_space <= SZ_1M + min_stripe_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) avail_space -= SZ_1M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) devices_info[i].dev = device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) devices_info[i].max_avail = avail_space;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) i++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117) rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) nr_devices = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121) btrfs_descending_sort_devices(devices_info, nr_devices);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123) i = nr_devices - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) avail_space = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) while (nr_devices >= rattr->devs_min) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) num_stripes = min(num_stripes, nr_devices);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128) if (devices_info[i].max_avail >= min_stripe_size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129) int j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130) u64 alloc_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) avail_space += devices_info[i].max_avail * num_stripes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133) alloc_size = devices_info[i].max_avail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) for (j = i + 1 - num_stripes; j <= i; j++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) devices_info[j].max_avail -= alloc_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137) i--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) nr_devices--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) kfree(devices_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142) *free_bytes = avail_space;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) * Calculate numbers for 'df', pessimistic in case of mixed raid profiles.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) * If there's a redundant raid level at DATA block groups, use the respective
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) * multiplier to scale the sizes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152) * Unused device space usage is based on simulating the chunk allocator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) * algorithm that respects the device sizes and order of allocations. This is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154) * a close approximation of the actual use but there are other factors that may
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) * change the result (like a new metadata chunk).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) * If metadata is exhausted, f_bavail will be 0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161) struct btrfs_fs_info *fs_info = btrfs_sb(dentry->d_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) struct btrfs_super_block *disk_super = fs_info->super_copy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) struct btrfs_space_info *found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164) u64 total_used = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) u64 total_free_data = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) u64 total_free_meta = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) int bits = dentry->d_sb->s_blocksize_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) __be32 *fsid = (__be32 *)fs_info->fs_devices->fsid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169) unsigned factor = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170) struct btrfs_block_rsv *block_rsv = &fs_info->global_block_rsv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172) u64 thresh = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173) int mixed = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) list_for_each_entry(found, &fs_info->space_info, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) if (found->flags & BTRFS_BLOCK_GROUP_DATA) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179) total_free_data += found->disk_total - found->disk_used;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) total_free_data -=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) btrfs_account_ro_block_groups_free_space(found);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) for (i = 0; i < BTRFS_NR_RAID_TYPES; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) if (!list_empty(&found->block_groups[i]))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185) factor = btrfs_bg_type_to_factor(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186) btrfs_raid_array[i].bg_flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191) * Metadata in mixed block goup profiles are accounted in data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193) if (!mixed && found->flags & BTRFS_BLOCK_GROUP_METADATA) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) if (found->flags & BTRFS_BLOCK_GROUP_DATA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) mixed = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) total_free_meta += found->disk_total -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198) found->disk_used;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201) total_used += found->disk_used;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204) buf->f_blocks = div_u64(btrfs_super_total_bytes(disk_super), factor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205) buf->f_blocks >>= bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206) buf->f_bfree = buf->f_blocks - (div_u64(total_used, factor) >> bits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) /* Account global block reserve as used, it's in logical size already */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209) spin_lock(&block_rsv->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) /* Mixed block groups accounting is not byte-accurate, avoid overflow */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211) if (buf->f_bfree >= block_rsv->size >> bits)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) buf->f_bfree -= block_rsv->size >> bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214) buf->f_bfree = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215) spin_unlock(&block_rsv->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) buf->f_bavail = div_u64(total_free_data, factor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) ret = btrfs_calc_avail_data_space(fs_info, &total_free_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) buf->f_bavail += div_u64(total_free_data, factor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222) buf->f_bavail = buf->f_bavail >> bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225) * We calculate the remaining metadata space minus global reserve. If
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226) * this is (supposedly) smaller than zero, there's no space. But this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227) * does not hold in practice, the exhausted state happens where's still
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228) * some positive delta. So we apply some guesswork and compare the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229) * delta to a 4M threshold. (Practically observed delta was ~2M.)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) * We probably cannot calculate the exact threshold value because this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) * depends on the internal reservations requested by various
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233) * operations, so some operations that consume a few metadata will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) * succeed even if the Avail is zero. But this is better than the other
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) * way around.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237) thresh = SZ_4M;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) * We only want to claim there's no available space if we can no longer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) * allocate chunks for our metadata profile and our global reserve will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) * not fit in the free metadata space. If we aren't ->full then we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243) * still can allocate chunks and thus are fine using the currently
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) * calculated f_bavail.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246) if (!mixed && block_rsv->space_info->full &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) total_free_meta - thresh < block_rsv->size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248) buf->f_bavail = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250) buf->f_type = BTRFS_SUPER_MAGIC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251) buf->f_bsize = dentry->d_sb->s_blocksize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252) buf->f_namelen = BTRFS_NAME_LEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254) /* We treat it as constant endianness (it doesn't matter _which_)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) because we want the fsid to come out the same whether mounted
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) on a big-endian or little-endian host */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257) buf->f_fsid.val[0] = be32_to_cpu(fsid[0]) ^ be32_to_cpu(fsid[2]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) buf->f_fsid.val[1] = be32_to_cpu(fsid[1]) ^ be32_to_cpu(fsid[3]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259) /* Mask in the root object ID too, to disambiguate subvols */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) buf->f_fsid.val[0] ^=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261) BTRFS_I(d_inode(dentry))->root->root_key.objectid >> 32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) buf->f_fsid.val[1] ^=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) BTRFS_I(d_inode(dentry))->root->root_key.objectid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268) static void btrfs_kill_super(struct super_block *sb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) struct btrfs_fs_info *fs_info = btrfs_sb(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) kill_anon_super(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272) btrfs_free_fs_info(fs_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) static struct file_system_type btrfs_fs_type = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) .name = "btrfs",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278) .mount = btrfs_mount,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) .kill_sb = btrfs_kill_super,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280) .fs_flags = FS_REQUIRES_DEV | FS_BINARY_MOUNTDATA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) static struct file_system_type btrfs_root_fs_type = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) .name = "btrfs",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286) .mount = btrfs_mount_root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287) .kill_sb = btrfs_kill_super,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) .fs_flags = FS_REQUIRES_DEV | FS_BINARY_MOUNTDATA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) MODULE_ALIAS_FS("btrfs");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) static int btrfs_control_open(struct inode *inode, struct file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) * The control file's private_data is used to hold the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) * transaction when it is started and is used to keep
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298) * track of whether a transaction is already in progress.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) file->private_data = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305) * Used by /dev/btrfs-control for devices ioctls.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) static long btrfs_control_ioctl(struct file *file, unsigned int cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) unsigned long arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) struct btrfs_ioctl_vol_args *vol;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311) struct btrfs_device *device = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312) int ret = -ENOTTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314) if (!capable(CAP_SYS_ADMIN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315) return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317) vol = memdup_user((void __user *)arg, sizeof(*vol));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318) if (IS_ERR(vol))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) return PTR_ERR(vol);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320) vol->name[BTRFS_PATH_NAME_MAX] = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323) case BTRFS_IOC_SCAN_DEV:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324) mutex_lock(&uuid_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325) device = btrfs_scan_one_device(vol->name, FMODE_READ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) &btrfs_root_fs_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327) ret = PTR_ERR_OR_ZERO(device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328) mutex_unlock(&uuid_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330) case BTRFS_IOC_FORGET_DEV:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331) ret = btrfs_forget_devices(vol->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) case BTRFS_IOC_DEVICES_READY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) mutex_lock(&uuid_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335) device = btrfs_scan_one_device(vol->name, FMODE_READ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336) &btrfs_root_fs_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337) if (IS_ERR(device)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338) mutex_unlock(&uuid_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339) ret = PTR_ERR(device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342) ret = !(device->fs_devices->num_devices ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) device->fs_devices->total_devices);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344) mutex_unlock(&uuid_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) case BTRFS_IOC_GET_SUPPORTED_FEATURES:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347) ret = btrfs_ioctl_get_supported_features((void __user*)arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351) kfree(vol);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355) static int btrfs_freeze(struct super_block *sb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357) struct btrfs_trans_handle *trans;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358) struct btrfs_fs_info *fs_info = btrfs_sb(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359) struct btrfs_root *root = fs_info->tree_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361) set_bit(BTRFS_FS_FROZEN, &fs_info->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363) * We don't need a barrier here, we'll wait for any transaction that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364) * could be in progress on other threads (and do delayed iputs that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365) * we want to avoid on a frozen filesystem), or do the commit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366) * ourselves.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368) trans = btrfs_attach_transaction_barrier(root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369) if (IS_ERR(trans)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370) /* no transaction, don't bother */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371) if (PTR_ERR(trans) == -ENOENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373) return PTR_ERR(trans);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375) return btrfs_commit_transaction(trans);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378) static int btrfs_unfreeze(struct super_block *sb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380) struct btrfs_fs_info *fs_info = btrfs_sb(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382) clear_bit(BTRFS_FS_FROZEN, &fs_info->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386) static int btrfs_show_devname(struct seq_file *m, struct dentry *root)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388) struct btrfs_fs_info *fs_info = btrfs_sb(root->d_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389) struct btrfs_device *dev, *first_dev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2390)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2391) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2392) * Lightweight locking of the devices. We should not need
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2393) * device_list_mutex here as we only read the device data and the list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2394) * is protected by RCU. Even if a device is deleted during the list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2395) * traversals, we'll get valid data, the freeing callback will wait at
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2396) * least until the rcu_read_unlock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2397) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2398) rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2399) list_for_each_entry_rcu(dev, &fs_info->fs_devices->devices, dev_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2400) if (test_bit(BTRFS_DEV_STATE_MISSING, &dev->dev_state))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2401) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2402) if (!dev->name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2403) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2404) if (!first_dev || dev->devid < first_dev->devid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2405) first_dev = dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2406) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2407)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2408) if (first_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2409) seq_escape(m, rcu_str_deref(first_dev->name), " \t\n\\");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2410) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2411) WARN_ON(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2412) rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2413) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2414) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2415)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2416) static const struct super_operations btrfs_super_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2417) .drop_inode = btrfs_drop_inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2418) .evict_inode = btrfs_evict_inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2419) .put_super = btrfs_put_super,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2420) .sync_fs = btrfs_sync_fs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2421) .show_options = btrfs_show_options,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2422) .show_devname = btrfs_show_devname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2423) .alloc_inode = btrfs_alloc_inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2424) .destroy_inode = btrfs_destroy_inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2425) .free_inode = btrfs_free_inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2426) .statfs = btrfs_statfs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2427) .remount_fs = btrfs_remount,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2428) .freeze_fs = btrfs_freeze,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2429) .unfreeze_fs = btrfs_unfreeze,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2430) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2432) static const struct file_operations btrfs_ctl_fops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2433) .open = btrfs_control_open,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2434) .unlocked_ioctl = btrfs_control_ioctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2435) .compat_ioctl = compat_ptr_ioctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2436) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2437) .llseek = noop_llseek,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2438) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2439)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2440) static struct miscdevice btrfs_misc = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2441) .minor = BTRFS_MINOR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2442) .name = "btrfs-control",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2443) .fops = &btrfs_ctl_fops
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2444) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2445)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2446) MODULE_ALIAS_MISCDEV(BTRFS_MINOR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2447) MODULE_ALIAS("devname:btrfs-control");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2448)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2449) static int __init btrfs_interface_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2450) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2451) return misc_register(&btrfs_misc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2452) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2454) static __cold void btrfs_interface_exit(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2455) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2456) misc_deregister(&btrfs_misc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2457) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2458)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2459) static void __init btrfs_print_mod_info(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2460) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2461) static const char options[] = ""
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2462) #ifdef CONFIG_BTRFS_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2463) ", debug=on"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2464) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2465) #ifdef CONFIG_BTRFS_ASSERT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2466) ", assert=on"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2467) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2468) #ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2469) ", integrity-checker=on"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2470) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2471) #ifdef CONFIG_BTRFS_FS_REF_VERIFY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2472) ", ref-verify=on"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2473) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2474) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2475) pr_info("Btrfs loaded, crc32c=%s%s\n", crc32c_impl(), options);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2476) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2477)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2478) static int __init init_btrfs_fs(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2479) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2480) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2482) btrfs_props_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2483)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2484) err = btrfs_init_sysfs();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2485) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2486) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2488) btrfs_init_compress();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2489)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2490) err = btrfs_init_cachep();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2491) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2492) goto free_compress;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2493)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2494) err = extent_io_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2495) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2496) goto free_cachep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2497)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2498) err = extent_state_cache_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2499) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2500) goto free_extent_io;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2501)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2502) err = extent_map_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2503) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2504) goto free_extent_state_cache;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2506) err = ordered_data_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2507) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2508) goto free_extent_map;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2509)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2510) err = btrfs_delayed_inode_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2511) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2512) goto free_ordered_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2513)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2514) err = btrfs_auto_defrag_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2515) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2516) goto free_delayed_inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2517)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2518) err = btrfs_delayed_ref_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2519) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2520) goto free_auto_defrag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2521)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2522) err = btrfs_prelim_ref_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2523) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2524) goto free_delayed_ref;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2526) err = btrfs_end_io_wq_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2527) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2528) goto free_prelim_ref;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2529)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2530) err = btrfs_interface_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2531) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2532) goto free_end_io_wq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2533)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2534) btrfs_init_lockdep();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2536) btrfs_print_mod_info();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2537)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2538) err = btrfs_run_sanity_tests();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2539) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2540) goto unregister_ioctl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2542) err = register_filesystem(&btrfs_fs_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2543) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2544) goto unregister_ioctl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2545)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2546) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2547)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2548) unregister_ioctl:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2549) btrfs_interface_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2550) free_end_io_wq:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2551) btrfs_end_io_wq_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2552) free_prelim_ref:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2553) btrfs_prelim_ref_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2554) free_delayed_ref:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2555) btrfs_delayed_ref_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2556) free_auto_defrag:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2557) btrfs_auto_defrag_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2558) free_delayed_inode:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2559) btrfs_delayed_inode_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2560) free_ordered_data:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2561) ordered_data_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2562) free_extent_map:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2563) extent_map_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2564) free_extent_state_cache:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2565) extent_state_cache_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2566) free_extent_io:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2567) extent_io_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2568) free_cachep:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2569) btrfs_destroy_cachep();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2570) free_compress:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2571) btrfs_exit_compress();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2572) btrfs_exit_sysfs();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2573)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2574) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2575) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2577) static void __exit exit_btrfs_fs(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2578) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2579) btrfs_destroy_cachep();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2580) btrfs_delayed_ref_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2581) btrfs_auto_defrag_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2582) btrfs_delayed_inode_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2583) btrfs_prelim_ref_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2584) ordered_data_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2585) extent_map_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2586) extent_state_cache_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2587) extent_io_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2588) btrfs_interface_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2589) btrfs_end_io_wq_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2590) unregister_filesystem(&btrfs_fs_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2591) btrfs_exit_sysfs();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2592) btrfs_cleanup_fs_uuids();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2593) btrfs_exit_compress();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2594) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2595)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2596) late_initcall(init_btrfs_fs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2597) module_exit(exit_btrfs_fs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2598)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2599) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2600) MODULE_IMPORT_NS(ANDROID_GKI_VFS_EXPORT_ONLY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2601) MODULE_SOFTDEP("pre: crc32c");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2602) MODULE_SOFTDEP("pre: xxhash64");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2603) MODULE_SOFTDEP("pre: sha256");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2604) MODULE_SOFTDEP("pre: blake2b-256");