]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/blobdiff - mkfs/xfs_mkfs.c
libxfs: fix libxfs_trans_alloc callsite problems
[thirdparty/xfsprogs-dev.git] / mkfs / xfs_mkfs.c
index a135e06e72155dd4428dbf8dc9d9fc50d3f67be7..c6ef3a710fd04c097895b021eed00da73ff16ff0 100644 (file)
@@ -1,19 +1,7 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * Copyright (c) 2000-2005 Silicon Graphics, Inc.
  * All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write the Free Software Foundation,
- * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
 #include "libfrog.h"
 #include "libxfs.h"
@@ -2109,7 +2097,7 @@ validate_inodesize(
                int     maxsz;
 
                fprintf(stderr, _("illegal inode size %d\n"), cfg->inodesize);
-               maxsz = MIN(cfg->blocksize / XFS_MIN_INODE_PERBLOCK,
+               maxsz = min(cfg->blocksize / XFS_MIN_INODE_PERBLOCK,
                            XFS_DINODE_MAX_SIZE);
                if (XFS_DINODE_MIN_SIZE == maxsz)
                        fprintf(stderr,
@@ -2293,11 +2281,20 @@ _("data stripe width (%d) must be a multiple of the data stripe unit (%d)\n"),
 
        /* if no stripe config set, use the device default */
        if (!dsunit) {
-               dsunit = ft->dsunit;
-               dswidth = ft->dswidth;
-               use_dev = true;
+               /* Ignore nonsense from device.  XXX add more validation */
+               if (ft->dsunit && ft->dswidth == 0) {
+                       fprintf(stderr,
+_("%s: Volume reports stripe unit of %d bytes and stripe width of 0, ignoring.\n"),
+                               progname, BBTOB(ft->dsunit));
+                       ft->dsunit = 0;
+                       ft->dswidth = 0;
+               } else {
+                       dsunit = ft->dsunit;
+                       dswidth = ft->dswidth;
+                       use_dev = true;
+               }
        } else {
-               /* check and warn is alignment is sub-optimal */
+               /* check and warn if user-specified alignment is sub-optimal */
                if (ft->dsunit && ft->dsunit != dsunit) {
                        fprintf(stderr,
 _("%s: Specified data stripe unit %d is not the same as the volume stripe unit %d\n"),
@@ -2418,10 +2415,10 @@ open_devices(
         * So, we reduce the size (in basic blocks) to a perfect
         * multiple of the sector size, or 1024, whichever is larger.
         */
-       sector_mask = (uint64_t)-1 << (MAX(cfg->sectorlog, 10) - BBSHIFT);
+       sector_mask = (uint64_t)-1 << (max(cfg->sectorlog, 10) - BBSHIFT);
        xi->dsize &= sector_mask;
        xi->rtsize &= sector_mask;
-       xi->logBBsize &= (uint64_t)-1 << (MAX(cfg->lsectorlog, 10) - BBSHIFT);
+       xi->logBBsize &= (uint64_t)-1 << (max(cfg->lsectorlog, 10) - BBSHIFT);
 
 
        if (!discard)
@@ -3005,12 +3002,12 @@ calculate_log_size(
        libxfs_umount(&mount);
 
        ASSERT(min_logblocks);
-       min_logblocks = MAX(XFS_MIN_LOG_BLOCKS, min_logblocks);
+       min_logblocks = max(XFS_MIN_LOG_BLOCKS, min_logblocks);
 
        /* if we have lots of blocks, check against XFS_MIN_LOG_BYTES, too */
        if (!cli->logsize &&
            cfg->dblocks >= (1024*1024*1024) >> cfg->blocklog)
-               min_logblocks = MAX(min_logblocks,
+               min_logblocks = max(min_logblocks,
                                    XFS_MIN_LOG_BYTES >> cfg->blocklog);
 
        /*
@@ -3046,7 +3043,7 @@ _("external log device %lld too small, must be at least %lld blocks\n"),
                         * XFS_MIN_LOG_BYTES for filesystems smaller than 16G if
                         * at all possible, ramping up to 128MB at 256GB.
                         */
-                       cfg->logblocks = MIN(XFS_MIN_LOG_BYTES >> cfg->blocklog,
+                       cfg->logblocks = min(XFS_MIN_LOG_BYTES >> cfg->blocklog,
                                        min_logblocks * XFS_DFL_LOG_FACTOR);
                } else {
                        /*
@@ -3060,7 +3057,7 @@ _("external log device %lld too small, must be at least %lld blocks\n"),
                }
 
                /* Ensure the chosen size meets minimum log size requirements */
-               cfg->logblocks = MAX(min_logblocks, cfg->logblocks);
+               cfg->logblocks = max(min_logblocks, cfg->logblocks);
 
                /*
                 * Make sure the log fits wholly within an AG
@@ -3072,11 +3069,11 @@ _("external log device %lld too small, must be at least %lld blocks\n"),
                 * opened to decide what is the valid maximum size of a log in
                 * an AG.
                 */
-               cfg->logblocks = MIN(cfg->logblocks,
+               cfg->logblocks = min(cfg->logblocks,
                                     libxfs_alloc_ag_max_usable(mp) - 1);
 
                /* and now clamp the size to the maximum supported size */
-               cfg->logblocks = MIN(cfg->logblocks, XFS_MAX_LOG_BLOCKS);
+               cfg->logblocks = min(cfg->logblocks, XFS_MAX_LOG_BLOCKS);
                if ((cfg->logblocks << cfg->blocklog) > XFS_MAX_LOG_BYTES)
                        cfg->logblocks = XFS_MAX_LOG_BYTES >> cfg->blocklog;
 
@@ -3266,7 +3263,7 @@ prepare_devices(
         */
        buf = libxfs_getbuf(mp->m_ddev_targp, (xi->dsize - whack_blks),
                            whack_blks);
-       memset(XFS_BUF_PTR(buf), 0, WHACK_SIZE);
+       memset(buf->b_addr, 0, WHACK_SIZE);
        libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE);
        libxfs_purgebuf(buf);
 
@@ -3277,15 +3274,15 @@ prepare_devices(
         * ext[2,3] and reiserfs (64k) - and hopefully all else.
         */
        buf = libxfs_getbuf(mp->m_ddev_targp, 0, whack_blks);
-       memset(XFS_BUF_PTR(buf), 0, WHACK_SIZE);
+       memset(buf->b_addr, 0, WHACK_SIZE);
        libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE);
        libxfs_purgebuf(buf);
 
        /* OK, now write the superblock... */
        buf = libxfs_getbuf(mp->m_ddev_targp, XFS_SB_DADDR, XFS_FSS_TO_BB(mp, 1));
        buf->b_ops = &xfs_sb_buf_ops;
-       memset(XFS_BUF_PTR(buf), 0, cfg->sectorsize);
-       libxfs_sb_to_disk((void *)XFS_BUF_PTR(buf), sbp);
+       memset(buf->b_addr, 0, cfg->sectorsize);
+       libxfs_sb_to_disk(buf->b_addr, sbp);
        libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE);
        libxfs_purgebuf(buf);
 
@@ -3305,7 +3302,7 @@ prepare_devices(
                buf = libxfs_getbuf(mp->m_rtdev_targp,
                                    XFS_FSB_TO_BB(mp, cfg->rtblocks - 1LL),
                                    BTOBB(cfg->blocksize));
-               memset(XFS_BUF_PTR(buf), 0, cfg->blocksize);
+               memset(buf->b_addr, 0, cfg->blocksize);
                libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE);
                libxfs_purgebuf(buf);
        }
@@ -3349,8 +3346,8 @@ initialise_ag_headers(
                        XFS_AG_DADDR(mp, agno, XFS_SB_DADDR),
                        XFS_FSS_TO_BB(mp, 1));
        buf->b_ops = &xfs_sb_buf_ops;
-       memset(XFS_BUF_PTR(buf), 0, cfg->sectorsize);
-       libxfs_sb_to_disk((void *)XFS_BUF_PTR(buf), sbp);
+       memset(buf->b_addr, 0, cfg->sectorsize);
+       libxfs_sb_to_disk(buf->b_addr, sbp);
        libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE);
 
        /*
@@ -3680,7 +3677,7 @@ initialise_ag_freespace(
        struct xfs_trans_res tres = {0};
        int                     c;
 
-       c = libxfs_trans_alloc(mp, &tres, worst_freelist, 0, 0, &tp);
+       c = -libxfs_trans_alloc(mp, &tres, worst_freelist, 0, 0, &tp);
        if (c)
                res_failed(c);