Merge pull request #1419 from wkennington/btrfs

Updated btrfsprogs from 0.20-git -> 3.12
This commit is contained in:
Mathijs Kwik 2013-12-28 17:27:07 -08:00
commit 5f9d99926a
2 changed files with 7 additions and 133 deletions

View file

@ -1,109 +0,0 @@
/*
btrfs receive currently mandates that incremental receives can only be performed on a parent subvolume
that was also received. This means you cannot apply it to (snapshotted) subvolumes you still have on disk,
as they were not received themselves.
This small utility allows you to set the received_uuid of a subvolume, tricking btrfs receive into using it.
found on btrfs mailing list
read the discussion here: http://comments.gmane.org/gmane.comp.file-systems.btrfs/21922
*/
#define _GNU_SOURCE
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <uuid/uuid.h>
#include <sys/ioctl.h>
#include "ctree.h"
#include "ioctl.h"
#include "send-utils.h"
#define CLEAR(var) memset(&var, 0, sizeof(var))
int main(int argc, char **argv) {
int ret, fd;
struct subvol_uuid_search sus;
struct btrfs_ioctl_received_subvol_args rs_args;
struct subvol_info *si;
char uuidbuf[37], parent_uuidbuf[37], received_uuidbuf[37];
if (argc != 3 && argc != 4) {
printf("usage: btrfs-set-received-uuid btrfs-mountpoint src-subvolume-path-relative-to-mountpoint [dest-absolute-subvolume-path]\n");
exit(1);
}
printf("opening srcmnt %s\n", argv[1]);
fd = open(argv[1], O_RDONLY | O_NOATIME);
if (fd < 0) {
printf("failed to open srcmnt %s! %s\n", argv[1], strerror(errno));
exit(2);
}
puts("initializing sub search");
CLEAR(sus);
ret = subvol_uuid_search_init(fd, &sus);
if (ret < 0) {
printf("failed to initialize sub search! %s\n", strerror(-ret));
exit(3);
}
printf("searching srcsub %s\n", argv[2]);
si = subvol_uuid_search(&sus, 0, NULL, 0, argv[2], subvol_search_by_path);
if (!si) {
puts("srcsub not found!");
exit(4);
}
uuid_unparse(si->uuid, uuidbuf);
uuid_unparse(si->parent_uuid, parent_uuidbuf);
uuid_unparse(si->received_uuid, received_uuidbuf);
printf("\nsrcsub found:\n"
" uuid=%s\n"
" parent_uuid=%s\n"
"received_uuid=%s\n"
"ctransid=%Lu otransid=%Lu stransid=%Lu rtransid=%Lu\n\n",
uuidbuf, parent_uuidbuf, received_uuidbuf,
(unsigned long long)(si->ctransid),
(unsigned long long)(si->otransid),
(unsigned long long)(si->stransid),
(unsigned long long)(si->rtransid));
if (argc == 3)
goto done;
printf("opening dst subvol %s\n", argv[3]);
fd = open(argv[3], O_RDONLY | O_NOATIME);
if (fd < 0) {
printf("failed to open dst subvol %s. %s\n", argv[3], strerror(errno));
exit(5);
}
printf("\nhere we go with BTRFS_IOC_SET_RECEIVED_SUBVOL:\n"
"dstsub.received_uuid = srcsub.uuid == %s\n"
"dstsub.stransid = srcsub.ctransid == %Lu\n\n",
uuidbuf, (unsigned long long)(si->ctransid));
CLEAR(rs_args);
memcpy(rs_args.uuid, si->uuid, BTRFS_UUID_SIZE);
rs_args.stransid = si->ctransid;
ret = ioctl(fd, BTRFS_IOC_SET_RECEIVED_SUBVOL, &rs_args);
if (ret < 0) {
printf("BTRFS_IOC_SET_RECEIVED_SUBVOL failed: %s", strerror(-ret));
exit(6);
}
done:
printf("done.\n");
exit(0);
}

View file

@ -1,35 +1,18 @@
{ stdenv, fetchgit, zlib, libuuid, acl, attr, e2fsprogs, lzo }:
{ stdenv, fetchurl, attr, acl, zlib, libuuid, e2fsprogs, lzo }:
let version = "0.20pre20130705"; in
stdenv.mkDerivation rec {
name = "btrfs-progs-v3.12";
stdenv.mkDerivation {
name = "btrfs-progs-${version}";
src = fetchgit {
url = "git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-progs.git";
rev = "194aa4a1bd6447bb545286d0bcb0b0be8204d79f";
sha256 = "07c6762c9873cdcc1b9b3be0b412ba14b83457d8f5608d3dd945953b5e06f0f2";
src = fetchurl {
url = "mirror://kernel/linux/kernel/people/mason/btrfs-progs/${name}.tar.xz";
sha256 = "1pwcjf9jqdiy8445r1xkazqa07xmapnn0ylyz7yzphci3ib66zh9";
};
buildInputs = [ zlib libuuid acl attr e2fsprogs lzo ];
buildInputs = [ attr acl zlib libuuid e2fsprogs lzo ];
# for btrfs to get the rpath to libgcc_s, needed for pthread_cancel to work
NIX_CFLAGS_LINK = "-lgcc_s";
postPatch = ''
cp ${./btrfs-set-received-uuid.c} btrfs-set-received-uuid.c
'';
postBuild = ''
gcc -Wall -D_FILE_OFFSET_BITS=64 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -DBTRFS_FLAT_INCLUDES \
-fPIC -g -O1 -luuid -o btrfs-set-received-uuid rbtree.o send-utils.o btrfs-list.o \
btrfs-set-received-uuid.c
'';
postInstall = ''
cp btrfs-set-received-uuid $out/bin
'';
makeFlags = "prefix=$(out)";
meta = {