Blame SOURCES/xfsprogs-5.10.0-mkfs-format-bigtime-filesystems.patch

5d5cbe
From e9601810beb7d5b36a5fbd03c593cf63f685bfff Mon Sep 17 00:00:00 2001
5d5cbe
From: "Darrick J. Wong" <darrick.wong@oracle.com>
5d5cbe
Date: Fri, 20 Nov 2020 17:03:28 -0500
5d5cbe
Subject: [PATCH] mkfs: format bigtime filesystems
5d5cbe
5d5cbe
Allow formatting with large timestamps.
5d5cbe
5d5cbe
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
5d5cbe
Reviewed-by: Christoph Hellwig <hch@lst.de>
5d5cbe
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5d5cbe
---
5d5cbe
5d5cbe
diff --git a/man/man8/mkfs.xfs.8 b/man/man8/mkfs.xfs.8
5d5cbe
index 45b150f..0a115cb 100644
5d5cbe
--- a/man/man8/mkfs.xfs.8
5d5cbe
+++ b/man/man8/mkfs.xfs.8
5d5cbe
@@ -154,6 +154,22 @@ valid
5d5cbe
 are:
5d5cbe
 .RS 1.2i
5d5cbe
 .TP
5d5cbe
+.BI bigtime= value
5d5cbe
+This option enables filesystems that can handle inode timestamps from December
5d5cbe
+1901 to July 2486, and quota timer expirations from January 1970 to July 2486.
5d5cbe
+The value is either 0 to disable the feature, or 1 to enable large timestamps.
5d5cbe
+.IP
5d5cbe
+If this feature is not enabled, the filesystem can only handle timestamps from
5d5cbe
+December 1901 to January 2038, and quota timers from January 1970 to February
5d5cbe
+2106.
5d5cbe
+.IP
5d5cbe
+By default,
5d5cbe
+.B mkfs.xfs
5d5cbe
+will not enable this feature.
5d5cbe
+If the option
5d5cbe
+.B \-m crc=0
5d5cbe
+is used, the large timestamp feature is not supported and is disabled.
5d5cbe
+.TP
5d5cbe
 .BI crc= value
5d5cbe
 This is used to create a filesystem which maintains and checks CRC information
5d5cbe
 in all metadata objects on disk. The value is either 0 to disable the feature,
5d5cbe
diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c
5d5cbe
index 87f15f4..b74a00b 100644
5d5cbe
--- a/mkfs/xfs_mkfs.c
5d5cbe
+++ b/mkfs/xfs_mkfs.c
5d5cbe
@@ -118,6 +118,7 @@ enum {
5d5cbe
 	M_RMAPBT,
5d5cbe
 	M_REFLINK,
5d5cbe
 	M_INOBTCNT,
5d5cbe
+	M_BIGTIME,
5d5cbe
 	M_MAX_OPTS,
5d5cbe
 };
5d5cbe
 
5d5cbe
@@ -653,6 +654,7 @@ static struct opt_params mopts = {
5d5cbe
 		[M_RMAPBT] = "rmapbt",
5d5cbe
 		[M_REFLINK] = "reflink",
5d5cbe
 		[M_INOBTCNT] = "inobtcount",
5d5cbe
+		[M_BIGTIME] = "bigtime",
5d5cbe
 	},
5d5cbe
 	.subopt_params = {
5d5cbe
 		{ .index = M_CRC,
5d5cbe
@@ -689,6 +691,12 @@ static struct opt_params mopts = {
5d5cbe
 		  .maxval = 1,
5d5cbe
 		  .defaultval = 1,
5d5cbe
 		},
5d5cbe
+		{ .index = M_BIGTIME,
5d5cbe
+		  .conflicts = { { NULL, LAST_CONFLICT } },
5d5cbe
+		  .minval = 0,
5d5cbe
+		  .maxval = 1,
5d5cbe
+		  .defaultval = 1,
5d5cbe
+		},
5d5cbe
 	},
5d5cbe
 };
