diff options
author | Sage Weil <sage@inktank.com> | 2012-05-24 14:53:30 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2012-05-24 14:53:30 -0700 |
commit | 07c9eda2b1b3b4d3afd6fbbd57a52652ad312e3b (patch) | |
tree | c655ead2f3fe806fe92a7b8573942675afab507a /src/os | |
parent | bea1e03135852a4c62e6f378832a49a241c3297e (diff) | |
download | ceph-07c9eda2b1b3b4d3afd6fbbd57a52652ad312e3b.tar.gz |
filestore: fix btrfs subvol ioctl tests
Create a temp subvol that *we own* to test snaps against. Otherwise, we
won't be able to remove them if we weren't the owner of the source subvol
we were snapshotting when we are not root.
Signed-off-by: Sage Weil <sage@inktank.com>
Diffstat (limited to 'src/os')
-rw-r--r-- | src/os/FileStore.cc | 47 |
1 files changed, 35 insertions, 12 deletions
diff --git a/src/os/FileStore.cc b/src/os/FileStore.cc index 330adfd5dfd..b88ab7e56f9 100644 --- a/src/os/FileStore.cc +++ b/src/os/FileStore.cc @@ -1326,18 +1326,33 @@ int FileStore::_detect_fs() dout(0) << "mount btrfs CLONE_RANGE ioctl is DISABLED via 'filestore btrfs clone range' option" << dendl; } + struct btrfs_ioctl_vol_args vol_args; + memset(&vol_args, 0, sizeof(vol_args)); + + // create test source volume + vol_args.fd = 0; + strcpy(vol_args.name, "test_subvol"); + r = ::ioctl(fd, BTRFS_IOC_SUBVOL_CREATE, &vol_args); + if (r != 0) { + r = -errno; + dout(0) << "mount failed to create simple subvolume " << vol_args.name << ": " << cpp_strerror(r) << dendl; + } + int srcfd = ::openat(fd, vol_args.name, O_RDONLY); + if (srcfd < 0) { + r = -errno; + dout(0) << "mount failed to open " << vol_args.name << ": " << cpp_strerror(r) << dendl; + } + // snap_create and snap_destroy? - struct btrfs_ioctl_vol_args volargs; - memset(&volargs, 0, sizeof(volargs)); - volargs.fd = fd; - strcpy(volargs.name, "sync_snap_test"); - r = ::ioctl(fd, BTRFS_IOC_SNAP_CREATE, &volargs); + vol_args.fd = srcfd; + strcpy(vol_args.name, "sync_snap_test"); + r = ::ioctl(fd, BTRFS_IOC_SNAP_CREATE, &vol_args); int err = errno; if (r == 0 || errno == EEXIST) { dout(0) << "mount btrfs SNAP_CREATE is supported" << dendl; btrfs_snap_create = true; - r = ::ioctl(fd, BTRFS_IOC_SNAP_DESTROY, &volargs); + r = ::ioctl(fd, BTRFS_IOC_SNAP_DESTROY, &vol_args); if (r == 0) { dout(0) << "mount btrfs SNAP_DESTROY is supported" << dendl; btrfs_snap_destroy = true; @@ -1384,19 +1399,15 @@ int FileStore::_detect_fs() if (btrfs_wait_sync) { // async snap creation? - struct btrfs_ioctl_vol_args vol_args; - memset(&vol_args, 0, sizeof(vol_args)); - vol_args.fd = 0; - strcpy(vol_args.name, "async_snap_test"); - struct btrfs_ioctl_vol_args_v2 async_args; memset(&async_args, 0, sizeof(async_args)); - async_args.fd = fd; + async_args.fd = srcfd; async_args.flags = BTRFS_SUBVOL_CREATE_ASYNC; strcpy(async_args.name, "async_snap_test"); // remove old one, first struct stat st; + strcpy(vol_args.name, async_args.name); if (::fstatat(fd, vol_args.name, &st, 0) == 0) { dout(0) << "mount btrfs removing old async_snap_test" << dendl; r = ::ioctl(fd, BTRFS_IOC_SNAP_DESTROY, &vol_args); @@ -1412,6 +1423,7 @@ int FileStore::_detect_fs() btrfs_snap_create_v2 = true; // clean up + strcpy(vol_args.name, "async_snap_test"); r = ::ioctl(fd, BTRFS_IOC_SNAP_DESTROY, &vol_args); if (r != 0) { int err = errno; @@ -1424,6 +1436,17 @@ int FileStore::_detect_fs() } } + // clean up test subvol + if (srcfd >= 0) + TEMP_FAILURE_RETRY(::close(srcfd)); + + strcpy(vol_args.name, "test_subvol"); + r = ::ioctl(fd, BTRFS_IOC_SNAP_DESTROY, &vol_args); + if (r < 0) { + r = -errno; + dout(0) << "mount failed to remove " << vol_args.name << ": " << cpp_strerror(r) << dendl; + } + if (m_filestore_btrfs_snap && !btrfs_snap_create_v2) { dout(0) << "mount WARNING: btrfs snaps enabled, but no SNAP_CREATE_V2 ioctl (from kernel 2.6.37+)" << dendl; cerr << TEXT_YELLOW |