#define ALIGN_UP(x, by) (ALIGNED((x), (by)) ? (x) : (ALIGN_DOWN((x), (by)) + (by)))
BtrfsFileStoreBackend::BtrfsFileStoreBackend(FileStore *fs):
- GenericFileStoreBackend(fs), has_clone_range(false), has_snap_create(false),
+ GenericFileStoreBackend(fs), has_clone_range(false),
+ has_snap_create(false), has_snap_destroy(false),
has_snap_create_v2(false), has_wait_sync(false), stable_commits(false),
m_filestore_btrfs_clone_range(g_conf->filestore_btrfs_clone_range),
m_filestore_btrfs_snap (g_conf->filestore_btrfs_snap) { }
int BtrfsFileStoreBackend::list_checkpoints(list<string>& ls)
{
+ int ret, err = 0;
+
struct stat basest;
- int ret = ::fstat(get_basedir_fd(), &basest);
+ ret = ::fstat(get_basedir_fd(), &basest);
if (ret < 0) {
ret = -errno;
dout(0) << "list_checkpoints: cannot fstat basedir " << cpp_strerror(ret) << dendl;
struct stat st;
ret = ::stat(path, &st);
if (ret < 0) {
- ret = -errno;
+ err = -errno;
dout(0) << "list_checkpoints: stat '" << path << "' failed: "
- << cpp_strerror(ret) << dendl;
- return ret;
+ << cpp_strerror(err) << dendl;
+ break;
}
if (!S_ISDIR(st.st_mode))
struct statfs fs;
ret = ::statfs(path, &fs);
if (ret < 0) {
- ret = -errno;
+ err = -errno;
dout(0) << "list_checkpoints: statfs '" << path << "' failed: "
- << cpp_strerror(ret) << dendl;
- return ret;
+ << cpp_strerror(err) << dendl;
+ break;
}
if (fs.f_type == BTRFS_SUPER_MAGIC && basest.st_dev != st.st_dev)
if (::closedir(dir) < 0) {
ret = -errno;
dout(0) << "list_checkpoints: closedir failed: " << cpp_strerror(ret) << dendl;
- return ret;
+ if (!err)
+ err = ret;
}
+ if (err)
+ return err;
+
ls.swap(snaps);
return 0;
}
memset(&async_args, 0, sizeof(async_args));
async_args.fd = get_current_fd();
async_args.flags = BTRFS_SUBVOL_CREATE_ASYNC;
- strcpy(async_args.name, name.c_str());
+ strncpy(async_args.name, name.c_str(), sizeof(async_args.name));
int r = ::ioctl(get_basedir_fd(), BTRFS_IOC_SNAP_CREATE_V2, &async_args);
if (r < 0) {
btrfs_ioctl_vol_args vol_args;
memset(&vol_args, 0, sizeof(vol_args));
vol_args.fd = 0;
- strcpy(vol_args.name, name.c_str());
+ strncpy(vol_args.name, name.c_str(), sizeof(vol_args.name));
int ret = ::ioctl(get_basedir_fd(), BTRFS_IOC_SNAP_DESTROY, &vol_args);
if (ret) {