btrfs-progs: fix error checking in load_device_info
[platform/upstream/btrfs-progs.git] / btrfs-convert.c
index 2e6f4d4..802930c 100644 (file)
@@ -1016,6 +1016,8 @@ static int copy_inode_item(struct btrfs_inode_item *dst,
                           struct ext2_inode *src, u32 blocksize)
 {
        btrfs_set_stack_inode_generation(dst, 1);
+       btrfs_set_stack_inode_sequence(dst, 0);
+       btrfs_set_stack_inode_transid(dst, 1);
        btrfs_set_stack_inode_size(dst, src->i_size);
        btrfs_set_stack_inode_nbytes(dst, 0);
        btrfs_set_stack_inode_block_group(dst, 0);
@@ -1052,6 +1054,8 @@ static int copy_inode_item(struct btrfs_inode_item *dst,
                                new_decode_dev(src->i_block[1]));
                }
        }
+       memset(&dst->reserved, 0, sizeof(dst->reserved));
+
        return 0;
 }
 
@@ -1182,6 +1186,7 @@ static int copy_inodes(struct btrfs_root *root, ext2_filsys ext2_fs,
        }
        ret = btrfs_commit_transaction(trans, root);
        BUG_ON(ret);
+       ext2fs_close_inode_scan(ext2_scan);
 
        return ret;
 }
@@ -2314,7 +2319,7 @@ static int do_convert(const char *devname, int datacsum, int packing, int noxatt
                fprintf(stderr, "filetype feature is missing\n");
                goto fail;
        }
-       if (btrfs_check_nodesize(nodesize, blocksize))
+       if (btrfs_check_nodesize(nodesize, blocksize, features))
                goto fail;
        blocks_per_node = nodesize / blocksize;
        ret = -blocks_per_node;
@@ -2868,7 +2873,7 @@ int main(int argc, char *argv[])
        int usage_error = 0;
        int progress = 1;
        char *file;
-       char fslabel[BTRFS_LABEL_SIZE + 1];
+       char fslabel[BTRFS_LABEL_SIZE];
        u64 features = BTRFS_MKFS_DEFAULT_FEATURES;
 
        while(1) {
@@ -2910,14 +2915,13 @@ int main(int argc, char *argv[])
                                break;
                        case 'l':
                                copylabel = -1;
-                               fslabel[BTRFS_LABEL_SIZE] = 0;
-                               strncpy(fslabel, optarg, sizeof(fslabel));
-                               if (fslabel[BTRFS_LABEL_SIZE]) {
+                               if (strlen(optarg) >= BTRFS_LABEL_SIZE) {
                                        fprintf(stderr,
-                                               "warning: label too long, trimmed to %d bytes\n",
-                                               BTRFS_LABEL_SIZE);
-                                       fslabel[BTRFS_LABEL_SIZE] = 0;
+                               "WARNING: label too long, trimmed to %d bytes\n",
+                                               BTRFS_LABEL_SIZE - 1);
                                }
+                               strncpy(fslabel, optarg, BTRFS_LABEL_SIZE - 1);
+                               fslabel[BTRFS_LABEL_SIZE - 1] = 0;
                                break;
                        case 'L':
                                copylabel = 1;