]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/blobdiff - repair/incore_ino.c
libxfs: making passing flags to libxfs_init less confusing
[thirdparty/xfsprogs-dev.git] / repair / incore_ino.c
index 82956ae930051f4c927bad32e0744b63cec99860..0dd7a2f060fb40b274f5e2f4272278804f654448 100644 (file)
@@ -91,6 +91,7 @@ void add_inode_ref(struct ino_tree_node *irec, int ino_offset)
 {
        ASSERT(irec->ino_un.ex_data != NULL);
 
+       pthread_mutex_lock(&irec->lock);
        switch (irec->nlink_size) {
        case sizeof(uint8_t):
                if (irec->ino_un.ex_data->counted_nlinks.un8[ino_offset] < 0xff) {
@@ -112,6 +113,7 @@ void add_inode_ref(struct ino_tree_node *irec, int ino_offset)
        default:
                ASSERT(0);
        }
+       pthread_mutex_unlock(&irec->lock);
 }
 
 void drop_inode_ref(struct ino_tree_node *irec, int ino_offset)
@@ -120,6 +122,7 @@ void drop_inode_ref(struct ino_tree_node *irec, int ino_offset)
 
        ASSERT(irec->ino_un.ex_data != NULL);
 
+       pthread_mutex_lock(&irec->lock);
        switch (irec->nlink_size) {
        case sizeof(uint8_t):
                ASSERT(irec->ino_un.ex_data->counted_nlinks.un8[ino_offset] > 0);
@@ -139,6 +142,7 @@ void drop_inode_ref(struct ino_tree_node *irec, int ino_offset)
 
        if (refs == 0)
                irec->ino_un.ex_data->ino_reached &= ~IREC_MASK(ino_offset);
+       pthread_mutex_unlock(&irec->lock);
 }
 
 uint32_t num_inode_references(struct ino_tree_node *irec, int ino_offset)
@@ -161,6 +165,7 @@ uint32_t num_inode_references(struct ino_tree_node *irec, int ino_offset)
 void set_inode_disk_nlinks(struct ino_tree_node *irec, int ino_offset,
                uint32_t nlinks)
 {
+       pthread_mutex_lock(&irec->lock);
        switch (irec->nlink_size) {
        case sizeof(uint8_t):
                if (nlinks < 0xff) {
@@ -182,6 +187,7 @@ void set_inode_disk_nlinks(struct ino_tree_node *irec, int ino_offset,
        default:
                ASSERT(0);
        }
+       pthread_mutex_unlock(&irec->lock);
 }
 
 uint32_t get_inode_disk_nlinks(struct ino_tree_node *irec, int ino_offset)
@@ -205,7 +211,7 @@ alloc_ftypes_array(
 {
        uint8_t         *ptr;
 
-       if (!xfs_sb_version_hasftype(&mp->m_sb))
+       if (!xfs_has_ftype(mp))
                return NULL;
 
        ptr = calloc(XFS_INODES_PER_CHUNK, sizeof(*ptr));
@@ -253,6 +259,7 @@ alloc_ino_node(
        irec->nlink_size = sizeof(uint8_t);
        irec->disk_nlinks.un8 = alloc_nlink_array(irec->nlink_size);
        irec->ftypes = alloc_ftypes_array(mp);
+       pthread_mutex_init(&irec->lock, NULL);
        return irec;
 }
 
@@ -294,6 +301,7 @@ free_ino_tree_node(
        }
 
        free(irec->ftypes);
+       pthread_mutex_destroy(&irec->lock);
        free(irec);
 }
 
@@ -600,6 +608,7 @@ set_inode_parent(
        uint64_t                bitmask;
        parent_entry_t          *tmp;
 
+       pthread_mutex_lock(&irec->lock);
        if (full_ino_ex_data)
                ptbl = irec->ino_un.ex_data->parents;
        else
@@ -625,6 +634,7 @@ set_inode_parent(
 #endif
                ptbl->pentries[0] = parent;
 
+               pthread_mutex_unlock(&irec->lock);
                return;
        }
 
@@ -642,6 +652,7 @@ set_inode_parent(
 #endif
                ptbl->pentries[target] = parent;
 
+               pthread_mutex_unlock(&irec->lock);
                return;
        }
 
@@ -682,6 +693,7 @@ set_inode_parent(
 #endif
        ptbl->pentries[target] = parent;
        ptbl->pmask |= (1ULL << offset);
+       pthread_mutex_unlock(&irec->lock);
 }
 
 xfs_ino_t
@@ -692,6 +704,7 @@ get_inode_parent(ino_tree_node_t *irec, int offset)
        int             i;
        int             target;
 
+       pthread_mutex_lock(&irec->lock);
        if (full_ino_ex_data)
                ptbl = irec->ino_un.ex_data->parents;
        else
@@ -709,9 +722,11 @@ get_inode_parent(ino_tree_node_t *irec, int offset)
 #ifdef DEBUG
                ASSERT(target < ptbl->cnt);
 #endif
+               pthread_mutex_unlock(&irec->lock);
                return(ptbl->pentries[target]);
        }
 
+       pthread_mutex_unlock(&irec->lock);
        return(0LL);
 }