All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/3] xfsrestore: fix inventory unpacking
@ 2022-09-28  5:53 Donald Douwsma
  2022-09-28  5:53 ` [PATCH 1/3] " Donald Douwsma
                   ` (2 more replies)
  0 siblings, 3 replies; 13+ messages in thread
From: Donald Douwsma @ 2022-09-28  5:53 UTC (permalink / raw)
  To: linux-xfs; +Cc: Donald Douwsma

When xfsrestore reads its inventory from tape it fails to convert the media
record on bigendian systems, if the online inventory is unavailable this results
in invalid data being writen to the online inventory and failure to restore
non-directory files.

The series fixes the converstion and related issues.

---
v2
- Seperate out cleanup and content.c changes, fix whitespace.
- Show a full reproducer in the first patch.

Donald Douwsma (3):
  xfsrestore: fix inventory unpacking
  xfsrestore: stobj_unpack_sessinfo cleanup
  xfsrestore: untangle inventory unpacking logic

 inventory/inv_stobj.c | 40 ++++++++++++++--------------------------
 restore/content.c     | 13 +++++--------
 2 files changed, 19 insertions(+), 34 deletions(-)

-- 
2.31.1


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH 1/3] xfsrestore: fix inventory unpacking
  2022-09-28  5:53 [PATCH v2 0/3] xfsrestore: fix inventory unpacking Donald Douwsma
@ 2022-09-28  5:53 ` Donald Douwsma
  2022-09-28 15:12   ` Darrick J. Wong
  2022-09-28  5:53 ` [PATCH 2/3] xfsrestore: stobj_unpack_sessinfo cleanup Donald Douwsma
  2022-09-28  5:53 ` [PATCH 3/3] xfsrestore: untangle inventory unpacking logic Donald Douwsma
  2 siblings, 1 reply; 13+ messages in thread
From: Donald Douwsma @ 2022-09-28  5:53 UTC (permalink / raw)
  To: linux-xfs; +Cc: Donald Douwsma

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 <ddouwsma@redhat.com>
---
 inventory/inv_stobj.c | 27 +++++++--------------------
 1 file changed, 7 insertions(+), 20 deletions(-)

diff --git a/inventory/inv_stobj.c b/inventory/inv_stobj.c
index c20e71c..5075ee4 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,26 +1087,13 @@ 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
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 2/3] xfsrestore: stobj_unpack_sessinfo cleanup
  2022-09-28  5:53 [PATCH v2 0/3] xfsrestore: fix inventory unpacking Donald Douwsma
  2022-09-28  5:53 ` [PATCH 1/3] " Donald Douwsma
@ 2022-09-28  5:53 ` Donald Douwsma
  2022-09-28 15:23   ` Darrick J. Wong
  2022-09-28  5:53 ` [PATCH 3/3] xfsrestore: untangle inventory unpacking logic Donald Douwsma
  2 siblings, 1 reply; 13+ messages in thread
From: Donald Douwsma @ 2022-09-28  5:53 UTC (permalink / raw)
  To: linux-xfs; +Cc: Donald Douwsma

stobj_unpack_sessinfo should be the reverse of stobj_pack_sessinfo, make
this clearer with respect to the session header and streams processing.

signed-off-by: Donald Douwsma <ddouwsma@redhat.com>
---
 inventory/inv_stobj.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/inventory/inv_stobj.c b/inventory/inv_stobj.c
index 5075ee4..521acff 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);
 
