# HG changeset patch # User Paul Boddie # Date 1645036122 -3600 # Node ID a5430b30cd3a071b2e43c34cc680b0d3ebe6f729 # Parent 76be2dc3b29451b2a0c99f4b85558b5697883189 Consolidated reference count update functionality. diff -r 76be2dc3b294 -r a5430b30cd3a libe2access/include/e2access/image.h --- a/libe2access/include/e2access/image.h Wed Feb 16 18:38:11 2022 +0100 +++ b/libe2access/include/e2access/image.h Wed Feb 16 19:28:42 2022 +0100 @@ -61,7 +61,8 @@ errcode_t image_inode(ext2_filsys fs, const char *pathname, struct ext2_inode *inode); -errcode_t image_inode_decrement(ext2_filsys fs, ext2_ino_t ino); +errcode_t image_inode_refcount_update(ext2_filsys fs, ext2_ino_t ino, + int change); errcode_t image_list_dir(ext2_filsys fs, const char *path, int (*proc)(struct ext2_dir_entry *, int, int, char *, diff -r 76be2dc3b294 -r a5430b30cd3a libe2access/lib/src/image.c --- a/libe2access/lib/src/image.c Wed Feb 16 18:38:11 2022 +0100 +++ b/libe2access/lib/src/image.c Wed Feb 16 19:28:42 2022 +0100 @@ -324,30 +324,26 @@ return ext2fs_read_inode(fs, ino, inode); } -/* Decrement the reference count on an inode. */ +/* Update the reference count for the given inode. */ -errcode_t image_inode_decrement(ext2_filsys fs, ext2_ino_t ino) +errcode_t image_inode_refcount_update(ext2_filsys fs, ext2_ino_t ino, int change) { - struct ext2_inode_large inode; - errcode_t retval; - - retval = ext2fs_read_inode_full(fs, ino, - (struct ext2_inode *) &inode, - sizeof(inode)); + struct ext2_inode inode; + errcode_t retval = ext2fs_read_inode(fs, ino, &inode); if (retval) return retval; /* NOTE: FUSE implementation tests for > 1. */ - if (inode.i_links_count) - inode.i_links_count--; + if ((change < 0) && (inode.i_links_count + change < 0)) + inode.i_links_count = 0; + else + inode.i_links_count += change; /* NOTE: Update modification time. */ - - return ext2fs_write_inode_full(fs, ino, - (struct ext2_inode *) &inode, - sizeof(inode)); + + return ext2fs_write_inode(fs, ino, &inode); } /* List a directory in the filesystem image. */ @@ -541,7 +537,7 @@ /* Decrement the parent reference count for directories. */ if (!retval && !inode.i_links_count && ino_parent) - retval = image_inode_decrement(fs, ino_parent); + retval = image_inode_refcount_update(fs, ino_parent, -1); return retval; } @@ -561,7 +557,7 @@ ext2_ino_t target_parent, const char *target_basename) { errcode_t retval; - struct ext2_inode source_inode, source_parent_inode, target_parent_inode; + struct ext2_inode source_inode; /* NOTE: Should check for space. */ @@ -584,14 +580,7 @@ { /* Update the link count for the target. */ - retval = ext2fs_read_inode(fs, target_parent, &target_parent_inode); - - if (retval) - return retval; - - target_parent_inode.i_links_count++; - - retval = ext2fs_write_inode(fs, target_parent, &target_parent_inode); + retval = image_inode_refcount_update(fs, target_parent, 1); if (retval) return retval; @@ -604,14 +593,7 @@ /* Update the link count for the source. */ - retval = ext2fs_read_inode(fs, source_parent, &source_parent_inode); - - if (retval) - return retval; - - source_parent_inode.i_links_count--; - - retval = ext2fs_write_inode(fs, source_parent, &source_parent_inode); + retval = image_inode_refcount_update(fs, source_parent, -1); if (retval) return retval;