File: | build-scan/../src/partition/growfs.c |
Warning: | line 253, column 19 Null pointer passed to 1st parameter expecting 'nonnull' |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | /* SPDX-License-Identifier: LGPL-2.1+ */ | |||
2 | ||||
3 | #include <errno(*__errno_location ()).h> | |||
4 | #include <fcntl.h> | |||
5 | #include <getopt.h> | |||
6 | #include <linux1/magic.h> | |||
7 | #include <sys/ioctl.h> | |||
8 | #include <sys/mount.h> | |||
9 | #include <sys/stat.h> | |||
10 | #include <sys/types.h> | |||
11 | #include <sys/vfs.h> | |||
12 | ||||
13 | #include "blockdev-util.h" | |||
14 | #include "crypt-util.h" | |||
15 | #include "device-nodes.h" | |||
16 | #include "dissect-image.h" | |||
17 | #include "escape.h" | |||
18 | #include "fd-util.h" | |||
19 | #include "format-util.h" | |||
20 | #include "log.h" | |||
21 | #include "missing.h" | |||
22 | #include "mount-util.h" | |||
23 | #include "parse-util.h" | |||
24 | #include "path-util.h" | |||
25 | #include "strv.h" | |||
26 | ||||
27 | const char *arg_target = NULL((void*)0); | |||
28 | bool_Bool arg_dry_run = false0; | |||
29 | ||||
30 | static int resize_ext4(const char *path, int mountfd, int devfd, uint64_t numblocks, uint64_t blocksize) { | |||
31 | assert((uint64_t) (int) blocksize == blocksize)do { if ((__builtin_expect(!!(!((uint64_t) (int) blocksize == blocksize)),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ( "(uint64_t) (int) blocksize == blocksize"), "../src/partition/growfs.c" , 31, __PRETTY_FUNCTION__); } while (0); | |||
32 | ||||
33 | if (arg_dry_run) | |||
34 | return 0; | |||
35 | ||||
36 | if (ioctl(mountfd, EXT4_IOC_RESIZE_FS(((1U) << (((0 +8)+8)+14)) | ((('f')) << (0 +8)) | (((16)) << 0) | ((((sizeof(__u64)))) << ((0 +8)+ 8))), &numblocks) != 0) | |||
37 | return log_error_errno(errno, "Failed to resize \"%s\" to %"PRIu64" blocks (ext4): %m",({ int _level = ((3)), _e = (((*__errno_location ()))), _realm = (LOG_REALM_SYSTEMD); (log_get_max_level_realm(_realm) >= ((_level) & 0x07)) ? log_internal_realm(((_realm) << 10 | (_level)), _e, "../src/partition/growfs.c", 38, __func__ , "Failed to resize \"%s\" to %""l" "u"" blocks (ext4): %m", path , numblocks) : -abs(_e); }) | |||
38 | path, numblocks)({ int _level = ((3)), _e = (((*__errno_location ()))), _realm = (LOG_REALM_SYSTEMD); (log_get_max_level_realm(_realm) >= ((_level) & 0x07)) ? log_internal_realm(((_realm) << 10 | (_level)), _e, "../src/partition/growfs.c", 38, __func__ , "Failed to resize \"%s\" to %""l" "u"" blocks (ext4): %m", path , numblocks) : -abs(_e); }); | |||
39 | ||||
40 | return 0; | |||
41 | } | |||
42 | ||||
43 | static int resize_btrfs(const char *path, int mountfd, int devfd, uint64_t numblocks, uint64_t blocksize) { | |||
44 | struct btrfs_ioctl_vol_args args = {}; | |||
45 | int r; | |||
46 | ||||
47 | assert((uint64_t) (int) blocksize == blocksize)do { if ((__builtin_expect(!!(!((uint64_t) (int) blocksize == blocksize)),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ( "(uint64_t) (int) blocksize == blocksize"), "../src/partition/growfs.c" , 47, __PRETTY_FUNCTION__); } while (0); | |||
48 | ||||
49 | /* https://bugzilla.kernel.org/show_bug.cgi?id=118111 */ | |||
50 | if (numblocks * blocksize < 256*1024*1024) { | |||
51 | log_warning("%s: resizing of btrfs volumes smaller than 256M is not supported", path)({ int _level = (((4))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/partition/growfs.c", 51, __func__, "%s: resizing of btrfs volumes smaller than 256M is not supported" , path) : -abs(_e); }); | |||
52 | return -EOPNOTSUPP95; | |||
53 | } | |||
54 | ||||
55 | r = snprintf(args.name, sizeof(args.name), "%"PRIu64"l" "u", numblocks * blocksize); | |||
56 | /* The buffer is large enough for any number to fit... */ | |||
57 | assert((size_t) r < sizeof(args.name))do { if ((__builtin_expect(!!(!((size_t) r < sizeof(args.name ))),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("(size_t) r < sizeof(args.name)" ), "../src/partition/growfs.c", 57, __PRETTY_FUNCTION__); } while (0); | |||
58 | ||||
59 | if (arg_dry_run) | |||
60 | return 0; | |||
61 | ||||
62 | if (ioctl(mountfd, BTRFS_IOC_RESIZE(((1U) << (((0 +8)+8)+14)) | (((0x94)) << (0 +8)) | (((3)) << 0) | ((((sizeof(struct btrfs_ioctl_vol_args )))) << ((0 +8)+8))), &args) != 0) | |||
63 | return log_error_errno(errno, "Failed to resize \"%s\" to %"PRIu64" blocks (btrfs): %m",({ int _level = ((3)), _e = (((*__errno_location ()))), _realm = (LOG_REALM_SYSTEMD); (log_get_max_level_realm(_realm) >= ((_level) & 0x07)) ? log_internal_realm(((_realm) << 10 | (_level)), _e, "../src/partition/growfs.c", 64, __func__ , "Failed to resize \"%s\" to %""l" "u"" blocks (btrfs): %m", path, numblocks) : -abs(_e); }) | |||
64 | path, numblocks)({ int _level = ((3)), _e = (((*__errno_location ()))), _realm = (LOG_REALM_SYSTEMD); (log_get_max_level_realm(_realm) >= ((_level) & 0x07)) ? log_internal_realm(((_realm) << 10 | (_level)), _e, "../src/partition/growfs.c", 64, __func__ , "Failed to resize \"%s\" to %""l" "u"" blocks (btrfs): %m", path, numblocks) : -abs(_e); }); | |||
65 | ||||
66 | return 0; | |||
67 | } | |||
68 | ||||
69 | #if HAVE_LIBCRYPTSETUP1 | |||
70 | static int resize_crypt_luks_device(dev_t devno, const char *fstype, dev_t main_devno) { | |||
71 | char devpath[DEV_NUM_PATH_MAX((sizeof("""/dev/block/""") - 1) + (2+(sizeof(dev_t) <= 1 ? 3 : sizeof(dev_t) <= 2 ? 5 : sizeof(dev_t) <= 4 ? 10 : sizeof(dev_t) <= 8 ? 20 : sizeof(int[-2*(sizeof(dev_t) > 8)]))) + 1 + (2+(sizeof(dev_t) <= 1 ? 3 : sizeof(dev_t) <= 2 ? 5 : sizeof(dev_t) <= 4 ? 10 : sizeof(dev_t) <= 8 ? 20 : sizeof(int[-2*(sizeof(dev_t) > 8)]))))], main_devpath[DEV_NUM_PATH_MAX((sizeof("""/dev/block/""") - 1) + (2+(sizeof(dev_t) <= 1 ? 3 : sizeof(dev_t) <= 2 ? 5 : sizeof(dev_t) <= 4 ? 10 : sizeof(dev_t) <= 8 ? 20 : sizeof(int[-2*(sizeof(dev_t) > 8)]))) + 1 + (2+(sizeof(dev_t) <= 1 ? 3 : sizeof(dev_t) <= 2 ? 5 : sizeof(dev_t) <= 4 ? 10 : sizeof(dev_t) <= 8 ? 20 : sizeof(int[-2*(sizeof(dev_t) > 8)]))))]; | |||
72 | _cleanup_close___attribute__((cleanup(closep))) int main_devfd = -1; | |||
73 | _cleanup_(crypt_freep)__attribute__((cleanup(crypt_freep))) struct crypt_device *cd = NULL((void*)0); | |||
74 | uint64_t size; | |||
75 | int r; | |||
76 | ||||
77 | xsprintf_dev_num_path(main_devpath, "block", main_devno)do { if ((__builtin_expect(!!(!(((size_t) snprintf(main_devpath , __extension__ (__builtin_choose_expr( !__builtin_types_compatible_p (typeof(main_devpath), typeof(&*(main_devpath))), sizeof( main_devpath)/sizeof((main_devpath)[0]), ((void)0))), "/dev/%s/%u:%u" , "block", gnu_dev_major (main_devno), gnu_dev_minor (main_devno )) < (__extension__ (__builtin_choose_expr( !__builtin_types_compatible_p (typeof(main_devpath), typeof(&*(main_devpath))), sizeof( main_devpath)/sizeof((main_devpath)[0]), ((void)0))))))),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("xsprintf: " "main_devpath" "[] must be big enough"), "../src/partition/growfs.c", 77, __PRETTY_FUNCTION__ ); } while (0); | |||
78 | main_devfd = open(main_devpath, O_RDONLY00|O_CLOEXEC02000000); | |||
79 | if (main_devfd < 0) | |||
80 | return log_error_errno(errno, "Failed to open \"%s\": %m", main_devpath)({ int _level = ((3)), _e = (((*__errno_location ()))), _realm = (LOG_REALM_SYSTEMD); (log_get_max_level_realm(_realm) >= ((_level) & 0x07)) ? log_internal_realm(((_realm) << 10 | (_level)), _e, "../src/partition/growfs.c", 80, __func__ , "Failed to open \"%s\": %m", main_devpath) : -abs(_e); }); | |||
81 | ||||
82 | if (ioctl(main_devfd, BLKGETSIZE64(((2U) << (((0 +8)+8)+14)) | (((0x12)) << (0 +8)) | (((114)) << 0) | ((((sizeof(size_t)))) << ((0 + 8)+8))), &size) != 0) | |||
83 | return log_error_errno(errno, "Failed to query size of \"%s\" (before resize): %m",({ int _level = ((3)), _e = (((*__errno_location ()))), _realm = (LOG_REALM_SYSTEMD); (log_get_max_level_realm(_realm) >= ((_level) & 0x07)) ? log_internal_realm(((_realm) << 10 | (_level)), _e, "../src/partition/growfs.c", 84, __func__ , "Failed to query size of \"%s\" (before resize): %m", main_devpath ) : -abs(_e); }) | |||
84 | main_devpath)({ int _level = ((3)), _e = (((*__errno_location ()))), _realm = (LOG_REALM_SYSTEMD); (log_get_max_level_realm(_realm) >= ((_level) & 0x07)) ? log_internal_realm(((_realm) << 10 | (_level)), _e, "../src/partition/growfs.c", 84, __func__ , "Failed to query size of \"%s\" (before resize): %m", main_devpath ) : -abs(_e); }); | |||
85 | ||||
86 | log_debug("%s is %"PRIu64" bytes", main_devpath, size)({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/partition/growfs.c", 86, __func__, "%s is %""l" "u" " bytes", main_devpath, size) : -abs(_e); }); | |||
87 | ||||
88 | xsprintf_dev_num_path(devpath, "block", devno)do { if ((__builtin_expect(!!(!(((size_t) snprintf(devpath, __extension__ (__builtin_choose_expr( !__builtin_types_compatible_p(typeof (devpath), typeof(&*(devpath))), sizeof(devpath)/sizeof(( devpath)[0]), ((void)0))), "/dev/%s/%u:%u", "block", gnu_dev_major (devno), gnu_dev_minor (devno)) < (__extension__ (__builtin_choose_expr ( !__builtin_types_compatible_p(typeof(devpath), typeof(& *(devpath))), sizeof(devpath)/sizeof((devpath)[0]), ((void)0) )))))),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("xsprintf: " "devpath" "[] must be big enough"), "../src/partition/growfs.c" , 88, __PRETTY_FUNCTION__); } while (0); | |||
89 | r = crypt_init(&cd, devpath); | |||
90 | if (r < 0) | |||
91 | return log_error_errno(r, "crypt_init(\"%s\") failed: %m", devpath)({ int _level = ((3)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/partition/growfs.c", 91, __func__, "crypt_init(\"%s\") failed: %m" , devpath) : -abs(_e); }); | |||
92 | ||||
93 | crypt_set_log_callback(cd, cryptsetup_log_glue, NULL((void*)0)); | |||
94 | ||||
95 | r = crypt_load(cd, CRYPT_LUKS((void*)0), NULL((void*)0)); | |||
96 | if (r < 0) | |||
97 | return log_debug_errno(r, "Failed to load LUKS metadata for %s: %m", devpath)({ int _level = ((7)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/partition/growfs.c", 97, __func__, "Failed to load LUKS metadata for %s: %m" , devpath) : -abs(_e); }); | |||
98 | ||||
99 | if (arg_dry_run) | |||
100 | return 0; | |||
101 | ||||
102 | r = crypt_resize(cd, main_devpath, 0); | |||
103 | if (r < 0) | |||
104 | return log_error_errno(r, "crypt_resize() of %s failed: %m", devpath)({ int _level = ((3)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/partition/growfs.c", 104, __func__, "crypt_resize() of %s failed: %m" , devpath) : -abs(_e); }); | |||
105 | ||||
106 | if (ioctl(main_devfd, BLKGETSIZE64(((2U) << (((0 +8)+8)+14)) | (((0x12)) << (0 +8)) | (((114)) << 0) | ((((sizeof(size_t)))) << ((0 + 8)+8))), &size) != 0) | |||
107 | log_warning_errno(errno, "Failed to query size of \"%s\" (after resize): %m",({ int _level = ((4)), _e = (((*__errno_location ()))), _realm = (LOG_REALM_SYSTEMD); (log_get_max_level_realm(_realm) >= ((_level) & 0x07)) ? log_internal_realm(((_realm) << 10 | (_level)), _e, "../src/partition/growfs.c", 108, __func__ , "Failed to query size of \"%s\" (after resize): %m", devpath ) : -abs(_e); }) | |||
108 | devpath)({ int _level = ((4)), _e = (((*__errno_location ()))), _realm = (LOG_REALM_SYSTEMD); (log_get_max_level_realm(_realm) >= ((_level) & 0x07)) ? log_internal_realm(((_realm) << 10 | (_level)), _e, "../src/partition/growfs.c", 108, __func__ , "Failed to query size of \"%s\" (after resize): %m", devpath ) : -abs(_e); }); | |||
109 | else | |||
110 | log_debug("%s is now %"PRIu64" bytes", main_devpath, size)({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/partition/growfs.c", 110, __func__, "%s is now %""l" "u"" bytes", main_devpath, size) : -abs(_e); }); | |||
111 | ||||
112 | return 1; | |||
113 | } | |||
114 | #endif | |||
115 | ||||
116 | static int maybe_resize_slave_device(const char *mountpath, dev_t main_devno) { | |||
117 | dev_t devno; | |||
118 | char devpath[DEV_NUM_PATH_MAX((sizeof("""/dev/block/""") - 1) + (2+(sizeof(dev_t) <= 1 ? 3 : sizeof(dev_t) <= 2 ? 5 : sizeof(dev_t) <= 4 ? 10 : sizeof(dev_t) <= 8 ? 20 : sizeof(int[-2*(sizeof(dev_t) > 8)]))) + 1 + (2+(sizeof(dev_t) <= 1 ? 3 : sizeof(dev_t) <= 2 ? 5 : sizeof(dev_t) <= 4 ? 10 : sizeof(dev_t) <= 8 ? 20 : sizeof(int[-2*(sizeof(dev_t) > 8)]))))]; | |||
119 | _cleanup_free___attribute__((cleanup(freep))) char *fstype = NULL((void*)0); | |||
120 | int r; | |||
121 | ||||
122 | #if HAVE_LIBCRYPTSETUP1 | |||
123 | crypt_set_log_callback(NULL((void*)0), cryptsetup_log_glue, NULL((void*)0)); | |||
124 | crypt_set_debug_level(1); | |||
125 | #endif | |||
126 | ||||
127 | r = get_block_device_harder(mountpath, &devno); | |||
128 | if (r < 0) | |||
129 | return log_error_errno(r, "Failed to determine underlying block device of \"%s\": %m",({ int _level = ((3)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/partition/growfs.c", 130, __func__, "Failed to determine underlying block device of \"%s\": %m" , mountpath) : -abs(_e); }) | |||
130 | mountpath)({ int _level = ((3)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/partition/growfs.c", 130, __func__, "Failed to determine underlying block device of \"%s\": %m" , mountpath) : -abs(_e); }); | |||
131 | ||||
132 | log_debug("Underlying device %d:%d, main dev %d:%d, %s",({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/partition/growfs.c", 135, __func__, "Underlying device %d:%d, main dev %d:%d, %s" , gnu_dev_major (devno), gnu_dev_minor (devno), gnu_dev_major (main_devno), gnu_dev_minor (main_devno), devno == main_devno ? "same" : "different") : -abs(_e); }) | |||
133 | major(devno), minor(devno),({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/partition/growfs.c", 135, __func__, "Underlying device %d:%d, main dev %d:%d, %s" , gnu_dev_major (devno), gnu_dev_minor (devno), gnu_dev_major (main_devno), gnu_dev_minor (main_devno), devno == main_devno ? "same" : "different") : -abs(_e); }) | |||
134 | major(main_devno), minor(main_devno),({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/partition/growfs.c", 135, __func__, "Underlying device %d:%d, main dev %d:%d, %s" , gnu_dev_major (devno), gnu_dev_minor (devno), gnu_dev_major (main_devno), gnu_dev_minor (main_devno), devno == main_devno ? "same" : "different") : -abs(_e); }) | |||
135 | devno == main_devno ? "same" : "different")({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/partition/growfs.c", 135, __func__, "Underlying device %d:%d, main dev %d:%d, %s" , gnu_dev_major (devno), gnu_dev_minor (devno), gnu_dev_major (main_devno), gnu_dev_minor (main_devno), devno == main_devno ? "same" : "different") : -abs(_e); }); | |||
136 | if (devno == main_devno) | |||
137 | return 0; | |||
138 | ||||
139 | xsprintf_dev_num_path(devpath, "block", devno)do { if ((__builtin_expect(!!(!(((size_t) snprintf(devpath, __extension__ (__builtin_choose_expr( !__builtin_types_compatible_p(typeof (devpath), typeof(&*(devpath))), sizeof(devpath)/sizeof(( devpath)[0]), ((void)0))), "/dev/%s/%u:%u", "block", gnu_dev_major (devno), gnu_dev_minor (devno)) < (__extension__ (__builtin_choose_expr ( !__builtin_types_compatible_p(typeof(devpath), typeof(& *(devpath))), sizeof(devpath)/sizeof((devpath)[0]), ((void)0) )))))),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("xsprintf: " "devpath" "[] must be big enough"), "../src/partition/growfs.c" , 139, __PRETTY_FUNCTION__); } while (0); | |||
140 | r = probe_filesystem(devpath, &fstype); | |||
141 | if (r == -EUCLEAN117) | |||
142 | return log_warning_errno(r, "Cannot reliably determine probe \"%s\", refusing to proceed.", devpath)({ int _level = ((4)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/partition/growfs.c", 142, __func__, "Cannot reliably determine probe \"%s\", refusing to proceed." , devpath) : -abs(_e); }); | |||
143 | if (r < 0) | |||
144 | return log_warning_errno(r, "Failed to probe \"%s\": %m", devpath)({ int _level = ((4)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/partition/growfs.c", 144, __func__, "Failed to probe \"%s\": %m" , devpath) : -abs(_e); }); | |||
145 | ||||
146 | #if HAVE_LIBCRYPTSETUP1 | |||
147 | if (streq_ptr(fstype, "crypto_LUKS")) | |||
148 | return resize_crypt_luks_device(devno, fstype, main_devno); | |||
149 | #endif | |||
150 | ||||
151 | log_debug("Don't know how to resize %s of type %s, ignoring", devpath, strnull(fstype))({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/partition/growfs.c", 151, __func__, "Don't know how to resize %s of type %s, ignoring" , devpath, strnull(fstype)) : -abs(_e); }); | |||
152 | return 0; | |||
153 | } | |||
154 | ||||
155 | static void help(void) { | |||
156 | printf("%s [OPTIONS...] /path/to/mountpoint\n\n" | |||
157 | "Grow filesystem or encrypted payload to device size.\n\n" | |||
158 | "Options:\n" | |||
159 | " -h --help Show this help and exit\n" | |||
160 | " --version Print version string and exit\n" | |||
161 | " -n --dry-run Just print what would be done\n" | |||
162 | , program_invocation_short_name); | |||
163 | } | |||
164 | ||||
165 | static int parse_argv(int argc, char *argv[]) { | |||
166 | enum { | |||
167 | ARG_VERSION = 0x100, | |||
168 | }; | |||
169 | ||||
170 | int c; | |||
171 | ||||
172 | static const struct option options[] = { | |||
173 | { "help", no_argument0, NULL((void*)0), 'h' }, | |||
174 | { "version" , no_argument0, NULL((void*)0), ARG_VERSION }, | |||
175 | { "dry-run", no_argument0, NULL((void*)0), 'n' }, | |||
176 | {} | |||
177 | }; | |||
178 | ||||
179 | assert(argc >= 0)do { if ((__builtin_expect(!!(!(argc >= 0)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("argc >= 0"), "../src/partition/growfs.c" , 179, __PRETTY_FUNCTION__); } while (0); | |||
180 | assert(argv)do { if ((__builtin_expect(!!(!(argv)),0))) log_assert_failed_realm (LOG_REALM_SYSTEMD, ("argv"), "../src/partition/growfs.c", 180 , __PRETTY_FUNCTION__); } while (0); | |||
181 | ||||
182 | while ((c = getopt_long(argc, argv, "hn", options, NULL((void*)0))) >= 0) | |||
183 | switch(c) { | |||
184 | case 'h': | |||
185 | help(); | |||
186 | return 0; | |||
187 | ||||
188 | case ARG_VERSION: | |||
189 | version(); | |||
190 | return 0; | |||
191 | ||||
192 | case 'n': | |||
193 | arg_dry_run = true1; | |||
194 | break; | |||
195 | ||||
196 | case '?': | |||
197 | return -EINVAL22; | |||
198 | ||||
199 | default: | |||
200 | assert_not_reached("Unhandled option")do { log_assert_failed_unreachable_realm(LOG_REALM_SYSTEMD, ( "Unhandled option"), "../src/partition/growfs.c", 200, __PRETTY_FUNCTION__ ); } while (0); | |||
201 | } | |||
202 | ||||
203 | if (optind + 1 != argc) { | |||
204 | log_error("%s excepts exactly one argument (the mount point).",({ int _level = (((3))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/partition/growfs.c", 205, __func__, "%s excepts exactly one argument (the mount point)." , program_invocation_short_name) : -abs(_e); }) | |||
205 | program_invocation_short_name)({ int _level = (((3))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/partition/growfs.c", 205, __func__, "%s excepts exactly one argument (the mount point)." , program_invocation_short_name) : -abs(_e); }); | |||
206 | return -EINVAL22; | |||
207 | } | |||
208 | ||||
209 | arg_target = argv[optind]; | |||
210 | ||||
211 | return 1; | |||
212 | } | |||
213 | ||||
214 | int main(int argc, char *argv[]) { | |||
215 | dev_t devno; | |||
216 | _cleanup_close___attribute__((cleanup(closep))) int mountfd = -1, devfd = -1; | |||
217 | int blocksize; | |||
218 | uint64_t size, numblocks; | |||
219 | char devpath[DEV_NUM_PATH_MAX((sizeof("""/dev/block/""") - 1) + (2+(sizeof(dev_t) <= 1 ? 3 : sizeof(dev_t) <= 2 ? 5 : sizeof(dev_t) <= 4 ? 10 : sizeof(dev_t) <= 8 ? 20 : sizeof(int[-2*(sizeof(dev_t) > 8)]))) + 1 + (2+(sizeof(dev_t) <= 1 ? 3 : sizeof(dev_t) <= 2 ? 5 : sizeof(dev_t) <= 4 ? 10 : sizeof(dev_t) <= 8 ? 20 : sizeof(int[-2*(sizeof(dev_t) > 8)]))))], fb[FORMAT_BYTES_MAX8]; | |||
220 | struct statfs sfs; | |||
221 | int r; | |||
222 | ||||
223 | log_set_target(LOG_TARGET_AUTO); | |||
224 | log_parse_environment()log_parse_environment_realm(LOG_REALM_SYSTEMD); | |||
225 | log_open(); | |||
226 | ||||
227 | r = parse_argv(argc, argv); | |||
228 | if (r < 0) | |||
| ||||
229 | return EXIT_FAILURE1; | |||
230 | if (r == 0) | |||
231 | return EXIT_SUCCESS0; | |||
232 | ||||
233 | r = path_is_mount_point(arg_target, NULL((void*)0), 0); | |||
234 | if (r < 0) { | |||
235 | log_error_errno(r, "Failed to check if \"%s\" is a mount point: %m", arg_target)({ int _level = ((3)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/partition/growfs.c", 235, __func__, "Failed to check if \"%s\" is a mount point: %m" , arg_target) : -abs(_e); }); | |||
236 | return EXIT_FAILURE1; | |||
237 | } | |||
238 | if (r == 0) { | |||
239 | log_error_errno(r, "\"%s\" is not a mount point: %m", arg_target)({ int _level = ((3)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/partition/growfs.c", 239, __func__, "\"%s\" is not a mount point: %m" , arg_target) : -abs(_e); }); | |||
240 | return EXIT_FAILURE1; | |||
241 | } | |||
242 | ||||
243 | r = get_block_device(arg_target, &devno); | |||
244 | if (r < 0) { | |||
245 | log_error_errno(r, "Failed to determine block device of \"%s\": %m", arg_target)({ int _level = ((3)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/partition/growfs.c", 245, __func__, "Failed to determine block device of \"%s\": %m" , arg_target) : -abs(_e); }); | |||
246 | return EXIT_FAILURE1; | |||
247 | } | |||
248 | ||||
249 | r = maybe_resize_slave_device(arg_target, devno); | |||
250 | if (r < 0) | |||
251 | return EXIT_FAILURE1; | |||
252 | ||||
253 | mountfd = open(arg_target, O_RDONLY00|O_CLOEXEC02000000); | |||
| ||||
254 | if (mountfd < 0) { | |||
255 | log_error_errno(errno, "Failed to open \"%s\": %m", arg_target)({ int _level = ((3)), _e = (((*__errno_location ()))), _realm = (LOG_REALM_SYSTEMD); (log_get_max_level_realm(_realm) >= ((_level) & 0x07)) ? log_internal_realm(((_realm) << 10 | (_level)), _e, "../src/partition/growfs.c", 255, __func__ , "Failed to open \"%s\": %m", arg_target) : -abs(_e); }); | |||
256 | return EXIT_FAILURE1; | |||
257 | } | |||
258 | ||||
259 | xsprintf_dev_num_path(devpath, "block", devno)do { if ((__builtin_expect(!!(!(((size_t) snprintf(devpath, __extension__ (__builtin_choose_expr( !__builtin_types_compatible_p(typeof (devpath), typeof(&*(devpath))), sizeof(devpath)/sizeof(( devpath)[0]), ((void)0))), "/dev/%s/%u:%u", "block", gnu_dev_major (devno), gnu_dev_minor (devno)) < (__extension__ (__builtin_choose_expr ( !__builtin_types_compatible_p(typeof(devpath), typeof(& *(devpath))), sizeof(devpath)/sizeof((devpath)[0]), ((void)0) )))))),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("xsprintf: " "devpath" "[] must be big enough"), "../src/partition/growfs.c" , 259, __PRETTY_FUNCTION__); } while (0); | |||
260 | devfd = open(devpath, O_RDONLY00|O_CLOEXEC02000000); | |||
261 | if (devfd < 0) { | |||
262 | log_error_errno(errno, "Failed to open \"%s\": %m", devpath)({ int _level = ((3)), _e = (((*__errno_location ()))), _realm = (LOG_REALM_SYSTEMD); (log_get_max_level_realm(_realm) >= ((_level) & 0x07)) ? log_internal_realm(((_realm) << 10 | (_level)), _e, "../src/partition/growfs.c", 262, __func__ , "Failed to open \"%s\": %m", devpath) : -abs(_e); }); | |||
263 | return EXIT_FAILURE1; | |||
264 | } | |||
265 | ||||
266 | if (ioctl(devfd, BLKBSZGET(((2U) << (((0 +8)+8)+14)) | (((0x12)) << (0 +8)) | (((112)) << 0) | ((((sizeof(size_t)))) << ((0 + 8)+8))), &blocksize) != 0) { | |||
267 | log_error_errno(errno, "Failed to query block size of \"%s\": %m", devpath)({ int _level = ((3)), _e = (((*__errno_location ()))), _realm = (LOG_REALM_SYSTEMD); (log_get_max_level_realm(_realm) >= ((_level) & 0x07)) ? log_internal_realm(((_realm) << 10 | (_level)), _e, "../src/partition/growfs.c", 267, __func__ , "Failed to query block size of \"%s\": %m", devpath) : -abs (_e); }); | |||
268 | return EXIT_FAILURE1; | |||
269 | } | |||
270 | ||||
271 | if (ioctl(devfd, BLKGETSIZE64(((2U) << (((0 +8)+8)+14)) | (((0x12)) << (0 +8)) | (((114)) << 0) | ((((sizeof(size_t)))) << ((0 + 8)+8))), &size) != 0) { | |||
272 | log_error_errno(errno, "Failed to query size of \"%s\": %m", devpath)({ int _level = ((3)), _e = (((*__errno_location ()))), _realm = (LOG_REALM_SYSTEMD); (log_get_max_level_realm(_realm) >= ((_level) & 0x07)) ? log_internal_realm(((_realm) << 10 | (_level)), _e, "../src/partition/growfs.c", 272, __func__ , "Failed to query size of \"%s\": %m", devpath) : -abs(_e); } ); | |||
273 | return EXIT_FAILURE1; | |||
274 | } | |||
275 | ||||
276 | if (size % blocksize != 0) | |||
277 | log_notice("Partition size %"PRIu64" is not a multiple of the blocksize %d,"({ int _level = (((5))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/partition/growfs.c", 278, __func__, "Partition size %" "l" "u"" is not a multiple of the blocksize %d," " ignoring %" "l" "u"" bytes", size, blocksize, size % blocksize) : -abs(_e ); }) | |||
278 | " ignoring %"PRIu64" bytes", size, blocksize, size % blocksize)({ int _level = (((5))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/partition/growfs.c", 278, __func__, "Partition size %" "l" "u"" is not a multiple of the blocksize %d," " ignoring %" "l" "u"" bytes", size, blocksize, size % blocksize) : -abs(_e ); }); | |||
279 | ||||
280 | numblocks = size / blocksize; | |||
281 | ||||
282 | if (fstatfs(mountfd, &sfs) < 0) { | |||
283 | log_error_errno(errno, "Failed to stat file system \"%s\": %m", arg_target)({ int _level = ((3)), _e = (((*__errno_location ()))), _realm = (LOG_REALM_SYSTEMD); (log_get_max_level_realm(_realm) >= ((_level) & 0x07)) ? log_internal_realm(((_realm) << 10 | (_level)), _e, "../src/partition/growfs.c", 283, __func__ , "Failed to stat file system \"%s\": %m", arg_target) : -abs (_e); }); | |||
284 | return EXIT_FAILURE1; | |||
285 | } | |||
286 | ||||
287 | switch(sfs.f_type) { | |||
288 | case EXT4_SUPER_MAGIC0xEF53: | |||
289 | r = resize_ext4(arg_target, mountfd, devfd, numblocks, blocksize); | |||
290 | break; | |||
291 | case BTRFS_SUPER_MAGIC0x9123683E: | |||
292 | r = resize_btrfs(arg_target, mountfd, devfd, numblocks, blocksize); | |||
293 | break; | |||
294 | default: | |||
295 | log_error("Don't know how to resize fs %llx on \"%s\"",({ int _level = (((3))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/partition/growfs.c", 296, __func__, "Don't know how to resize fs %llx on \"%s\"" , (long long unsigned) sfs.f_type, arg_target) : -abs(_e); }) | |||
296 | (long long unsigned) sfs.f_type, arg_target)({ int _level = (((3))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/partition/growfs.c", 296, __func__, "Don't know how to resize fs %llx on \"%s\"" , (long long unsigned) sfs.f_type, arg_target) : -abs(_e); }); | |||
297 | return EXIT_FAILURE1; | |||
298 | } | |||
299 | ||||
300 | if (r < 0) | |||
301 | return EXIT_FAILURE1; | |||
302 | ||||
303 | log_info("Successfully resized \"%s\" to %s bytes (%"PRIu64" blocks of %d bytes).",({ int _level = (((6))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/partition/growfs.c", 304, __func__, "Successfully resized \"%s\" to %s bytes (%" "l" "u"" blocks of %d bytes).", arg_target, format_bytes(fb, sizeof fb, size), numblocks, blocksize) : -abs(_e); }) | |||
304 | arg_target, format_bytes(fb, sizeof fb, size), numblocks, blocksize)({ int _level = (((6))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD ); (log_get_max_level_realm(_realm) >= ((_level) & 0x07 )) ? log_internal_realm(((_realm) << 10 | (_level)), _e , "../src/partition/growfs.c", 304, __func__, "Successfully resized \"%s\" to %s bytes (%" "l" "u"" blocks of %d bytes).", arg_target, format_bytes(fb, sizeof fb, size), numblocks, blocksize) : -abs(_e); }); | |||
305 | return EXIT_SUCCESS0; | |||
306 | } |