-
 	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);
 
 	/* 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;
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 3/3] xfsrestore: untangle inventory unpacking logic
  2022-09-28  5:53 [PATCH v2 0/3] xfsrestore: fix inventory unpacking Donald Douwsma
  2022-09-28  5:53 ` [PATCH 1/3] " Donald Douwsma
  2022-09-28  5:53 ` [PATCH 2/3] xfsrestore: stobj_unpack_sessinfo cleanup Donald Douwsma
@ 2022-09-28  5:53 ` Donald Douwsma
  2022-09-28 15:24   ` Darrick J. Wong
  2 siblings, 1 reply; 13+ messages in thread
From: Donald Douwsma @ 2022-09-28  5:53 UTC (permalink / raw)
  To: linux-xfs; +Cc: Donald Douwsma

stobj_unpack_sessinfo returns bool_t, fix logic in pi_addfile so errors
can be properly reported.

signed-off-by: Donald Douwsma <ddouwsma@redhat.com>
---
 restore/content.c | 13 +++++--------
 1 file changed, 5 insertions(+), 8 deletions(-)

diff --git a/restore/content.c b/restore/content.c
index b3999f9..04b6f81 100644
--- a/restore/content.c
+++ b/restore/content.c
@@ -5463,17 +5463,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 "
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH 1/3] xfsrestore: fix inventory unpacking
  2022-09-28  5:53 ` [PATCH 1/3] " Donald Douwsma
@ 2022-09-28 15:12   ` Darrick J. Wong
  2022-09-28 23:02     ` Donald Douwsma
  0 siblings, 1 reply; 13+ messages in thread
From: Darrick J. Wong @ 2022-09-28 15:12 UTC (permalink / raw)
  To: Donald Douwsma; +Cc: linux-xfs

On Wed, Sep 28, 2022 at 03:53:05PM +1000, Donald Douwsma wrote:
> 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 <ddouwsma@redhat.com>
> ---
>  inventory/inv_stobj.c | 27 +++++++--------------------
>  1 file changed, 7 insertions(+), 20 deletions(-)
> 
> diff --git a/inventory/inv_stobj.c b/inventory/inv_stobj.c
> index c20e71c..5075ee4 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,26 +1087,13 @@ 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);

I wonder, do you need to preserve this behavior (writing the inventory
records to "moids")?  testmain.c seems to want to read the file, but
OTOH that looks like some sort of test program; arbitrarily overwriting
a file in $PWD seems ... risky?  And I guess this chunk has never run.

Also testmain.c has such gems as:

"/dana/hates/me"

"/the/krays"

and mentions that -I supersedes most of its functionality.  So maybe
that's why you deleted moids?  Aside from the name just sounding gross?

:)

> -		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, 

Nit: trailing whitespace                                      here ^

If the the answer to the above question is "Yeah, nobody wants the moids
file" then:
Reviewed-by: Darrick J. Wong <djwong@kernel.org>

--D

> +					     (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
> -- 
> 2.31.1
> 

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 2/3] xfsrestore: stobj_unpack_sessinfo cleanup
  2022-09-28  5:53 ` [PATCH 2/3] xfsrestore: stobj_unpack_sessinfo cleanup Donald Douwsma
@ 2022-09-28 15:23   ` Darrick J. Wong
  2022-09-28 23:12     ` Donald Douwsma
  0 siblings, 1 reply; 13+ messages in thread
From: Darrick J. Wong @ 2022-09-28 15:23 UTC (permalink / raw)
  To: Donald Douwsma; +Cc: linux-xfs

On Wed, Sep 28, 2022 at 03:53:06PM +1000, Donald Douwsma wrote:
> stobj_unpack_sessinfo should be the reverse of stobj_pack_sessinfo, make
> this clearer with respect to the session header and streams processing.
> 
> signed-off-by: Donald Douwsma <ddouwsma@redhat.com>
> ---
>  inventory/inv_stobj.c | 13 +++++++------
>  1 file changed, 7 insertions(+), 6 deletions(-)
> 
> diff --git a/inventory/inv_stobj.c b/inventory/inv_stobj.c
> index 5075ee4..521acff 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);
>  
> -
>  	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);
>  
>  	/* 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, 

Nit: trailing whitespace                        here ^

> +				  (invt_stream_t *)tmpbuf, 1);
> +		bcopy(tmpbuf, p, sizeof(invt_stream_t));
> +		p += sizeof(invt_stream_t);

Ok, so we translate p into tmpbuf, then bcopy tmpbuf back to p.  That
part makes sense, but I am puzzled by what stobj_pack_sessinfo does:

	for (i = 0; i < ses->s_cur_nstreams; i++) {
		xlate_invt_stream(strms, (invt_stream_t *)sesbuf, 1);
		sesbuf += sizeof(invt_stream_t);
	}

Why isn't that callsite xlate_invt_stream(&strms[i], ...); ?

--D

> +	}
>  
>  	/* all the media files */
>  	s->mfiles = (invt_mediafile_t *)p;
> -- 
> 2.31.1
> 

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 3/3] xfsrestore: untangle inventory unpacking logic
  2022-09-28  5:53 ` [PATCH 3/3] xfsrestore: untangle inventory unpacking logic Donald Douwsma
@ 2022-09-28 15:24   ` Darrick J. Wong
  2022-09-28 23:12     ` Donald Douwsma
  0 siblings, 1 reply; 13+ messages in thread
From: Darrick J. Wong @ 2022-09-28 15:24 UTC (permalink / raw)
  To: Donald Douwsma; +Cc: linux-xfs

On Wed, Sep 28, 2022 at 03:53:07PM +1000, Donald Douwsma wrote:
> stobj_unpack_sessinfo returns bool_t, fix logic in pi_addfile so errors
> can be properly reported.
> 
> signed-off-by: Donald Douwsma <ddouwsma@redhat.com>

  ^ Needs correct capitalisation.

With that fixed,
Reviewed-by: Darrick J. Wong <djwong@kernel.org>

--D

> ---
>  restore/content.c | 13 +++++--------
>  1 file changed, 5 insertions(+), 8 deletions(-)
> 
> diff --git a/restore/content.c b/restore/content.c
> index b3999f9..04b6f81 100644
> --- a/restore/content.c
> +++ b/restore/content.c
> @@ -5463,17 +5463,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 "
> -- 
> 2.31.1
> 

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 1/3] xfsrestore: fix inventory unpacking
  2022-09-28 15:12   ` Darrick J. Wong
