]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
Fix up inode cluster I/O size in repair for >8KB block size filesystems
authorBarry Naujok <bnaujok@sgi.com>
Tue, 3 Jun 2008 04:24:36 +0000 (04:24 +0000)
committerBarry Naujok <bnaujok@sgi.com>
Tue, 3 Jun 2008 04:24:36 +0000 (04:24 +0000)
Merge of master-melb:xfs-cmds:31267a by kenmcd.

  Fix up inode cluster I/O size in repair for >8KB block size filesystems

repair/prefetch.c
repair/xfs_repair.c

index d9f87800e38a027d10da4eea2e02e5ca7db33de7..ae0ac32d4f89f727c4e69123186dfa82b1773eb5 100644 (file)
@@ -600,7 +600,6 @@ pf_queuing_worker(
        ino_tree_node_t         *irec;
        ino_tree_node_t         *cur_irec;
        int                     blks_per_cluster;
-       int                     inos_per_cluster;
        xfs_agblock_t           bno;
        int                     i;
        int                     err;
@@ -608,7 +607,6 @@ pf_queuing_worker(
        blks_per_cluster =  XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_blocklog;
        if (blks_per_cluster == 0)
                blks_per_cluster = 1;
-       inos_per_cluster = blks_per_cluster * mp->m_sb.sb_inopblock;
 
        for (i = 0; i < PF_THREAD_COUNT; i++) {
                err = pthread_create(&args->io_threads[i], NULL,
@@ -661,7 +659,7 @@ pf_queuing_worker(
                                        (cur_irec->ino_isa_dir != 0) ?
                                                B_DIR_INODE : B_INODE);
                        bno += blks_per_cluster;
-                       num_inos += inos_per_cluster;
+                       num_inos += inodes_per_cluster;
                } while (num_inos < XFS_IALLOC_INODES(mp));
        }
 
@@ -738,6 +736,7 @@ start_inode_prefetch(
        prefetch_args_t         *prev_args)
 {
        prefetch_args_t         *args;
+       long                    max_queue;
 
        if (!do_prefetch || agno >= mp->m_sb.sb_agcount)
                return NULL;
@@ -757,8 +756,12 @@ start_inode_prefetch(
         * and not any other associated metadata like directories
         */
 
-       sem_init(&args->ra_count, 0, libxfs_bcache->c_maxcount / thread_count /
-               (XFS_IALLOC_BLOCKS(mp) / (XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_blocklog)) / 8);
+       max_queue = libxfs_bcache->c_maxcount / thread_count / 8;
+       if (XFS_INODE_CLUSTER_SIZE(mp) > mp->m_sb.sb_blocksize)
+               max_queue = max_queue * (XFS_INODE_CLUSTER_SIZE(mp) >>
+                               mp->m_sb.sb_blocklog) / XFS_IALLOC_BLOCKS(mp);
+
+       sem_init(&args->ra_count, 0, max_queue);
 
        if (!prev_args) {
                if (!pf_create_prefetch_thread(args))
index 0efab9c3ec8196ff2cf7a11ac1f4cc91d51e2dbe..530a253c2e7571b7a3dc46c7d4bb7ded43072bb8 100644 (file)
@@ -572,7 +572,8 @@ main(int argc, char **argv)
 
        chunks_pblock = mp->m_sb.sb_inopblock / XFS_INODES_PER_CHUNK;
        max_symlink_blocks = howmany(MAXPATHLEN - 1, mp->m_sb.sb_blocksize);
-       inodes_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_inodelog;
+       inodes_per_cluster = MAX(mp->m_sb.sb_inopblock,
+                       XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_inodelog);
 
        if (ag_stride) {
                thread_count = (glob_agcount + ag_stride - 1) / ag_stride;