]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_io: add mremap command
authorEric Sandeen <sandeen@redhat.com>
Mon, 15 Sep 2014 23:23:41 +0000 (09:23 +1000)
committerDave Chinner <david@fromorbit.com>
Mon, 15 Sep 2014 23:23:41 +0000 (09:23 +1000)
This adds a simple mremap command to xfs_io.

It does not take a start address; it uses the existing start
address, so the sized passed will be the new total size of the
mapping.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
io/mmap.c
man/man8/xfs_io.8

index ea7498fc7871e099f2828194f114ae293d61e991..565a54176b05b7cebb10efefb17e3107cfd721ca 100644 (file)
--- a/io/mmap.c
+++ b/io/mmap.c
@@ -29,6 +29,7 @@ static cmdinfo_t mread_cmd;
 static cmdinfo_t msync_cmd;
 static cmdinfo_t munmap_cmd;
 static cmdinfo_t mwrite_cmd;
+static cmdinfo_t mremap_cmd;
 
 mmap_region_t  *maptable;
 int            mapcount;
@@ -574,6 +575,66 @@ mwrite_f(
        return 0;
 }
 
+static void
+mremap_help(void)
+{
+       printf(_(
+"\n"
+" resizes the current memory mapping\n"
+"\n"
+" Examples:\n"
+" 'mremap 8192' - resizes the current mapping to 8192 bytes.\n"
+"\n"
+" Resizes the mappping, growing or shrinking from the current size.\n"
+" The default stored value is 'X', repeated to fill the range specified.\n"
+" -f -- use the MREMAP_FIXED flag\n"
+" -m -- use the MREMAP_MAYMOVE flag\n"
+"\n"));
+}
+
+int
+mremap_f(
+       int             argc,
+       char            **argv)
+{
+       ssize_t         new_length;
+       void            *new_addr;
+       int             flags = 0;
+       int             c;
+       size_t          blocksize, sectsize;
+
+       while ((c = getopt(argc, argv, "fm")) != EOF) {
+               switch (c) {
+               case 'f':
+                       flags = MREMAP_FIXED|MREMAP_MAYMOVE;
+                       break;
+               case 'm':
+                       flags = MREMAP_MAYMOVE;
+                       break;
+               default:
+                       return command_usage(&mremap_cmd);
+               }
+       }
+
+       init_cvtnum(&blocksize, &sectsize);
+       new_length = cvtnum(blocksize, sectsize, argv[optind]);
+       if (new_length < 0) {
+               printf(_("non-numeric offset argument -- %s\n"),
+                       argv[optind]);
+               return 0;
+       }
+
+       new_addr = mremap(mapping->addr, mapping->length, new_length, flags);
+       if (new_addr == MAP_FAILED)
+               perror("mremap");
+       else {
+               mapping->addr = new_addr;
+               mapping->length = new_length;
+       }
+
+       return 0;
+}
+
 void
 mmap_init(void)
 {
@@ -628,9 +689,21 @@ mmap_init(void)
                _("writes data into a region in the current memory mapping");
        mwrite_cmd.help = mwrite_help;
 
+       mremap_cmd.name = "mremap";
+       mremap_cmd.altname = "mrm";
+       mremap_cmd.cfunc = mremap_f;
+       mremap_cmd.argmin = 1;
+       mremap_cmd.argmax = 2;
+       mremap_cmd.flags = CMD_NOFILE_OK | CMD_FOREIGN_OK;
+       mremap_cmd.args = _("[-m|-f] newsize");
+       mremap_cmd.oneline =
+               _("alters the size of the current memory mapping");
+       mremap_cmd.help = mremap_help;
+
        add_command(&mmap_cmd);
        add_command(&mread_cmd);
        add_command(&msync_cmd);
        add_command(&munmap_cmd);
        add_command(&mwrite_cmd);
+       add_command(&mremap_cmd);
 }
index e1a3e1a41a7df3bb639ff621c2e7a3381e43d4e6..e40fbf9304a57527044880745530791154b55403 100644 (file)
@@ -501,6 +501,20 @@ See the
 .B mmap
 command.
 .TP
+.BI "mremap [ \-f ] [ \-m ] " new_length
+Changes the current mapping size to
+.IR new_length .
+Whether the mapping may be moved is controlled by the flags passed;
+MREMAP_FIXED
+.RB ( \-f ),
+or MREMAP_MAYMOVE
+.RB ( \-m ).
+.TP
+.B mrm
+See the
+.B mremap
+command.
+.TP
 .B munmap
 Unmaps the current memory mapping.
 .TP