@ 2022-09-28 23:02     ` Donald Douwsma
  0 siblings, 0 replies; 13+ messages in thread
From: Donald Douwsma @ 2022-09-28 23:02 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: linux-xfs



On 29/09/2022 01:12, Darrick J. Wong wrote:
> On Wed, Sep 28, 2022 at 03:53:05PM +1000, Donald Douwsma wrote:
>> 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 <ddouwsma@redhat.com>
>> ---
>>   inventory/inv_stobj.c | 27 +++++++--------------------
>>   1 file changed, 7 insertions(+), 20 deletions(-)
>>
>> diff --git a/inventory/inv_stobj.c b/inventory/inv_stobj.c
>> index c20e71c..5075ee4 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,26 +1087,13 @@ 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);
> 
> I wonder, do you need to preserve this behavior (writing the inventory
> records to "moids")?  testmain.c seems to want to read the file, but
> OTOH that looks like some sort of test program; arbitrarily overwriting
> a file in $PWD seems ... risky?  And I guess this chunk has never run.
> 
> Also testmain.c has such gems as:
> 
> "/dana/hates/me"
> 
> "/the/krays"
> 
> and mentions that -I supersedes most of its functionality.  So maybe
> that's why you deleted moids?  Aside from the name just sounding gross?
> 
> :)
> 

I think they were trying to mirror what's done in stobj_pack_sessinfo(),
which takes a file handle as a parameter, possibly its meant to provide
locking while packing for the inventory. Calling put_invtrecord without
having first called get_invtrecord seems unbalanced, and the unneeded
file "mods" was just left around. Either way the target for
stobj_unpack_sessinfo is a buffer not a file.

AFIKT this was a work in progress by someone who never got to finish it.

>> -		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,
> 
> Nit: trailing whitespace                                      here ^

Urg, sorry I thought I'd fixed all the white-space problems.

> 
> If the the answer to the above question is "Yeah, nobody wants the moids
> file" then:

Yes, I think moids was a hack that shouldn't have been there.

> Reviewed-by: Darrick J. Wong <djwong@kernel.org>
> 
> --D
> 
>> +					     (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
>> -- 
>> 2.31.1
>>
> 


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 2/3] xfsrestore: stobj_unpack_sessinfo cleanup
  2022-09-28 15:23   ` Darrick J. Wong
@ 2022-09-28 23:12     ` Donald Douwsma
  2022-09-28 23:28       ` Donald Douwsma
  0 siblings, 1 reply; 13+ messages in thread
From: Donald Douwsma @ 2022-09-28 23:12 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: linux-xfs



On 29/09/2022 01:23, Darrick J. Wong wrote:
> On Wed, Sep 28, 2022 at 03:53:06PM +1000, Donald Douwsma wrote:
>> stobj_unpack_sessinfo should be the reverse of stobj_pack_sessinfo, make
>> this clearer with respect to the session header and streams processing.
>>
>> signed-off-by: Donald Douwsma <ddouwsma@redhat.com>
>> ---
>>   inventory/inv_stobj.c | 13 +++++++------
>>   1 file changed, 7 insertions(+), 6 deletions(-)
>>
>> diff --git a/inventory/inv_stobj.c b/inventory/inv_stobj.c
>> index 5075ee4..521acff 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);
>>   
>> -
>>   	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);
>>   
>>   	/* 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,
> 
> Nit: trailing whitespace                        here ^

nod

> 
>> +				  (invt_stream_t *)tmpbuf, 1);
>> +		bcopy(tmpbuf, p, sizeof(invt_stream_t));
>> +		p += sizeof(invt_stream_t);
> 
> Ok, so we translate p into tmpbuf, then bcopy tmpbuf back to p.  That
> part makes sense, but I am puzzled by what stobj_pack_sessinfo does:
> 
> 	for (i = 0; i < ses->s_cur_nstreams; i++) {
> 		xlate_invt_stream(strms, (invt_stream_t *)sesbuf, 1);
> 		sesbuf += sizeof(invt_stream_t);
> 	}
> 
> Why isn't that callsite xlate_invt_stream(&strms[i], ...); ?

Thanks! Yes, that's wrong, like the existing code it only worked/works
because there's only ever one stream. From the manpage "The third level
is media stream (currently only one  stream is supported)". Will fix.

> 
> --D
> 
>> +	}
>>   
>>   	/* all the media files */
>>   	s->mfiles = (invt_mediafile_t *)p;
>> -- 
>> 2.31.1
>>
> 


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 3/3] xfsrestore: untangle inventory unpacking logic
  2022-09-28 15:24   ` Darrick J. Wong
@ 2022-09-28 23:12     ` Donald Douwsma
  0 siblings, 0 replies; 13+ messages in thread
