journaled_link(struct update_command_journal *j,
struct wim_dentry *subject, struct wim_dentry *parent)
{
- struct update_primitive prim = {
- .type = LINK_DENTRY,
- .link = {
- .subject = subject,
- .parent = parent,
- },
- };
+ struct update_primitive prim;
int ret;
+ prim.type = LINK_DENTRY;
+ prim.link.subject = subject;
+ prim.link.parent = parent;
+
ret = record_update_primitive(j, prim);
if (ret)
return ret;
static int
journaled_unlink(struct update_command_journal *j, struct wim_dentry *subject)
{
- int ret;
struct wim_dentry *parent;
+ struct update_primitive prim;
+ int ret;
if (dentry_is_root(subject))
parent = NULL;
else
parent = subject->parent;
- struct update_primitive prim = {
- .type = UNLINK_DENTRY,
- .link = {
- .subject = subject,
- .parent = parent,
- },
- };
+ prim.type = UNLINK_DENTRY;
+ prim.link.subject = subject;
+ prim.link.parent = parent;
ret = record_update_primitive(j, prim);
if (ret)
return -EBUSY;
if (j) {
+ if (dst)
+ if (journaled_unlink(j, dst))
+ return -ENOMEM;
+ if (journaled_unlink(j, src))
+ return -ENOMEM;
if (journaled_change_name(j, src, path_basename(to)))
return -ENOMEM;
+ if (journaled_link(j, src, parent_of_dst))
+ return -ENOMEM;
} else {
ret = dentry_set_name(src, path_basename(to));
if (ret)
return -ENOMEM;
- }
- if (dst) {
- if (j) {
- if (journaled_unlink(j, dst))
- return -ENOMEM;
- } else {
+ if (dst) {
unlink_dentry(dst);
free_dentry_tree(dst, wim->lookup_table);
}
- }
- if (j) {
- if (journaled_unlink(j, src))
- return -ENOMEM;
- if (journaled_link(j, src, parent_of_dst))
- return -ENOMEM;
- } else {
unlink_dentry(src);
dentry_add_child(parent_of_dst, src);
}