~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/fs/xfs/libxfs/xfs_bit.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 // SPDX-License-Identifier: GPL-2.0
  2 /*
  3  * Copyright (c) 2000-2005 Silicon Graphics, Inc.
  4  * All Rights Reserved.
  5  */
  6 #include "xfs.h"
  7 #include "xfs_log_format.h"
  8 #include "xfs_bit.h"
  9 
 10 /*
 11  * XFS bit manipulation routines, used in non-realtime code.
 12  */
 13 
 14 /*
 15  * Return whether bitmap is empty.
 16  * Size is number of words in the bitmap, which is padded to word boundary
 17  * Returns 1 for empty, 0 for non-empty.
 18  */
 19 int
 20 xfs_bitmap_empty(uint *map, uint size)
 21 {
 22         uint i;
 23 
 24         for (i = 0; i < size; i++) {
 25                 if (map[i] != 0)
 26                         return 0;
 27         }
 28 
 29         return 1;
 30 }
 31 
 32 /*
 33  * Count the number of contiguous bits set in the bitmap starting with bit
 34  * start_bit.  Size is the size of the bitmap in words.
 35  */
 36 int
 37 xfs_contig_bits(uint *map, uint size, uint start_bit)
 38 {
 39         uint * p = ((unsigned int *) map) + (start_bit >> BIT_TO_WORD_SHIFT);
 40         uint result = 0;
 41         uint tmp;
 42 
 43         size <<= BIT_TO_WORD_SHIFT;
 44 
 45         ASSERT(start_bit < size);
 46         size -= start_bit & ~(NBWORD - 1);
 47         start_bit &= (NBWORD - 1);
 48         if (start_bit) {
 49                 tmp = *p++;
 50                 /* set to one first offset bits prior to start */
 51                 tmp |= (~0U >> (NBWORD-start_bit));
 52                 if (tmp != ~0U)
 53                         goto found;
 54                 result += NBWORD;
 55                 size -= NBWORD;
 56         }
 57         while (size) {
 58                 if ((tmp = *p++) != ~0U)
 59                         goto found;
 60                 result += NBWORD;
 61                 size -= NBWORD;
 62         }
 63         return result - start_bit;
 64 found:
 65         return result + ffz(tmp) - start_bit;
 66 }
 67 
 68 /*
 69  * This takes the bit number to start looking from and
 70  * returns the next set bit from there.  It returns -1
 71  * if there are no more bits set or the start bit is
 72  * beyond the end of the bitmap.
 73  *
 74  * Size is the number of words, not bytes, in the bitmap.
 75  */
 76 int xfs_next_bit(uint *map, uint size, uint start_bit)
 77 {
 78         uint * p = ((unsigned int *) map) + (start_bit >> BIT_TO_WORD_SHIFT);
 79         uint result = start_bit & ~(NBWORD - 1);
 80         uint tmp;
 81 
 82         size <<= BIT_TO_WORD_SHIFT;
 83 
 84         if (start_bit >= size)
 85                 return -1;
 86         size -= result;
 87         start_bit &= (NBWORD - 1);
 88         if (start_bit) {
 89                 tmp = *p++;
 90                 /* set to zero first offset bits prior to start */
 91                 tmp &= (~0U << start_bit);
 92                 if (tmp != 0U)
 93                         goto found;
 94                 result += NBWORD;
 95                 size -= NBWORD;
 96         }
 97         while (size) {
 98                 if ((tmp = *p++) != 0U)
 99                         goto found;
100                 result += NBWORD;
101                 size -= NBWORD;
102         }
103         return -1;
104 found:
105         return result + ffs(tmp) - 1;
106 }
107 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php