diff --git a/SOURCES/0003-xfsrestore-fix-on-media-inventory-media-unpacking.patch b/SOURCES/0003-xfsrestore-fix-on-media-inventory-media-unpacking.patch new file mode 100644 index 0000000..d47665d --- /dev/null +++ b/SOURCES/0003-xfsrestore-fix-on-media-inventory-media-unpacking.patch @@ -0,0 +1,146 @@ +From 06dd184d3a689dcb33a50b6e3576e48055e48133 Mon Sep 17 00:00:00 2001 +From: Donald Douwsma +Date: Fri, 14 Oct 2022 18:58:44 +1100 +Subject: [PATCH 3/7] xfsrestore: fix on-media inventory media unpacking + +When xfsrestore reads the inventory from tape media it fails to convert +media file records from bigendian. If the xfsdump inventory is not +available xfsrestore will write this invalid record to the on-line +inventory. + +[root@rhel8 ~]# xfsdump -L Test1 -M "" -f /dev/st0 /boot > /dev/null +[root@rhel8 ~]# xfsdump -L Test2 -M "" -f /dev/st0 /boot > /dev/null +[root@rhel8 ~]# rm -rf /var/lib/xfsdump/inventory/ +[root@rhel8 ~]# mt -f /dev/nst0 asf 2 +[root@rhel8 ~]# xfsrestore -f /dev/nst0 -L Test2 /tmp/test2 +xfsrestore: using scsi tape (drive_scsitape) strategy +xfsrestore: version 3.1.8 (dump format 3.0) - type ^C for status and control +xfsrestore: searching media for dump +xfsrestore: preparing drive +xfsrestore: examining media file 3 +xfsrestore: found dump matching specified label: +xfsrestore: hostname: rhel8 +xfsrestore: mount point: /boot +xfsrestore: volume: /dev/sda1 +xfsrestore: session time: Tue Sep 27 16:05:28 2022 +xfsrestore: level: 0 +xfsrestore: session label: "Test2" +xfsrestore: media label: "" +xfsrestore: file system id: 26dd5aa0-b901-4cf5-9b68-0c5753cb3ab8 +xfsrestore: session id: 62402423-7ae0-49ed-8ecb-9e5bc7642b91 +xfsrestore: media id: 47ba45ca-3417-4006-ab10-3dc6419b83e2 +xfsrestore: incorporating on-media session inventory into online inventory +xfsrestore: /var/lib/xfsdump/inventory created +xfsrestore: using on-media session inventory +xfsrestore: searching media for directory dump +xfsrestore: rewinding +xfsrestore: examining media file 0 +xfsrestore: inventory session uuid (62402423-7ae0-49ed-8ecb-9e5bc7642b91) does not match the media header's session uuid (1771d9e8-a1ba-4e87-a61e-f6be97e41b45) +xfsrestore: examining media file 1 +xfsrestore: inventory session uuid (62402423-7ae0-49ed-8ecb-9e5bc7642b91) does not match the media header's session uuid (1771d9e8-a1ba-4e87-a61e-f6be97e41b45) +xfsrestore: examining media file 2 +xfsrestore: reading directories +xfsrestore: 9 directories and 320 entries processed +xfsrestore: directory post-processing +xfsrestore: restore complete: 0 seconds elapsed +xfsrestore: Restore Summary: +xfsrestore: stream 0 /dev/nst0 OK (success) +xfsrestore: Restore Status: SUCCESS +[root@rhel8 ~]# xfsdump -I +file system 0: + fs id: 26dd5aa0-b901-4cf5-9b68-0c5753cb3ab8 + session 0: + mount point: rhel8:/boot + device: rhel8:/dev/sda1 + time: Tue Sep 27 16:05:28 2022 + session label: "Test2" + session id: 62402423-7ae0-49ed-8ecb-9e5bc7642b91 + level: 0 + resumed: NO + subtree: NO + streams: 1 + stream 0: + pathname: /dev/st0 + start: ino 133 offset 0 + end: ino 1572997 offset 0 + interrupted: YES + media files: 1 + media file 0: + mfile index: 33554432 + mfile type: data + mfile size: 211187836911616 + mfile start: ino 9583660007044415488 offset 0 + mfile end: ino 9583686395323482112 offset 0 + media label: "" + media id: 47ba45ca-3417-4006-ab10-3dc6419b83e2 +xfsdump: Dump Status: SUCCESS +[root@rhel8 ~]# +[root@rhel8 ~]# ls /tmp/test2 +efi grub2 loader + +The invalid start and end inode information cause xfsrestore to consider +that non-directory files do not reside in the current media and will +fail to restore them. + +The behaviour of an initial restore may succeed if the position of the +tape is such that the data file is encountered before the inventory +file, or if there is only one dump session on tape, xfsrestore is +somewhat inconsistent in this regard. Subsequent restores will use the +invalid on-line inventory and fail to restore files. + +Fix this by correctly unpacking the inventory data. + +Signed-off-by: Donald Douwsma +Reviewed-by: Darrick J. Wong +Signed-off-by: Carlos Maiolino +--- + +diff --git a/inventory/inv_stobj.c b/inventory/inv_stobj.c +index e2e8767..cdf3300 100644 +--- a/inventory/inv_stobj.c ++++ b/inventory/inv_stobj.c +@@ -1008,7 +1008,7 @@ stobj_unpack_sessinfo( + size_t bufsz, + invt_sessinfo_t *s ) + { +- uint i; ++ uint i, j; + char *tmpbuf; + char *p = (char *)bufp; + +@@ -1087,28 +1087,15 @@ stobj_unpack_sessinfo( + + /* all the media files */ + s->mfiles = (invt_mediafile_t *)p; +- +-#ifdef INVT_DELETION +- { +- int tmpfd = open( "moids", O_RDWR | O_CREAT, S_IRUSR|S_IWUSR ); +- uint j; +- invt_mediafile_t *mmf = s->mfiles; +- for (i=0; i< s->ses->s_cur_nstreams; i++ ) { +- for (j=0; j< s->strms[ i ].st_nmediafiles; +- j++, mmf++ ) +- xlate_invt_mediafile((invt_mediafile_t *)mmf, (invt_mediafile_t *)tmpbuf, 1); +- bcopy(tmpbuf, mmf, sizeof(invt_mediafile_t)); +- put_invtrecord( tmpfd, &mmf->mf_moid, +- sizeof( uuid_t ), 0, SEEK_END, 0 ); ++ for (i = 0; i < s->ses->s_cur_nstreams; i++) { ++ for(j = 0; j < s->strms[i].st_nmediafiles; j++) { ++ xlate_invt_mediafile((invt_mediafile_t *)p, ++ (invt_mediafile_t *)tmpbuf, 1); ++ bcopy(tmpbuf, p, sizeof(invt_mediafile_t)); ++ p += sizeof(invt_mediafile_t); + } +- close( tmpfd ); +- } +-#endif +- for ( i = 0; i < s->ses->s_cur_nstreams; i++ ) { +- p += (size_t) ( s->strms[ i ].st_nmediafiles ) +- * sizeof( invt_mediafile_t ); + } +- ++ + /* sanity check the size of the buffer given to us vs. the size it + should be */ + if ( (size_t) ( p - (char *) bufp ) != bufsz ) { diff --git a/SOURCES/0004-xfsrestore-fix-on-media-inventory-stream-unpacking.patch b/SOURCES/0004-xfsrestore-fix-on-media-inventory-stream-unpacking.patch new file mode 100644 index 0000000..23bfe36 --- /dev/null +++ b/SOURCES/0004-xfsrestore-fix-on-media-inventory-stream-unpacking.patch @@ -0,0 +1,200 @@ +From 65034077ef03c434c09c88d38c4c58ec442cf3c1 Mon Sep 17 00:00:00 2001 +From: Donald Douwsma +Date: Fri, 14 Oct 2022 18:58:45 +1100 +Subject: [PATCH 4/7] xfsrestore: fix on-media inventory stream unpacking + +xfsdump can create multiple streams, when restoring the online inventory +with multiple streams we fail to process these and assert when the +inventory buffer is not fully decoded. + +[root@rhel8 ~]# xfsdump -L "Test1" -f /dev/nst0 -M tape1 -f /dev/nst1 -M tape2 /boot +xfsdump: using scsi tape (drive_scsitape) strategy +xfsdump: using scsi tape (drive_scsitape) strategy +xfsdump: version 3.1.8 (dump format 3.0) - type ^C for status and control +xfsdump: level 0 dump of rhel8:/boot +xfsdump: dump date: Thu Oct 6 13:50:45 2022 +xfsdump: session id: aa25fa48-4493-45c7-9027-61e53e486445 +xfsdump: session label: "Test1" +xfsdump: ino map phase 1: constructing initial dump list +xfsdump: ino map phase 2: skipping (no pruning necessary) +xfsdump: ino map phase 3: identifying stream starting points +xfsdump: stream 0: ino 133 offset 0 to ino 28839 offset 0 +xfsdump: stream 1: ino 28839 offset 0 to end +xfsdump: ino map construction complete +xfsdump: estimated dump size: 328720704 bytes +xfsdump: estimated dump size per stream: 164375728 bytes +xfsdump: /var/lib/xfsdump/inventory created +xfsdump: drive 0: preparing drive +xfsdump: drive 1: preparing drive +xfsdump: drive 1: creating dump session media file 0 (media 0, file 0) +xfsdump: drive 1: dumping ino map +xfsdump: drive 1: dumping non-directory files +xfsdump: drive 0: creating dump session media file 0 (media 0, file 0) +xfsdump: drive 0: dumping ino map +xfsdump: drive 0: dumping directories +xfsdump: drive 0: dumping non-directory files +xfsdump: drive 1: ending media file +xfsdump: drive 1: media file size 166723584 bytes +xfsdump: drive 1: waiting for synchronized session inventory dump +xfsdump: drive 0: ending media file +xfsdump: drive 0: media file size 165675008 bytes +xfsdump: drive 0: waiting for synchronized session inventory dump +xfsdump: drive 0: dumping session inventory +xfsdump: drive 0: beginning inventory media file +xfsdump: drive 0: media file 1 (media 0, file 1) +xfsdump: drive 0: ending inventory media file +xfsdump: drive 0: inventory media file size 2097152 bytes +xfsdump: drive 0: writing stream terminator +xfsdump: drive 0: beginning media stream terminator +xfsdump: drive 0: media file 2 (media 0, file 2) +xfsdump: drive 0: ending media stream terminator +xfsdump: drive 0: media stream terminator size 1048576 bytes +xfsdump: drive 1: dumping session inventory +xfsdump: drive 1: beginning inventory media file +xfsdump: drive 1: media file 1 (media 0, file 1) +xfsdump: drive 1: ending inventory media file +xfsdump: drive 1: inventory media file size 2097152 bytes +xfsdump: drive 1: writing stream terminator +xfsdump: drive 1: beginning media stream terminator +xfsdump: drive 1: media file 2 (media 0, file 2) +xfsdump: drive 1: ending media stream terminator +xfsdump: drive 1: media stream terminator size 1048576 bytes +xfsdump: dump size (non-dir files) : 328189016 bytes +xfsdump: dump complete: 4 seconds elapsed +xfsdump: Dump Summary: +xfsdump: stream 0 /dev/nst0 OK (success) +xfsdump: stream 1 /dev/nst1 OK (success) +xfsdump: Dump Status: SUCCESS +[root@rhel8 ~]# xfsdump -I +file system 0: + fs id: 26dd5aa0-b901-4cf5-9b68-0c5753cb3ab8 + session 0: + mount point: rhel8:/boot + device: rhel8:/dev/sda1 + time: Thu Oct 6 13:50:45 2022 + session label: "Test1" + session id: aa25fa48-4493-45c7-9027-61e53e486445 + level: 0 + resumed: NO + subtree: NO + streams: 2 + stream 0: + pathname: /dev/nst0 + start: ino 133 offset 0 + end: ino 28839 offset 0 + interrupted: NO + media files: 2 + media file 0: + mfile index: 0 + mfile type: data + mfile size: 165675008 + mfile start: ino 133 offset 0 + mfile end: ino 28839 offset 0 + media label: "tape1" + media id: adb31f2a-f026-4597-a20a-326f28ecbaf1 + media file 1: + mfile index: 1 + mfile type: inventory + mfile size: 2097152 + media label: "tape1" + media id: adb31f2a-f026-4597-a20a-326f28ecbaf1 + stream 1: + pathname: /dev/nst1 + start: ino 28839 offset 0 + end: ino 1572997 offset 0 + interrupted: NO + media files: 2 + media file 0: + mfile index: 0 + mfile type: data + mfile size: 166723584 + mfile start: ino 28839 offset 0 + mfile end: ino 1572997 offset 0 + media label: "tape2" + media id: 22224f02-b6c7-47d5-ad61-a61ba071c8a8 + media file 1: + mfile index: 1 + mfile type: inventory + mfile size: 2097152 + media label: "tape2" + media id: 22224f02-b6c7-47d5-ad61-a61ba071c8a8 +xfsdump: Dump Status: SUCCESS +[root@rhel8 ~]# mv /var/lib/xfsdump/inventory /var/lib/xfsdump/inventory_two_sessions +[root@rhel8 ~]# xfsdump -I +xfsdump: Dump Status: SUCCESS + +[root@rhel8 ~]# xfsrestore -L Test1 -f /dev/nst0 /tmp/test1/ +xfsrestore: using scsi tape (drive_scsitape) strategy +xfsrestore: version 3.1.8 (dump format 3.0) - type ^C for status and control +xfsrestore: searching media for dump +xfsrestore: preparing drive +xfsrestore: examining media file 2 +xfsrestore: found dump matching specified label: +xfsrestore: hostname: rhel8 +xfsrestore: mount point: /boot +xfsrestore: volume: /dev/sda1 +xfsrestore: session time: Thu Oct 6 13:50:45 2022 +xfsrestore: level: 0 +xfsrestore: session label: "Test1" +xfsrestore: media label: "tape1" +xfsrestore: file system id: 26dd5aa0-b901-4cf5-9b68-0c5753cb3ab8 +xfsrestore: session id: aa25fa48-4493-45c7-9027-61e53e486445 +xfsrestore: media id: adb31f2a-f026-4597-a20a-326f28ecbaf1 +xfsrestore: searching media for directory dump +xfsrestore: rewinding +xfsrestore: examining media file 0 +xfsrestore: reading directories +xfsrestore: 9 directories and 320 entries processed +xfsrestore: directory post-processing +xfsrestore: restoring non-directory files +xfsrestore: examining media file 1 +xfsrestore: inv_stobj.c:1119: stobj_unpack_sessinfo: Assertion `(size_t) ( p - (char *) bufp ) == bufsz' failed. +Aborted (core dumped) + +Make sure we unpack multiple streams when restoring the online +inventory from media. + +Signed-off-by: Donald Douwsma +Reviewed-by: Darrick J. Wong +Signed-off-by: Carlos Maiolino +--- + +diff --git a/inventory/inv_stobj.c b/inventory/inv_stobj.c +index cdf3300..42b86dc 100644 +--- a/inventory/inv_stobj.c ++++ b/inventory/inv_stobj.c +@@ -1065,25 +1065,26 @@ stobj_unpack_sessinfo( + return BOOL_FALSE; + } + ++ /* get the seshdr and then, the remainder of the session */ + xlate_invt_seshdr((invt_seshdr_t *)p, (invt_seshdr_t *)tmpbuf, 1); + bcopy(tmpbuf, p, sizeof(invt_seshdr_t)); +- +- /* get the seshdr and then, the remainder of the session */ + s->seshdr = (invt_seshdr_t *)p; + s->seshdr->sh_sess_off = -1; +- p += sizeof( invt_seshdr_t ); +- ++ p += sizeof(invt_seshdr_t); + + xlate_invt_session((invt_session_t *)p, (invt_session_t *)tmpbuf, 1); + bcopy (tmpbuf, p, sizeof(invt_session_t)); + s->ses = (invt_session_t *)p; +- p += sizeof( invt_session_t ); ++ p += sizeof(invt_session_t); + + /* the array of all the streams belonging to this session */ +- xlate_invt_stream((invt_stream_t *)p, (invt_stream_t *)tmpbuf, 1); +- bcopy(tmpbuf, p, sizeof(invt_stream_t)); + s->strms = (invt_stream_t *)p; +- p += s->ses->s_cur_nstreams * sizeof( invt_stream_t ); ++ for (i = 0; i < s->ses->s_cur_nstreams; i++) { ++ xlate_invt_stream((invt_stream_t *)p, ++ (invt_stream_t *)tmpbuf, 1); ++ bcopy(tmpbuf, p, sizeof(invt_stream_t)); ++ p += sizeof(invt_stream_t); ++ } + + /* all the media files */ + s->mfiles = (invt_mediafile_t *)p; diff --git a/SOURCES/0005-xfsdump-fix-on-media-inventory-stream-packing.patch b/SOURCES/0005-xfsdump-fix-on-media-inventory-stream-packing.patch new file mode 100644 index 0000000..f58bfe3 --- /dev/null +++ b/SOURCES/0005-xfsdump-fix-on-media-inventory-stream-packing.patch @@ -0,0 +1,89 @@ +From 7b843fdbbe47ed36117fc0e1fb95e4288f3a9c83 Mon Sep 17 00:00:00 2001 +From: Donald Douwsma +Date: Fri, 14 Oct 2022 18:58:46 +1100 +Subject: [PATCH 5/7] xfsdump: fix on-media inventory stream packing + +With the on-media inventory now being restored for multiple streams we +can see that the restored streams both claim to be for /dev/nst0. + +[root@rhel8 xfsdump-dev]# xfsdump -L "Test" -f /dev/nst0 -M tape1 -f /dev/nst1 -M tape2 /boot +... +[root@rhel8 ~]# rm -rf /var/lib/xfsdump/inventory +[root@rhel8 xfsdump-dev]# restore/xfsrestore -L Test -f /dev/nst0 -f /dev/nst1 /tmp/test +restore/xfsrestore: using scsi tape (drive_scsitape) strategy +restore/xfsrestore: using scsi tape (drive_scsitape) strategy +restore/xfsrestore: version 3.1.10 (dump format 3.0) - type ^C for status and control +... +restore/xfsrestore: Restore Summary: +restore/xfsrestore: stream 0 /dev/nst0 OK (success) +restore/xfsrestore: stream 1 /dev/nst1 ALREADY_DONE (another stream completed the operation) +restore/xfsrestore: Restore Status: SUCCESS +[root@rhel8 xfsdump-dev]# xfsdump -I +file system 0: + fs id: 26dd5aa0-b901-4cf5-9b68-0c5753cb3ab8 + session 0: + mount point: rhel8:/boot + device: rhel8:/dev/sda1 + time: Fri Oct 14 18:31:40 2022 + session label: "Test" + session id: 96538a3d-2af8-4a79-8865-afec6e3e55f4 + level: 0 + resumed: NO + subtree: NO + streams: 2 + stream 0: + pathname: /dev/nst0 + start: ino 133 offset 0 + end: ino 28839 offset 0 + interrupted: YES + media files: 1 + media file 0: + mfile index: 0 + mfile type: data + mfile size: 165675008 + mfile start: ino 133 offset 0 + mfile end: ino 28839 offset 0 + media label: "tape1" + media id: 8a9d0ced-61f6-4332-a0c1-f1e38641c4e6 + stream 1: + pathname: /dev/nst0 + start: ino 133 offset 0 + end: ino 28839 offset 0 + interrupted: YES + media files: 1 + media file 0: + mfile index: 0 + mfile type: data + mfile size: 166723584 + mfile start: ino 28839 offset 0 + mfile end: ino 1572997 offset 0 + media label: "tape2" + media id: 7d569377-6bfb-4c02-b299-4dbe753bb048 +xfsdump: Dump Status: SUCCESS +[root@rhel8 xfsdump-dev]# + +Fix this by indexing the stream being packed for the on-media inventory. + +Signed-off-by: Donald Douwsma +Suggested-by: Darrick J. Wong +Reviewed-by: Darrick J. Wong +Signed-off-by: Carlos Maiolino +--- + +diff --git a/inventory/inv_stobj.c b/inventory/inv_stobj.c +index 42b86dc..d6aedf2 100644 +--- a/inventory/inv_stobj.c ++++ b/inventory/inv_stobj.c +@@ -797,9 +797,9 @@ stobj_pack_sessinfo( int fd, invt_sessio + xlate_invt_session( ses, (invt_session_t *)sesbuf, 1 ); + sesbuf += sizeof( invt_session_t ); + +- for ( i = 0; i < ses->s_cur_nstreams; i++ ) { +- xlate_invt_stream( strms, (invt_stream_t *)sesbuf, 1 ); +- sesbuf += sizeof( invt_stream_t ); ++ for (i = 0; i < ses->s_cur_nstreams; i++) { ++ xlate_invt_stream(&strms[i], (invt_stream_t *)sesbuf, 1); ++ sesbuf += sizeof(invt_stream_t); + } + + /* now append all the mediafiles */ diff --git a/SOURCES/0006-xfsrestore-untangle-inventory-unpacking-logic.patch b/SOURCES/0006-xfsrestore-untangle-inventory-unpacking-logic.patch new file mode 100644 index 0000000..648a072 --- /dev/null +++ b/SOURCES/0006-xfsrestore-untangle-inventory-unpacking-logic.patch @@ -0,0 +1,40 @@ +From aaaa57f32a605e4ebd2e4230fe036afc009ae0a0 Mon Sep 17 00:00:00 2001 +From: Donald Douwsma +Date: Fri, 14 Oct 2022 18:58:47 +1100 +Subject: [PATCH 6/7] xfsrestore: untangle inventory unpacking logic + +stobj_unpack_sessinfo returns bool_t, fix logic in pi_addfile so errors +can be properly reported. + +Signed-off-by: Donald Douwsma +Reviewed-by: Darrick J. Wong +Signed-off-by: Carlos Maiolino +--- + +diff --git a/restore/content.c b/restore/content.c +index b19bb90..8bb5fa4 100644 +--- a/restore/content.c ++++ b/restore/content.c +@@ -5461,17 +5461,14 @@ pi_addfile( Media_t *Mediap, + * desc. + */ + sessp = 0; +- if ( ! buflen ) { +- ok = BOOL_FALSE; +- } else { +- /* extract the session information from the buffer */ +- if ( stobj_unpack_sessinfo( bufp, buflen, &sessinfo )<0 ) { +- ok = BOOL_FALSE; +- } else { ++ ok = BOOL_FALSE; ++ /* extract the session information from the buffer */ ++ if (buflen && ++ stobj_unpack_sessinfo(bufp, buflen, &sessinfo)) { + stobj_convert_sessinfo(&sessp, &sessinfo); + ok = BOOL_TRUE; +- } + } ++ + if ( ! ok || ! sessp ) { + mlog( MLOG_DEBUG | MLOG_WARNING | MLOG_MEDIA, _( + "on-media session " diff --git a/SPECS/xfsdump.spec b/SPECS/xfsdump.spec index dadc861..f652c91 100644 --- a/SPECS/xfsdump.spec +++ b/SPECS/xfsdump.spec @@ -1,7 +1,7 @@ Summary: Administrative utilities for the XFS filesystem Name: xfsdump Version: 3.1.7 -Release: 2%{?dist} +Release: 3%{?dist} # Licensing based on generic "GNU GENERAL PUBLIC LICENSE" # in source, with no mention of version. License: GPL+ @@ -10,6 +10,10 @@ URL: http://oss.sgi.com/projects/xfs/ Source0: https://www.kernel.org/pub/linux/utils/fs/xfs/%{name}/%{name}-%{version}.tar.xz Patch0: 0001-xfsdump-Revert-xfsdump-handle-bind-mount-targets.patch Patch1: 0002-xfsdump-intercept-bind-mount-targets.patch +Patch2: 0003-xfsrestore-fix-on-media-inventory-media-unpacking.patch +Patch3: 0004-xfsrestore-fix-on-media-inventory-stream-unpacking.patch +Patch4: 0005-xfsdump-fix-on-media-inventory-stream-packing.patch +Patch5: 0006-xfsrestore-untangle-inventory-unpacking-logic.patch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: libtool, gettext, gawk BuildRequires: xfsprogs-devel, libuuid-devel, libattr-devel ncurses-devel @@ -36,6 +40,10 @@ subtrees may be restored from full or partial backups. %setup -q %patch0 -p1 %patch1 -p1 +%patch2 -p1 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 %build %configure @@ -65,7 +73,10 @@ rm -rf $RPM_BUILD_ROOT %{_sbindir}/* %changelog -* Fri Nov 03 2017 Eric Sandeen 3.1.7-2 +* Wed Jan 25 2023 Donald Douwsma 3.1.7-3 +- Fix restoring inventory from tape (#2054511) + +* Wed Jul 20 2022 Eric Sandeen 3.1.7-2 - Fix bind mount vs root inode problems (#1698057) * Fri Nov 03 2017 Eric Sandeen 3.1.7-1