From: Donald Douwsma @ 2022-09-28 23:12 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: linux-xfs



On 29/09/2022 01:24, Darrick J. Wong wrote:
> On Wed, Sep 28, 2022 at 03:53:07PM +1000, Donald Douwsma wrote:
>> stobj_unpack_sessinfo returns bool_t, fix logic in pi_addfile so errors
>> can be properly reported.
>>
>> signed-off-by: Donald Douwsma <ddouwsma@redhat.com>
> 
>    ^ Needs correct capitalisation.
> 
> With that fixed,
> Reviewed-by: Darrick J. Wong <djwong@kernel.org>

Will fix for all three patches.

Thanks again,

Don

> 
>> ---
>>   restore/content.c | 13 +++++--------
>>   1 file changed, 5 insertions(+), 8 deletions(-)
>>
>> diff --git a/restore/content.c b/restore/content.c
>> index b3999f9..04b6f81 100644
>> --- a/restore/content.c
>> +++ b/restore/content.c
>> @@ -5463,17 +5463,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 "
>> -- 
>> 2.31.1
>>
> 


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 2/3] xfsrestore: stobj_unpack_sessinfo cleanup
  2022-09-28 23:12     ` Donald Douwsma
@ 2022-09-28 23:28       ` Donald Douwsma
  2022-09-29 18:01         ` Darrick J. Wong
  0 siblings, 1 reply; 13+ messages in thread
From: Donald Douwsma @ 2022-09-28 23:28 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: linux-xfs



On 29/09/2022 09:12, Donald Douwsma wrote:
> 
> 
> On 29/09/2022 01:23, Darrick J. Wong wrote:
>> On Wed, Sep 28, 2022 at 03:53:06PM +1000, Donald Douwsma wrote:
>>> stobj_unpack_sessinfo should be the reverse of stobj_pack_sessinfo, make
>>> this clearer with respect to the session header and streams processing.
>>>
>>> signed-off-by: Donald Douwsma <ddouwsma@redhat.com>
>>> ---
>>>   inventory/inv_stobj.c | 13 +++++++------
>>>   1 file changed, 7 insertions(+), 6 deletions(-)
>>>
>>> diff --git a/inventory/inv_stobj.c b/inventory/inv_stobj.c
>>> index 5075ee4..521acff 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);
>>> -
>>>       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);
>>>       /* 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,
>>
>> Nit: trailing whitespace                        here ^
> 
> nod
> 
>>
>>> +                  (invt_stream_t *)tmpbuf, 1);
>>> +        bcopy(tmpbuf, p, sizeof(invt_stream_t));
>>> +        p += sizeof(invt_stream_t);
>>
>> Ok, so we translate p into tmpbuf, then bcopy tmpbuf back to p.  That
>> part makes sense, but I am puzzled by what stobj_pack_sessinfo does:
>>
>>     for (i = 0; i < ses->s_cur_nstreams; i++) {
>>         xlate_invt_stream(strms, (invt_stream_t *)sesbuf, 1);
>>         sesbuf += sizeof(invt_stream_t);
>>     }
>>
>> Why isn't that callsite xlate_invt_stream(&strms[i], ...); ?
> 
> Thanks! Yes, that's wrong, like the existing code it only worked/works
> because there's only ever one stream. From the manpage "The third level
> is media stream (currently only one  stream is supported)". Will fix.

Or should I just drop this clean-up? I think what I'm saying is right,
but its a clean-up for a feature that cant be used. I doubt anyone is
going to add multiple stream support now, whatever that was intended
for.


> 
>>
>> --D
>>
>>> +    }
>>>       /* all the media files */
>>>       s->mfiles = (invt_mediafile_t *)p;
>>> -- 
>>> 2.31.1
>>>
>>


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 2/3] xfsrestore: stobj_unpack_sessinfo cleanup
  2022-09-28 23:28       ` Donald Douwsma
@ 2022-09-29 18:01         ` Darrick J. Wong
  2022-10-06  4:43           ` Donald Douwsma
  0 siblings, 1 reply; 13+ messages in thread
From: Darrick J. Wong @ 2022-09-29 18:01 UTC (permalink / raw)
  To: Donald Douwsma; +Cc: linux-xfs

