}
}
-void
-inode_add_link(struct wim_inode *inode, struct wim_dentry *dentry)
-{
-}
-
/* Given a directory entry with the name @name for the file with the inode
* number @ino and device number @devno, create a new WIM dentry with an
* associated inode, where the inode is shared if an inode with the same @ino
*/
int
inode_table_new_dentry(struct wim_inode_table *table, const tchar *name,
- u64 ino, u64 devno, struct wim_dentry **dentry_ret)
+ u64 ino, u64 devno, bool noshare,
+ struct wim_dentry **dentry_ret)
{
struct wim_dentry *dentry;
struct wim_inode *inode;
int ret;
- ret = new_dentry(name, &dentry);
- if (ret)
- return ret;
-
- inode = inode_table_get_inode(table, ino, devno);
- if (!inode) {
- free_dentry(dentry);
- return WIMLIB_ERR_NOMEM;
+ if (noshare) {
+ ret = new_dentry_with_timeless_inode(name, &dentry);
+ if (ret)
+ return ret;
+ list_add_tail(&dentry->d_inode->i_list, &table->extra_inodes);
+ } else {
+ ret = new_dentry(name, &dentry);
+ if (ret)
+ return ret;
+ inode = inode_table_get_inode(table, ino, devno);
+ if (!inode) {
+ free_dentry(dentry);
+ return WIMLIB_ERR_NOMEM;
+ }
+ if (inode->i_nlink > 1)
+ inode_ref_streams(inode);
+ dentry->d_inode = inode;
+ inode_add_dentry(dentry, inode);
}
- if (inode->i_nlink > 1)
- inode_ref_streams(inode);
- dentry->d_inode = inode;
- inode_add_dentry(dentry, inode);
*dentry_ret = dentry;
return 0;
}
{
struct wim_dentry *dentry;
inode_for_each_dentry(dentry, inode)
- print_dentry_full_path(dentry, NULL);
+ tfprintf(stderr, T("%"TS"\n"), dentry_full_path(dentry));
}
#endif
return WIMLIB_ERR_INVALID_DENTRY;
}
/* Free the unneeded `struct wim_inode'. */
- dentry->d_inode->i_hlist.next = NULL;
- dentry->d_inode->i_hlist.pprev = NULL;
free_inode(dentry->d_inode);
dentry->d_inode = ref_inode;
ref_inode->i_nlink++;
INIT_LIST_HEAD(inode_list);
for (u64 i = 0; i < table->capacity; i++) {
hlist_for_each_entry_safe(inode, cur, tmp, &table->array[i], i_hlist) {
+ INIT_LIST_HEAD(&inode->i_list);
ret = fix_nominal_inode(inode, inode_list, ino_changes_needed);
if (ret)
return ret;
struct hlist_node *cur, *tmp;
u64 cur_ino = 1;
- INIT_LIST_HEAD(head);
+ list_for_each_entry(inode, head, i_list) {
+ if (inode->i_nlink > 1)
+ inode->i_ino = cur_ino++;
+ else
+ inode->i_ino = 0;
+ }
+
for (size_t i = 0; i < table->capacity; i++) {
hlist_for_each_entry_safe(inode, cur, tmp, &table->array[i], i_hlist)
{
}
INIT_HLIST_HEAD(&table->array[i]);
}
+ list_splice_tail(&table->extra_inodes, head);
table->num_entries = 0;
}