5d5cbe
 
5d5cbe
@@ -740,6 +748,7 @@ struct sb_feat_args {
5d5cbe
 	bool	rmapbt;			/* XFS_SB_FEAT_RO_COMPAT_RMAPBT */
5d5cbe
 	bool	reflink;		/* XFS_SB_FEAT_RO_COMPAT_REFLINK */
5d5cbe
 	bool	inobtcnt;		/* XFS_SB_FEAT_RO_COMPAT_INOBTCNT */
5d5cbe
+	bool	bigtime;		/* XFS_SB_FEAT_INCOMPAT_BIGTIME */
5d5cbe
 	bool	nodalign;
5d5cbe
 	bool	nortalign;
5d5cbe
 };
5d5cbe
@@ -863,7 +872,7 @@ usage( void )
5d5cbe
 	fprintf(stderr, _("Usage: %s\n\
5d5cbe
 /* blocksize */		[-b size=num]\n\
5d5cbe
 /* metadata */		[-m crc=0|1,finobt=0|1,uuid=xxx,rmapbt=0|1,reflink=0|1,\n\
5d5cbe
-			    inobtcnt=0|1]\n\
5d5cbe
+			    inobtcnt=0|1,bigtime=0|1]\n\
5d5cbe
 /* data subvol */	[-d agcount=n,agsize=n,file,name=xxx,size=num,\n\
5d5cbe
 			    (sunit=value,swidth=value|su=num,sw=num|noalign),\n\
5d5cbe
 			    sectsize=num\n\
5d5cbe
@@ -1620,6 +1629,9 @@ meta_opts_parser(
5d5cbe
 	case M_INOBTCNT:
5d5cbe
 		cli->sb_feat.inobtcnt = getnum(value, opts, subopt);
5d5cbe
 		break;
5d5cbe
+	case M_BIGTIME:
5d5cbe
+		cli->sb_feat.bigtime = getnum(value, opts, subopt);
5d5cbe
+		break;
5d5cbe
 	default:
5d5cbe
 		return -EINVAL;
5d5cbe
 	}
5d5cbe
@@ -2057,6 +2069,13 @@ _("inode btree counters not supported without CRC support\n"));
5d5cbe
 			usage();
5d5cbe
 		}
5d5cbe
 		cli->sb_feat.inobtcnt = false;
5d5cbe
+
5d5cbe
+		if (cli->sb_feat.bigtime && cli_opt_set(&mopts, M_BIGTIME)) {
5d5cbe
+			fprintf(stderr,
5d5cbe
+_("timestamps later than 2038 not supported without CRC support\n"));
5d5cbe
+			usage();
5d5cbe
+		}
5d5cbe
+		cli->sb_feat.bigtime = false;
5d5cbe
 	}
5d5cbe
 
5d5cbe
 	if (!cli->sb_feat.finobt) {
5d5cbe
@@ -3033,6 +3052,8 @@ sb_set_features(
5d5cbe
 		sbp->sb_features_ro_compat |= XFS_SB_FEAT_RO_COMPAT_REFLINK;
5d5cbe
 	if (fp->inobtcnt)
5d5cbe
 		sbp->sb_features_ro_compat |= XFS_SB_FEAT_RO_COMPAT_INOBTCNT;
5d5cbe
+	if (fp->bigtime)
5d5cbe
+		sbp->sb_features_incompat |= XFS_SB_FEAT_INCOMPAT_BIGTIME;
5d5cbe
 
5d5cbe
 	/*
5d5cbe
 	 * Sparse inode chunk support has two main inode alignment requirements.
5d5cbe
@@ -3952,6 +3973,7 @@ main(
5d5cbe
 			.parent_pointers = false,
5d5cbe
 			.nodalign = false,
5d5cbe
 			.nortalign = false,
5d5cbe
+			.bigtime = false,
5d5cbe
 		},
5d5cbe
 	};
5d5cbe