On Thu, Sep 29, 2022 at 09:28:24AM +1000, Donald Douwsma wrote:
> 
> 
> On 29/09/2022 09:12, Donald Douwsma wrote:
> > 
> > 
> > On 29/09/2022 01:23, Darrick J. Wong wrote:
> > > On Wed, Sep 28, 2022 at 03:53:06PM +1000, Donald Douwsma wrote:
> > > > stobj_unpack_sessinfo should be the reverse of stobj_pack_sessinfo, make
> > > > this clearer with respect to the session header and streams processing.
> > > > 
> > > > signed-off-by: Donald Douwsma <ddouwsma@redhat.com>
> > > > ---
> > > >   inventory/inv_stobj.c | 13 +++++++------
> > > >   1 file changed, 7 insertions(+), 6 deletions(-)
> > > > 
> > > > diff --git a/inventory/inv_stobj.c b/inventory/inv_stobj.c
> > > > index 5075ee4..521acff 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);
> > > > -
> > > >       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);
> > > >       /* 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,
> > > 
> > > Nit: trailing whitespace                        here ^
> > 
> > nod
> > 
> > > 
> > > > +                  (invt_stream_t *)tmpbuf, 1);
> > > > +        bcopy(tmpbuf, p, sizeof(invt_stream_t));
> > > > +        p += sizeof(invt_stream_t);
> > > 
> > > Ok, so we translate p into tmpbuf, then bcopy tmpbuf back to p.  That
> > > part makes sense, but I am puzzled by what stobj_pack_sessinfo does:
> > > 
> > >     for (i = 0; i < ses->s_cur_nstreams; i++) {
> > >         xlate_invt_stream(strms, (invt_stream_t *)sesbuf, 1);
> > >         sesbuf += sizeof(invt_stream_t);
> > >     }
> > > 
> > > Why isn't that callsite xlate_invt_stream(&strms[i], ...); ?
> > 
> > Thanks! Yes, that's wrong, like the existing code it only worked/works
> > because there's only ever one stream. From the manpage "The third level
> > is media stream (currently only one  stream is supported)". Will fix.
> 
> Or should I just drop this clean-up? I think what I'm saying is right,
> but its a clean-up for a feature that cant be used. I doubt anyone is
> going to add multiple stream support now, whatever that was intended
> for.

I don't know.  On the one hand I could see an argument for at least
being able to restore multiple streams, but then the dump program has
been screwing that up for years and nobody noticed.  I can't tell from
the source code what shape the multistream support is in, so I guess you
have some research to do? <shrug>  I suppose you could see what happens
if you try to set up multiple streams, but I have no idea ... what that
means.

Sorry that's a nonanswer. :(

--D

> 
> > 
> > > 
> > > --D
> > > 
> > > > +    }
> > > >       /* all the media files */
> > > >       s->mfiles = (invt_mediafile_t *)p;
> > > > -- 
> > > > 2.31.1
> > > > 
> > > 
> 

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 2/3] xfsrestore: stobj_unpack_sessinfo cleanup
  2022-09-29 18:01         ` Darrick J. Wong
@ 2022-10-06  4:43           ` Donald Douwsma
  0 siblings, 0 replies; 13+ messages in thread
From: Donald Douwsma @ 2022-10-06  4:43 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: linux-xfs



On 30/09/2022 04:01, Darrick J. Wong wrote:
> On Thu, Sep 29, 2022 at 09:28:24AM +1000, Donald Douwsma wrote:
>>
>>
>> On 29/09/2022 09:12, Donald Douwsma wrote:
>>>
>>>
>>> On 29/09/2022 01:23, Darrick J. Wong wrote:
>>>> On Wed, Sep 28, 2022 at 03:53:06PM +1000, Donald Douwsma wrote:
>>>>> stobj_unpack_sessinfo should be the reverse of stobj_pack_sessinfo, make
>>>>> this clearer with respect to the session header and streams processing.
>>>>>
>>>>> signed-off-by: Donald Douwsma <ddouwsma@redhat.com>
>>>>> ---
>>>>>    inventory/inv_stobj.c | 13 +++++++------
>>>>>    1 file changed, 7 insertions(+), 6 deletions(-)
>>>>>
>>>>> diff --git a/inventory/inv_stobj.c b/inventory/inv_stobj.c
>>>>> index 5075ee4..521acff 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);
>>>>> -
>>>>>        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);
>>>>>        /* 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,
>>>>
>>>> Nit: trailing whitespace                        here ^
>>>
>>> nod
>>>
>>>>
>>>>> +                  (invt_stream_t *)tmpbuf, 1);
>>>>> +        bcopy(tmpbuf, p, sizeof(invt_stream_t));
>>>>> +        p += sizeof(invt_stream_t);
>>>>
>>>> Ok, so we translate p into tmpbuf, then bcopy tmpbuf back to p.  That
>>>> part makes sense, but I am puzzled by what stobj_pack_sessinfo does:
>>>>
>>>>      for (i = 0; i < ses->s_cur_nstreams; i++) {
>>>>          xlate_invt_stream(strms, (invt_stream_t *)sesbuf, 1);
>>>>          sesbuf += sizeof(invt_stream_t);
>>>>      }
>>>>
>>>> Why isn't that callsite xlate_invt_stream(&strms[i], ...); ?
>>>
>>> Thanks! Yes, that's wrong, like the existing code it only worked/works
>>> because there's only ever one stream. From the manpage "The third level
>>> is media stream (currently only one  stream is supported)". Will fix.
>>
>> Or should I just drop this clean-up? I think what I'm saying is right,
>> but its a clean-up for a feature that cant be used. I doubt anyone is
>> going to add multiple stream support now, whatever that was intended
>> for.
> 
> I don't know.  On the one hand I could see an argument for at least
> being able to restore multiple streams, but then the dump program has
> been screwing that up for years and nobody noticed.  I can't tell from
> the source code what shape the multistream support is in, so I guess you
> have some research to do? <shrug>  I suppose you could see what happens
> if you try to set up multiple streams, but I have no idea ... what that
> means.
> 
> Sorry that's a nonanswer. :(

Actually this helped a lot, I realised that xfsdump takes multiple -f
arguments on the command line to setup the streams. This allowed me to
do some testing.

TLDR Using the current xfsprogs with multiple streams dumps ok (though
the second stream seems to end up with a higher end ino in its
inventory). But restore asserts when restoring the online inventory as
it fails to consume the media records [1].

With this series it restores ok and restores the inventory without
asserting [2].

If I drop this stobj_unpack_sessinfo cleanup patch we crash when
iterating over the media files for the streams[3].

I'll get a v3 series out including the change to stobj_pack_sessinfo()

Don


[1] Testing dump and restore with current xfsdump.

[root@rhel8 ~]# rpm -q xfsdump
xfsdump-3.1.8-2.el8.x86_64
[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)

1006 stobj_unpack_sessinfo(
...
1112         /* sanity check the size of the buffer given to us vs. the 
size it
1113            should be */
1114         if ((size_t) (p - (char *) bufp) != bufsz) {
1115                 mlog(MLOG_DEBUG | MLOG_INV, "p-bufp %d != bufsz %d 
entsz %d\n",
1116                       (int)(p - (char *) bufp), (int) bufsz,
1117               (int) (sizeof(invt_entry_t)));
1118         }
1119         assert((size_t) (p - (char *) bufp) == bufsz);


