]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/blame - libfrog/fsgeom.c
libfrog: refactor online geometry queries
[thirdparty/xfsprogs-dev.git] / libfrog / fsgeom.c
CommitLineData
959ef981 1// SPDX-License-Identifier: GPL-2.0
96aaf9bc 2/*
959ef981 3 * Copyright (c) 2000-2005 Silicon Graphics, Inc. All Rights Reserved.
96aaf9bc
DW
4 */
5#include "libxfs.h"
6#include "fsgeom.h"
7
8void
9xfs_report_geom(
10 struct xfs_fsop_geom *geo,
11 const char *mntpoint,
12 const char *logname,
13 const char *rtname)
14{
15 int isint;
16 int lazycount;
17 int dirversion;
18 int logversion;
19 int attrversion;
20 int projid32bit;
21 int crcs_enabled;
22 int cimode;
23 int ftype_enabled;
24 int finobt_enabled;
25 int spinodes;
26 int rmapbt_enabled;
27 int reflink_enabled;
28
29 isint = geo->logstart > 0;
30 lazycount = geo->flags & XFS_FSOP_GEOM_FLAGS_LAZYSB ? 1 : 0;
31 dirversion = geo->flags & XFS_FSOP_GEOM_FLAGS_DIRV2 ? 2 : 1;
32 logversion = geo->flags & XFS_FSOP_GEOM_FLAGS_LOGV2 ? 2 : 1;
33 attrversion = geo->flags & XFS_FSOP_GEOM_FLAGS_ATTR2 ? 2 : \
34 (geo->flags & XFS_FSOP_GEOM_FLAGS_ATTR ? 1 : 0);
35 cimode = geo->flags & XFS_FSOP_GEOM_FLAGS_DIRV2CI ? 1 : 0;
36 projid32bit = geo->flags & XFS_FSOP_GEOM_FLAGS_PROJID32 ? 1 : 0;
37 crcs_enabled = geo->flags & XFS_FSOP_GEOM_FLAGS_V5SB ? 1 : 0;
38 ftype_enabled = geo->flags & XFS_FSOP_GEOM_FLAGS_FTYPE ? 1 : 0;
39 finobt_enabled = geo->flags & XFS_FSOP_GEOM_FLAGS_FINOBT ? 1 : 0;
40 spinodes = geo->flags & XFS_FSOP_GEOM_FLAGS_SPINODES ? 1 : 0;
41 rmapbt_enabled = geo->flags & XFS_FSOP_GEOM_FLAGS_RMAPBT ? 1 : 0;
42 reflink_enabled = geo->flags & XFS_FSOP_GEOM_FLAGS_REFLINK ? 1 : 0;
43
44 printf(_(
45"meta-data=%-22s isize=%-6d agcount=%u, agsize=%u blks\n"
46" =%-22s sectsz=%-5u attr=%u, projid32bit=%u\n"
47" =%-22s crc=%-8u finobt=%u, sparse=%u, rmapbt=%u\n"
48" =%-22s reflink=%u\n"
49"data =%-22s bsize=%-6u blocks=%llu, imaxpct=%u\n"
50" =%-22s sunit=%-6u swidth=%u blks\n"
51"naming =version %-14u bsize=%-6u ascii-ci=%d, ftype=%d\n"
52"log =%-22s bsize=%-6d blocks=%u, version=%d\n"
53" =%-22s sectsz=%-5u sunit=%d blks, lazy-count=%d\n"
54"realtime =%-22s extsz=%-6d blocks=%lld, rtextents=%lld\n"),
55 mntpoint, geo->inodesize, geo->agcount, geo->agblocks,
56 "", geo->sectsize, attrversion, projid32bit,
57 "", crcs_enabled, finobt_enabled, spinodes, rmapbt_enabled,
58 "", reflink_enabled,
59 "", geo->blocksize, (unsigned long long)geo->datablocks,
60 geo->imaxpct,
61 "", geo->sunit, geo->swidth,
62 dirversion, geo->dirblocksize, cimode, ftype_enabled,
63 isint ? _("internal log") : logname ? logname : _("external"),
64 geo->blocksize, geo->logblocks, logversion,
65 "", geo->logsectsize, geo->logsunit / geo->blocksize, lazycount,
66 !geo->rtblocks ? _("none") : rtname ? rtname : _("external"),
67 geo->rtextsize * geo->blocksize, (unsigned long long)geo->rtblocks,
68 (unsigned long long)geo->rtextents);
69}
9612817d
DW
70
71/* Try to obtain the xfs geometry. On error returns a positive error code. */
72int
73xfrog_geometry(
74 int fd,
75 struct xfs_fsop_geom *fsgeo)
76{
77 int ret;
78
79 memset(fsgeo, 0, sizeof(*fsgeo));
80
81 ret = ioctl(fd, XFS_IOC_FSGEOMETRY, fsgeo);
82 if (!ret)
83 return 0;
84
85 ret = ioctl(fd, XFS_IOC_FSGEOMETRY_V4, fsgeo);
86 if (!ret)
87 return 0;
88
89 ret = ioctl(fd, XFS_IOC_FSGEOMETRY_V1, fsgeo);
90 if (!ret)
91 return 0;
92
93 return errno;
94}