+/* When sorting blobs located in NTFS volumes for sequential reading, we sort
+ * first by starting LCN of the attribute if available, otherwise no sort order
+ * is defined. This usually results in better sequential access to the volume.
+ */
+static int
+set_attr_sort_key(ntfs_inode *ni, struct ntfs_location *loc)
+{
+ ntfs_attr *na;
+ runlist_element *rl;
+
+ na = open_ntfs_attr(ni, loc);
+ if (!na)
+ return WIMLIB_ERR_NTFS_3G;
+
+ rl = ntfs_attr_find_vcn(na, 0);
+ if (rl && rl->lcn != LCN_HOLE)
+ loc->sort_key = rl->lcn;
+ else
+ loc->sort_key = 0;
+
+ ntfs_attr_close(na);
+ return 0;
+}
+
+/*
+ * Add a new stream to the specified inode, with duplicate checking.
+ *
+ * This works around a problem where NTFS-3g can list multiple unnamed data
+ * streams for a single file. In this case we can only keep one. We'll prefer
+ * one that is nonempty.
+ */
+static int
+add_stream(struct wim_inode *inode, const char *path, int stream_type,
+ const utf16lechar *stream_name, struct blob_descriptor **blob_p,
+ struct list_head *unhashed_blobs)
+{
+ struct blob_descriptor *blob = *blob_p;
+ struct wim_inode_stream *strm;
+
+ strm = inode_get_stream(inode, stream_type, stream_name);
+ if (unlikely(strm)) {
+ /* Stream already existed. */
+ if (!blob)
+ return 0;
+ if (stream_blob_resolved(strm)) {
+ WARNING("\"%s\" has multiple nonempty streams "
+ "with the same type and name! Only the first "
+ "will be saved.", path);
+ return 0;
+ }
+ inode_replace_stream_blob(inode, strm, blob, NULL);
+ } else {
+ strm = inode_add_stream(inode, stream_type, stream_name, blob);
+ if (unlikely(!strm))
+ return WIMLIB_ERR_NOMEM;
+ }
+ prepare_unhashed_blob(blob, inode, strm->stream_id, unhashed_blobs);
+ *blob_p = NULL;
+ return 0;
+
+}
+