[2] Testing with this series

# remove the houskeeping dir
[root@rhel8 xfsdump-dev]# rm -rf /tmp/test1/*

[root@rhel8 xfsdump-dev]# restore/xfsrestore -L Test1 -f /dev/nst0 
/tmp/test1/
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: searching media for dump
restore/xfsrestore: preparing drive
restore/xfsrestore: examining media file 2
restore/xfsrestore: found dump matching specified label:
restore/xfsrestore: hostname: rhel8
restore/xfsrestore: mount point: /boot
restore/xfsrestore: volume: /dev/sda1
restore/xfsrestore: session time: Thu Oct  6 13:50:45 2022
restore/xfsrestore: level: 0
restore/xfsrestore: session label: "Test1"
restore/xfsrestore: media label: "tape1"
restore/xfsrestore: file system id: 26dd5aa0-b901-4cf5-9b68-0c5753cb3ab8
restore/xfsrestore: session id: aa25fa48-4493-45c7-9027-61e53e486445
restore/xfsrestore: media id: adb31f2a-f026-4597-a20a-326f28ecbaf1
restore/xfsrestore: searching media for directory dump
restore/xfsrestore: rewinding
restore/xfsrestore: examining media file 0
restore/xfsrestore: reading directories
restore/xfsrestore: 9 directories and 320 entries processed
restore/xfsrestore: directory post-processing
restore/xfsrestore: restoring non-directory files
restore/xfsrestore: examining media file 1
restore/xfsrestore: incorporating on-media session inventory into online 
inventory
restore/xfsrestore: /var/lib/xfsdump/inventory created
restore/xfsrestore: using on-media session inventory

  ============================ change media dialog 
=============================

please change media in drive
1: media change declined (timeout in 3600 sec)
2: display media inventory status
3: list needed media objects
4: media changed (default)
  -> 1
media change aborted

  --------------------------------- end dialog 
---------------------------------

restore/xfsrestore: NOTE: restore interrupted: 21 seconds elapsed: may 
resume later using -R option
restore/xfsrestore: Restore Summary:
restore/xfsrestore:   stream 0 /dev/nst0 QUIT (media is no longer usable)
restore/xfsrestore: Restore Status: QUIT
[root@rhel8 xfsdump-dev]#

