Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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");