lkml.org 
[lkml]   [2013]   [Sep]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [RFC] extending splice for copy offloading
    On 09/30/2013 06:31 PM, Miklos Szeredi wrote:
    > Here's an example "cp" app using direct splice (and without fallback to
    > non-splice, which is obviously required unless the kernel is known to support
    > direct splice).
    >
    > Untested, but trivial enough...
    >
    > The important part is, I think, that the app must not assume that the kernel can
    > complete the request in one go.
    >
    > Thanks,
    > Miklos
    >
    > ----
    > #define _GNU_SOURCE
    >
    > #include <stdio.h>
    > #include <fcntl.h>
    > #include <unistd.h>
    > #include <limits.h>
    > #include <sys/stat.h>
    > #include <err.h>
    >
    > #ifndef SPLICE_F_DIRECT
    > #define SPLICE_F_DIRECT (0x10) /* neither splice fd is a pipe */
    > #endif
    >
    > int main(int argc, char *argv[])
    > {
    > struct stat stbuf;
    > int in_fd;
    > int out_fd;
    > int res;
    > off_t off;

    off_t off = 0;

    >
    > if (argc != 3)
    > errx(1, "usage: %s from to", argv[0]);
    >
    > in_fd = open(argv[1], O_RDONLY);
    > if (in_fd == -1)
    > err(1, "opening %s", argv[1]);
    >
    > res = fstat(in_fd, &stbuf);
    > if (res == -1)
    > err(1, "fstat");
    >
    > out_fd = open(argv[2], O_CREAT | O_WRONLY | O_TRUNC, stbuf.st_mode);
    > if (out_fd == -1)
    > err(1, "opening %s", argv[2]);
    >
    > do {
    > off_t in_off = off, out_off = off;
    > ssize_t rres;
    >
    > rres = splice(in_fd, &in_off, out_fd, &out_off, SSIZE_MAX,
    > SPLICE_F_DIRECT);
    > if (rres == -1)
    > err(1, "splice");
    > if (rres == 0)
    > break;
    >
    > off += rres;
    > } while (off < stbuf.st_size);
    >
    > res = close(in_fd);
    > if (res == -1)
    > err(1, "close");
    >
    > res = fsync(out_fd);
    > if (res == -1)
    > err(1, "fsync");
    >
    > res = close(out_fd);
    > if (res == -1)
    > err(1, "close");
    >
    > return 0;
    > }


    It would be nice if there would be way if the file system would get a
    hint that the target file is supposed to be copy of another file. That
    way distributed file systems could also create the target-file with the
    correct meta-information (same storage targets as in-file has).
    Well, if we cannot agree on that, file system with a custom protocol at
    least can detect from 0 to SSIZE_MAX and then reset metadata. I'm not
    sure if this would work for pNFS, though.


    Bernd





    \
     
     \ /
      Last update: 2013-09-30 20:01    [W:2.924 / U:0.192 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site