1.1 --- a/libe2access/lib/src/image.c Wed Feb 16 18:38:11 2022 +0100
1.2 +++ b/libe2access/lib/src/image.c Wed Feb 16 19:28:42 2022 +0100
1.3 @@ -324,30 +324,26 @@
1.4 return ext2fs_read_inode(fs, ino, inode);
1.5 }
1.6
1.7 -/* Decrement the reference count on an inode. */
1.8 +/* Update the reference count for the given inode. */
1.9
1.10 -errcode_t image_inode_decrement(ext2_filsys fs, ext2_ino_t ino)
1.11 +errcode_t image_inode_refcount_update(ext2_filsys fs, ext2_ino_t ino, int change)
1.12 {
1.13 - struct ext2_inode_large inode;
1.14 - errcode_t retval;
1.15 -
1.16 - retval = ext2fs_read_inode_full(fs, ino,
1.17 - (struct ext2_inode *) &inode,
1.18 - sizeof(inode));
1.19 + struct ext2_inode inode;
1.20 + errcode_t retval = ext2fs_read_inode(fs, ino, &inode);
1.21
1.22 if (retval)
1.23 return retval;
1.24
1.25 /* NOTE: FUSE implementation tests for > 1. */
1.26
1.27 - if (inode.i_links_count)
1.28 - inode.i_links_count--;
1.29 + if ((change < 0) && (inode.i_links_count + change < 0))
1.30 + inode.i_links_count = 0;
1.31 + else
1.32 + inode.i_links_count += change;
1.33
1.34 /* NOTE: Update modification time. */
1.35 -
1.36 - return ext2fs_write_inode_full(fs, ino,
1.37 - (struct ext2_inode *) &inode,
1.38 - sizeof(inode));
1.39 +
1.40 + return ext2fs_write_inode(fs, ino, &inode);
1.41 }
1.42
1.43 /* List a directory in the filesystem image. */
1.44 @@ -541,7 +537,7 @@
1.45 /* Decrement the parent reference count for directories. */
1.46
1.47 if (!retval && !inode.i_links_count && ino_parent)
1.48 - retval = image_inode_decrement(fs, ino_parent);
1.49 + retval = image_inode_refcount_update(fs, ino_parent, -1);
1.50
1.51 return retval;
1.52 }
1.53 @@ -561,7 +557,7 @@
1.54 ext2_ino_t target_parent, const char *target_basename)
1.55 {
1.56 errcode_t retval;
1.57 - struct ext2_inode source_inode, source_parent_inode, target_parent_inode;
1.58 + struct ext2_inode source_inode;
1.59
1.60 /* NOTE: Should check for space. */
1.61
1.62 @@ -584,14 +580,7 @@
1.63 {
1.64 /* Update the link count for the target. */
1.65
1.66 - retval = ext2fs_read_inode(fs, target_parent, &target_parent_inode);
1.67 -
1.68 - if (retval)
1.69 - return retval;
1.70 -
1.71 - target_parent_inode.i_links_count++;
1.72 -
1.73 - retval = ext2fs_write_inode(fs, target_parent, &target_parent_inode);
1.74 + retval = image_inode_refcount_update(fs, target_parent, 1);
1.75
1.76 if (retval)
1.77 return retval;
1.78 @@ -604,14 +593,7 @@
1.79
1.80 /* Update the link count for the source. */
1.81
1.82 - retval = ext2fs_read_inode(fs, source_parent, &source_parent_inode);
1.83 -
1.84 - if (retval)
1.85 - return retval;
1.86 -
1.87 - source_parent_inode.i_links_count--;
1.88 -
1.89 - retval = ext2fs_write_inode(fs, source_parent, &source_parent_inode);
1.90 + retval = image_inode_refcount_update(fs, source_parent, -1);
1.91
1.92 if (retval)
1.93 return retval;