[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:		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:	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:	adb31f2a-f026-4597-a20a-326f28ecbaf1
		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:	22224f02-b6c7-47d5-ad61-a61ba071c8a8
xfsdump: Dump Status: SUCCESS
[root@rhel8 xfsdump-dev]#

[root@rhel8 xfsdump-dev]# mkdir /tmp/test1_
[root@rhel8 xfsdump-dev]# restore/xfsrestore -L Test1 -f /dev/nst0 -f 
/dev/nst1 /tmp/test1_
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: drive 0: using online session inventory
restore/xfsrestore: drive 0: searching media for directory dump
restore/xfsrestore: drive 0: preparing drive
restore/xfsrestore: drive 0: examining media file 2
restore/xfsrestore: drive 0: rewinding
restore/xfsrestore: drive 0: examining media file 0
restore/xfsrestore: drive 0: reading directories
restore/xfsrestore: drive 0: 9 directories and 320 entries processed
restore/xfsrestore: drive 0: directory post-processing
restore/xfsrestore: drive 0: restoring non-directory files
restore/xfsrestore: drive 0: examining media file 1
restore/xfsrestore: drive 0: NOTE: please change media: type ^C to 
confirm media change
restore/xfsrestore: drive 1: preparing drive
restore/xfsrestore: drive 1: examining media file 2
restore/xfsrestore: drive 1: rewinding
restore/xfsrestore: drive 1: examining media file 0
restore/xfsrestore: drive 1: seeking past media file directory dump
restore/xfsrestore: drive 1: restoring non-directory files
restore/xfsrestore: drive 1: examining media file 1
restore/xfsrestore: restore complete: 3 seconds elapsed
restore/xfsrestore: Restore Summary:
restore/xfsrestore:   stream 0 /dev/nst0 ALREADY_DONE (another stream 
completed the operation)
restore/xfsrestore:   stream 1 /dev/nst1 OK (success)
restore/xfsrestore: Restore Status: SUCCESS
[root@rhel8 xfsdump-dev]# xfsdump -I


[3] Removing this stobj_unpack_sessinfo cleanup Segfaults.


[root@rhel8 xfsdump-dev]# gdb restore/xfsrestore
Reading symbols from restore/xfsrestore...done.
(gdb) run -L Test1 -f /dev/nst0 -f /dev/nst1 /tmp/test1
Starting program: 
/root/Devel/upstream/xfs/xfsdump-dev/restore/xfsrestore -L Test1 -f 
/dev/nst0 -f /dev/nst1 /tmp/test1
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
/root/Devel/upstream/xfs/xfsdump-dev/restore/xfsrestore: using scsi tape 
(drive_scsitape) strategy
/root/Devel/upstream/xfs/xfsdump-dev/restore/xfsrestore: using scsi tape 
(drive_scsitape) strategy
/root/Devel/upstream/xfs/xfsdump-dev/restore/xfsrestore: version 3.1.10 
(dump format 3.0) - type ^C for status and control
[New Thread 0x7ffff6b5b700 (LWP 2251)]
/root/Devel/upstream/xfs/xfsdump-dev/restore/xfsrestore: drive 0: 
searching media for dump
/root/Devel/upstream/xfs/xfsdump-dev/restore/xfsrestore: drive 0: 
preparing drive
[New Thread 0x7ffff635a700 (LWP 2252)]
/root/Devel/upstream/xfs/xfsdump-dev/restore/xfsrestore: drive 1: 
searching media for dump
/root/Devel/upstream/xfs/xfsdump-dev/restore/xfsrestore: drive 1: 
preparing drive
/root/Devel/upstream/xfs/xfsdump-dev/restore/xfsrestore: drive 0: 
examining media file 1
/root/Devel/upstream/xfs/xfsdump-dev/restore/xfsrestore: drive 0: found 
dump matching specified label:
/root/Devel/upstream/xfs/xfsdump-dev/restore/xfsrestore: drive 0: 
hostname: rhel8
/root/Devel/upstream/xfs/xfsdump-dev/restore/xfsrestore: drive 0: mount 
point: /boot
/root/Devel/upstream/xfs/xfsdump-dev/restore/xfsrestore: drive 0: 
volume: /dev/sda1
/root/Devel/upstream/xfs/xfsdump-dev/restore/xfsrestore: drive 0: 
session time: Thu Oct  6 13:50:45 2022
/root/Devel/upstream/xfs/xfsdump-dev/restore/xfsrestore: drive 0: level: 0
/root/Devel/upstream/xfs/xfsdump-dev/restore/xfsrestore: drive 0: 
session label: "Test1"
/root/Devel/upstream/xfs/xfsdump-dev/restore/xfsrestore: drive 0: media 
label: "tape1"
/root/Devel/upstream/xfs/xfsdump-dev/restore/xfsrestore: drive 0: file 
system id: 26dd5aa0-b901-4cf5-9b68-0c5753cb3ab8
/root/Devel/upstream/xfs/xfsdump-dev/restore/xfsrestore: drive 0: 
session id: aa25fa48-4493-45c7-9027-61e53e486445
/root/Devel/upstream/xfs/xfsdump-dev/restore/xfsrestore: drive 0: media 
id: adb31f2a-f026-4597-a20a-326f28ecbaf1

Thread 2 "xfsrestore" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff6b5b700 (LWP 2251)]
0x000000000041fce3 in stobj_unpack_sessinfo (bufp=<optimized out>, 
bufp@entry=0x7ffff7f42010, bufsz=<optimized out>, s=s@entry=0x7ffff6b59880)
     at inv_stobj.c:1094
