All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC][PATCH] xfs_restore: detect rtinherit on destination
@ 2019-06-05 21:16 Sheena Artrip
  2019-06-06 14:11 ` Eric Sandeen
  0 siblings, 1 reply; 14+ messages in thread
From: Sheena Artrip @ 2019-06-05 21:16 UTC (permalink / raw)
  To: linux-xfs

When running xfs_restore with a non-rtdev dump,
it will ignore any rtinherit flags on the destination
and send I/O to the metadata region.

Instead, detect rtinherit on the destination XFS fileystem root inode
and use that to override the incoming inode flags.

Original version of this patch missed some branches so multiple
invocations of xfsrestore onto the same fs caused
the rtinherit bit to get re-removed. There could be some
additional edge cases in non-realtime to realtime workflows so
the outstanding question would be: is it worth supporting?

Signed-off-by: Sheena Artrip <sheena.artrip@gmail.com>
---
 restore/content.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 65 insertions(+)

diff --git a/restore/content.c b/restore/content.c
index 6b22965..96dd698 100644
--- a/restore/content.c
+++ b/restore/content.c
@@ -670,6 +670,9 @@ struct tran {
                 /* to establish critical regions while updating pers
                  * inventory
                  */
+       bool_t t_dstisrealtime;
+               /* to force the realtime flag on incoming inodes
+                */
 };

 typedef struct tran tran_t;
@@ -1803,6 +1806,51 @@ content_init(int argc, char *argv[], size64_t vmsz)
                 free_handle(fshanp, fshlen);
         }

+       /* determine if destination root inode has rtinherit.
+        * If so, we should force XFS_REALTIME on the incoming inodes.
+        */
+       if (persp->a.dstdirisxfspr) {
+               stat64_t rootstat;
+               xfs_fsop_bulkreq_t bulkreq;
+               int ocount = 0;
+               xfs_bstat_t *sc_rootxfsstatp;
+
+               int rootfd = open(persp->a.dstdir, O_RDONLY);
+
+               sc_rootxfsstatp =
+                       (xfs_bstat_t *)calloc(1, sizeof(xfs_bstat_t));
+               assert(sc_rootxfsstatp);
+
+               /* Get the inode of the destination folder */
+               int rval = fstat64(rootfd, &rootstat);
+               if (rval) {
+                       (void)close(rootfd);
+                       mlog(MLOG_NORMAL, _(
+                         "could not stat %s\n"),
+                         persp->a.dstdir);
+                       return BOOL_FALSE;
+               }
+
+               /* Get the first valid (i.e. root) inode in this fs */
+               bulkreq.lastip = (__u64 *)&rootstat.st_ino;
+               bulkreq.icount = 1;
+               bulkreq.ubuffer = sc_rootxfsstatp;
+               bulkreq.ocount = &ocount;
+               if (ioctl(rootfd, XFS_IOC_FSBULKSTAT, &bulkreq) < 0) {
+                       (void)close(rootfd);
+                       mlog(MLOG_ERROR,
+                             _("failed to get bulkstat information
for root inode\n"));
+                       return BOOL_FALSE;
+               }
+
+               (void)close(rootfd);
+
+               /* test against rtinherit */
+               if((sc_rootxfsstatp->bs_xflags & XFS_XFLAG_RTINHERIT) != 0) {
+                       tranp->t_dstisrealtime = true;
+               }
+       }
+
         /* map in pers. inv. descriptors, if any. NOTE: this ptr is to be
          * referenced ONLY via the macros provided; the descriptors will be
          * occasionally remapped, causing the ptr to change.
@@ -7270,6 +7318,10 @@ restore_file_cb(void *cp, bool_t linkpr, char
*path1, char *path2)
         bool_t ahcs = contextp->cb_ahcs;
         stream_context_t *strctxp = (stream_context_t *)drivep->d_strmcontextp;

+       if (tranp->t_dstisrealtime) {
+               bstatp->bs_xflags |= XFS_XFLAG_REALTIME;
+       }
+
         int rval;
         bool_t ok;

@@ -7480,6 +7532,10 @@ restore_reg(drive_t *drivep,
         if (tranp->t_toconlypr)
                 return BOOL_TRUE;

+       if (tranp->t_dstisrealtime) {
+             bstatp->bs_xflags |= XFS_XFLAG_REALTIME;
+       }
+
         oflags = O_CREAT | O_RDWR;
         if (persp->a.dstdirisxfspr && bstatp->bs_xflags & XFS_XFLAG_REALTIME)
                 oflags |= O_DIRECT;
@@ -8470,6 +8526,11 @@ restore_extent(filehdr_t *fhdrp,
                 }
                 assert(new_off == off);
         }
+
+       if (tranp->t_dstisrealtime) {
+             bstatp->bs_xflags |= XFS_XFLAG_REALTIME;
+       }
+
         if ((fd != -1) && (bstatp->bs_xflags & XFS_XFLAG_REALTIME)) {
                 if ((ioctl(fd, XFS_IOC_DIOINFO, &da) < 0)) {
                         mlog(MLOG_NORMAL | MLOG_WARNING, _(
@@ -8729,6 +8790,10 @@ restore_extattr(drive_t *drivep,

         assert(extattrbufp);

+       if (tranp->t_dstisrealtime) {
+               bstatp->bs_xflags |= XFS_XFLAG_REALTIME;
+       }
+
         if (!isdirpr)
                 isfilerestored = partial_check(bstatp->bs_ino,
bstatp->bs_size);

--
2.17.1

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

end of thread, other threads:[~2019-06-18 15:10 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-06-05 21:16 [RFC][PATCH] xfs_restore: detect rtinherit on destination Sheena Artrip
2019-06-06 14:11 ` Eric Sandeen
2019-06-06 18:12   ` Sheena Artrip
2019-06-06 18:39     ` Eric Sandeen
2019-06-06 19:50       ` Sheena Artrip
2019-06-06 19:57       ` [PATCH v2] " Sheena Artrip
2019-06-06 21:23         ` Eric Sandeen
2019-06-06 21:50           ` Dave Chinner
2019-06-06 22:08             ` Eric Sandeen
2019-06-06 22:36               ` Dave Chinner
2019-06-17 22:09                 ` Sheena Artrip
2019-06-17 22:55                   ` Darrick J. Wong
2019-06-18  6:28                     ` Sheena Artrip
2019-06-18 15:09                       ` Darrick J. Wong

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.