pos+total);
if (done < 0) {
ret = -1;
- error("cannot write data: %d %s", errno, strerror(errno));
+ error("cannot write data: %d %m", errno);
goto out;
}
total += done;
data_len = len;
if (fsetxattr(fd, name, data, data_len, 0))
- error("setting extended attribute %s on file %s: %s",
- name, file_name, strerror(errno));
+ error("setting extended attribute %s on file %s: %m",
+ name, file_name);
len = sizeof(*di) + name_len + data_len;
cur += len;
ret = fchown(fd, btrfs_inode_uid(path.nodes[0], inode_item),
btrfs_inode_gid(path.nodes[0], inode_item));
if (ret) {
- error("failed to change owner: %s", strerror(errno));
+ error("failed to change owner: %m");
goto out;
}
ret = fchmod(fd, btrfs_inode_mode(path.nodes[0], inode_item));
if (ret) {
- error("failed to change mode: %s", strerror(errno));
+ error("failed to change mode: %m");
goto out;
}
ret = futimens(fd, times);
if (ret) {
- error("failed to set times: %s", strerror(errno));
+ error("failed to set times: %m");
goto out;
}
}
if (!dry_run) {
ret = symlink(symlink_target, path_name);
if (ret < 0) {
- fprintf(stderr, "Failed to restore symlink '%s': %s\n",
- path_name, strerror(errno));
+ fprintf(stderr, "Failed to restore symlink '%s': %m\n",
+ path_name);
goto out;
}
}
btrfs_inode_gid(path.nodes[0], inode_item),
AT_SYMLINK_NOFOLLOW);
if (ret) {
- fprintf(stderr, "Failed to change owner: %s\n",
- strerror(errno));
+ fprintf(stderr, "Failed to change owner: %m\n");
goto out;
}
ret = utimensat(-1, file, times, AT_SYMLINK_NOFOLLOW);
if (ret)
- fprintf(stderr, "Failed to set times: %s\n", strerror(errno));
+ fprintf(stderr, "Failed to set times: %m\n");
out:
btrfs_release_path(&path);
return ret;
for (i = super_mirror; i < BTRFS_SUPER_MIRROR_MAX; i++) {
bytenr = btrfs_sb_offset(i);
+
+ /*
+ * Restore won't allocate extent and doesn't care anything
+ * in extent tree. Skip block group item search will allow
+ * restore to be executed on heavily damaged fs.
+ */
fs_info = open_ctree_fs_info(dev, bytenr, root_location, 0,
- OPEN_CTREE_PARTIAL);
+ OPEN_CTREE_PARTIAL |
+ OPEN_CTREE_NO_BLOCK_GROUPS);
if (fs_info)
break;
fprintf(stderr, "Could not open root, trying backup super\n");