1094				bcopy(tmpbuf, p, sizeof(invt_mediafile_t));
Missing separate debuginfos, use: yum debuginfo-install 
libuuid-2.32.1-27.el8.x86_64 xfsprogs-5.0.0-8.el8.x86_64
(gdb) bt
#0  0x000000000041fce3 in stobj_unpack_sessinfo (bufp=<optimized out>, 
bufp@entry=0x7ffff7f42010, bufsz=<optimized out>,
     s=s@entry=0x7ffff6b59880) at inv_stobj.c:1094
#1  0x000000000042525b in pi_addfile (mrhdrp=<optimized out>, 
scrhdrp=<optimized out>, drivep=0x65a700, drhdrp=<optimized out>,
     drhdrp=<optimized out>, grhdrp=<optimized out>, Mediap=<optimized 
out>) at content.c:5468
#2  0x000000000042c2ce in content_stream_restore (thrdix=thrdix@entry=0) 
at content.c:2198
#3  0x000000000041614e in childmain (arg1=0x0) at main.c:1465
#4  0x0000000000406daa in cldmgr_entry (arg1=0x652200 <cld>) at cldmgr.c:237
#5  0x00007ffff75a514a in start_thread (arg=<optimized out>) at 
pthread_create.c:479
#6  0x00007ffff72d4dc3 in clone () at 
../sysdeps/unix/sysv/linux/x86_64/clone.S:95
(gdb) list
1089		s->mfiles = (invt_mediafile_t *)p;
1090		for (i=0; i< s->ses->s_cur_nstreams; i++) {
1091			for (j=0; j < s->strms[i].st_nmediafiles; j++) {
1092				xlate_invt_mediafile((invt_mediafile_t *)p,
1093						     (invt_mediafile_t *)tmpbuf, 1);
1094				bcopy(tmpbuf, p, sizeof(invt_mediafile_t));
1095				p +=  sizeof(invt_mediafile_t);
1096			}
1097		}
1098	
(gdb) info locals
i = <optimized out>
j = 832
tmpbuf = 0x7ffff0006f60 ""
p = 0x7ffff7f89f78 ""
__PRETTY_FUNCTION__ = "stobj_unpack_sessinfo"
__x = <optimized out>
__x = <optimized out>
(gdb)

We dont have 832 media files, i think this was setup to fail when didnt
decode the session's st_mediafiles. I steped over this in gdb and
confirmed that it was processing the second session when it did this.

(gdb) p *(s->strms+0)
$6 = {st_startino = {ino = 133, offset = 0}, st_endino = {ino = 28839, 
offset = 0}, st_firstmfile = 5408, st_lastmfile = 5760,
   st_cmdarg = "/dev/nst0", '\000' <repeats 246 times>, st_nmediafiles = 
2, st_interrupted = 1, st_padding = '\000' <repeats 15 times>}

(gdb) p *(s->strms+1)
$7 = {st_startino = {ino = 9583660007044415488, offset = 0}, st_endino = 
{ino = 12065143401725558784, offset = 0},
   st_firstmfile = 2311753983724617728, st_lastmfile = 
-9217179587367141376, st_cmdarg = "/dev/nst0", '\000' <repeats 246 times>,
   st_nmediafiles = 33554432, st_interrupted = 16777216, st_padding = 
'\000' <repeats 15 times>}
(gdb)

$ printf "0x%x\n" 33554432
0x2000000

As Darrick pointed out the second stream is a duplicate of the first
stream since stobj_pack_sessinfo just used the first stream for both
calls in the loop as confirmed by the duplicate st_cmdarg = "/dev/nst0.


> 
> --D
> 
>>
>>>
>>>>
>>>> --D
>>>>
>>>>> +    }
>>>>>        /* all the media files */
>>>>>        s->mfiles = (invt_mediafile_t *)p;
>>>>> -- 
>>>>> 2.31.1
>>>>>
>>>>
>>
> 


^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2022-10-06  4:43 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-28  5:53 [PATCH v2 0/3] xfsrestore: fix inventory unpacking Donald Douwsma
2022-09-28  5:53 ` [PATCH 1/3] " Donald Douwsma
2022-09-28 15:12   ` Darrick J. Wong
2022-09-28 23:02     ` Donald Douwsma
2022-09-28  5:53 ` [PATCH 2/3] xfsrestore: stobj_unpack_sessinfo cleanup Donald Douwsma
2022-09-28 15:23   ` Darrick J. Wong
2022-09-28 23:12     ` Donald Douwsma
2022-09-28 23:28       ` Donald Douwsma
2022-09-29 18:01         ` Darrick J. Wong
2022-10-06  4:43           ` Donald Douwsma
2022-09-28  5:53 ` [PATCH 3/3] xfsrestore: untangle inventory unpacking logic Donald Douwsma
2022-09-28 15:24   ` Darrick J. Wong
2022-09-28 23:12     ` Donald Douwsma

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.