]> wimlib.net Git - wimlib/blobdiff - src/ntfs-3g_capture.c
Improved handling of Data Deduplication reparse points
[wimlib] / src / ntfs-3g_capture.c
index 33f8365702ecff945d14b050894f8fcc4fbfe7c8..b496e02a723a51db0a2dd127b60a9ce70d6c169c 100644 (file)
@@ -65,6 +65,7 @@
 struct ntfs_volume_wrapper {
        ntfs_volume *vol;
        size_t refcnt;
 struct ntfs_volume_wrapper {
        ntfs_volume *vol;
        size_t refcnt;
+       bool dedup_warned;
 };
 
 /* Description of where data is located in an NTFS volume  */
 };
 
 /* Description of where data is located in an NTFS volume  */
@@ -231,6 +232,27 @@ read_reparse_header(ntfs_inode *ni, struct wim_inode *inode)
        return 0;
 }
 
        return 0;
 }
 
+
+static void
+warn_special_reparse_points(const struct wim_inode *inode,
+                           const struct scan_params *params,
+                           struct ntfs_volume_wrapper *volume)
+{
+       if (inode->i_reparse_tag == WIM_IO_REPARSE_TAG_DEDUP &&
+           (params->add_flags & WIMLIB_ADD_FLAG_WINCONFIG) &&
+           !volume->dedup_warned)
+       {
+               WARNING(
+         "Filesystem includes files deduplicated with Windows'\n"
+"          Data Deduplication feature, which to properly restore\n"
+"          would require that the chunk store in \"System Volume Information\"\n"
+"          be included in the WIM image. By default \"System Volume Information\"\n"
+"          is excluded, so you may want to use a custom capture configuration\n"
+"          file which includes it.");
+               volume->dedup_warned = true;
+       }
+}
+
 static int
 attr_type_to_wimlib_stream_type(ATTR_TYPES type)
 {
 static int
 attr_type_to_wimlib_stream_type(ATTR_TYPES type)
 {
@@ -793,6 +815,8 @@ ntfs_3g_build_dentry_tree_recursive(struct wim_dentry **root_ret,
                                                volume, AT_REPARSE_POINT);
                if (ret)
                        goto out;
                                                volume, AT_REPARSE_POINT);
                if (ret)
                        goto out;
+
+               warn_special_reparse_points(inode, params, volume);
        }
 
        /* Load the object ID.  */
        }
 
        /* Load the object ID.  */
@@ -863,7 +887,7 @@ ntfs_3g_build_dentry_tree(struct wim_dentry **root_ret,
        char *path;
        int ret;
 
        char *path;
        int ret;
 
-       volume = MALLOC(sizeof(struct ntfs_volume_wrapper));
+       volume = CALLOC(1, sizeof(struct ntfs_volume_wrapper));
        if (!volume)
                return WIMLIB_ERR_NOMEM;
 
        if (!volume)
                return WIMLIB_ERR_NOMEM;