diff options
| -rw-r--r-- | fs/jfs/jfs_dmap.c | 298 | ||||
| -rw-r--r-- | fs/jfs/jfs_dtree.c | 199 | ||||
| -rw-r--r-- | fs/jfs/jfs_dtree.h | 7 | ||||
| -rw-r--r-- | fs/jfs/jfs_imap.c | 105 | ||||
| -rw-r--r-- | fs/jfs/jfs_unicode.c | 7 | ||||
| -rw-r--r-- | fs/jfs/jfs_xtree.c | 340 | ||||
| -rw-r--r-- | fs/jfs/jfs_xtree.h | 6 | ||||
| -rw-r--r-- | fs/jfs/xattr.c | 6 |
8 files changed, 15 insertions, 953 deletions
diff --git a/fs/jfs/jfs_dmap.c b/fs/jfs/jfs_dmap.c index cced2fed9d0f..0732f206ca60 100644 --- a/fs/jfs/jfs_dmap.c +++ b/fs/jfs/jfs_dmap.c | |||
| @@ -26,36 +26,6 @@ | |||
| 26 | #include "jfs_debug.h" | 26 | #include "jfs_debug.h" |
| 27 | 27 | ||
| 28 | /* | 28 | /* |
| 29 | * Debug code for double-checking block map | ||
| 30 | */ | ||
| 31 | /* #define _JFS_DEBUG_DMAP 1 */ | ||
| 32 | |||
| 33 | #ifdef _JFS_DEBUG_DMAP | ||
| 34 | #define DBINITMAP(size,ipbmap,results) \ | ||
| 35 | DBinitmap(size,ipbmap,results) | ||
| 36 | #define DBALLOC(dbmap,mapsize,blkno,nblocks) \ | ||
| 37 | DBAlloc(dbmap,mapsize,blkno,nblocks) | ||
| 38 | #define DBFREE(dbmap,mapsize,blkno,nblocks) \ | ||
| 39 | DBFree(dbmap,mapsize,blkno,nblocks) | ||
| 40 | #define DBALLOCCK(dbmap,mapsize,blkno,nblocks) \ | ||
| 41 | DBAllocCK(dbmap,mapsize,blkno,nblocks) | ||
| 42 | #define DBFREECK(dbmap,mapsize,blkno,nblocks) \ | ||
| 43 | DBFreeCK(dbmap,mapsize,blkno,nblocks) | ||
| 44 | |||
| 45 | static void DBinitmap(s64, struct inode *, u32 **); | ||
| 46 | static void DBAlloc(uint *, s64, s64, s64); | ||
| 47 | static void DBFree(uint *, s64, s64, s64); | ||
| 48 | static void DBAllocCK(uint *, s64, s64, s64); | ||
| 49 | static void DBFreeCK(uint *, s64, s64, s64); | ||
| 50 | #else | ||
| 51 | #define DBINITMAP(size,ipbmap,results) | ||
| 52 | #define DBALLOC(dbmap, mapsize, blkno, nblocks) | ||
| 53 | #define DBFREE(dbmap, mapsize, blkno, nblocks) | ||
| 54 | #define DBALLOCCK(dbmap, mapsize, blkno, nblocks) | ||
| 55 | #define DBFREECK(dbmap, mapsize, blkno, nblocks) | ||
| 56 | #endif /* _JFS_DEBUG_DMAP */ | ||
| 57 | |||
| 58 | /* | ||
| 59 | * SERIALIZATION of the Block Allocation Map. | 29 | * SERIALIZATION of the Block Allocation Map. |
| 60 | * | 30 | * |
| 61 | * the working state of the block allocation map is accessed in | 31 | * the working state of the block allocation map is accessed in |
| @@ -242,7 +212,6 @@ int dbMount(struct inode *ipbmap) | |||
| 242 | JFS_SBI(ipbmap->i_sb)->bmap = bmp; | 212 | JFS_SBI(ipbmap->i_sb)->bmap = bmp; |
| 243 | 213 | ||
| 244 | memset(bmp->db_active, 0, sizeof(bmp->db_active)); | 214 | memset(bmp->db_active, 0, sizeof(bmp->db_active)); |
| 245 | DBINITMAP(bmp->db_mapsize, ipbmap, &bmp->db_DBmap); | ||
| 246 | 215 | ||
| 247 | /* | 216 | /* |
| 248 | * allocate/initialize the bmap lock | 217 | * allocate/initialize the bmap lock |
| @@ -407,16 +376,12 @@ int dbFree(struct inode *ip, s64 blkno, s64 nblocks) | |||
| 407 | */ | 376 | */ |
| 408 | nb = min(rem, BPERDMAP - (blkno & (BPERDMAP - 1))); | 377 | nb = min(rem, BPERDMAP - (blkno & (BPERDMAP - 1))); |
| 409 | 378 | ||
| 410 | DBALLOCCK(bmp->db_DBmap, bmp->db_mapsize, blkno, nb); | ||
| 411 | |||
| 412 | /* free the blocks. */ | 379 | /* free the blocks. */ |
| 413 | if ((rc = dbFreeDmap(bmp, dp, blkno, nb))) { | 380 | if ((rc = dbFreeDmap(bmp, dp, blkno, nb))) { |
| 414 | release_metapage(mp); | 381 | release_metapage(mp); |
| 415 | IREAD_UNLOCK(ipbmap); | 382 | IREAD_UNLOCK(ipbmap); |
| 416 | return (rc); | 383 | return (rc); |
| 417 | } | 384 | } |
| 418 | |||
| 419 | DBFREE(bmp->db_DBmap, bmp->db_mapsize, blkno, nb); | ||
| 420 | } | 385 | } |
| 421 | 386 | ||
| 422 | /* write the last buffer. */ | 387 | /* write the last buffer. */ |
| @@ -775,10 +740,6 @@ int dbAlloc(struct inode *ip, s64 hint, s64 nblocks, s64 * results) | |||
| 775 | IWRITE_LOCK(ipbmap); | 740 | IWRITE_LOCK(ipbmap); |
| 776 | 741 | ||
| 777 | rc = dbAllocAny(bmp, nblocks, l2nb, results); | 742 | rc = dbAllocAny(bmp, nblocks, l2nb, results); |
| 778 | if (rc == 0) { | ||
| 779 | DBALLOC(bmp->db_DBmap, bmp->db_mapsize, *results, | ||
| 780 | nblocks); | ||
| 781 | } | ||
| 782 | 743 | ||
| 783 | goto write_unlock; | 744 | goto write_unlock; |
| 784 | } | 745 | } |
| @@ -836,8 +797,6 @@ int dbAlloc(struct inode *ip, s64 hint, s64 nblocks, s64 * results) | |||
| 836 | != -ENOSPC) { | 797 | != -ENOSPC) { |
| 837 | if (rc == 0) { | 798 | if (rc == 0) { |
| 838 | *results = blkno; | 799 | *results = blkno; |
| 839 | DBALLOC(bmp->db_DBmap, bmp->db_mapsize, | ||
| 840 | *results, nblocks); | ||
| 841 | mark_metapage_dirty(mp); | 800 | mark_metapage_dirty(mp); |
| 842 | } | 801 | } |
| 843 | 802 | ||
| @@ -863,11 +822,8 @@ int dbAlloc(struct inode *ip, s64 hint, s64 nblocks, s64 * results) | |||
| 863 | if ((rc = | 822 | if ((rc = |
| 864 | dbAllocNear(bmp, dp, blkno, (int) nblocks, l2nb, results)) | 823 | dbAllocNear(bmp, dp, blkno, (int) nblocks, l2nb, results)) |
| 865 | != -ENOSPC) { | 824 | != -ENOSPC) { |
| 866 | if (rc == 0) { | 825 | if (rc == 0) |
| 867 | DBALLOC(bmp->db_DBmap, bmp->db_mapsize, | ||
| 868 | *results, nblocks); | ||
| 869 | mark_metapage_dirty(mp); | 826 | mark_metapage_dirty(mp); |
| 870 | } | ||
| 871 | 827 | ||
| 872 | release_metapage(mp); | 828 | release_metapage(mp); |
| 873 | goto read_unlock; | 829 | goto read_unlock; |
| @@ -878,11 +834,8 @@ int dbAlloc(struct inode *ip, s64 hint, s64 nblocks, s64 * results) | |||
| 878 | */ | 834 | */ |
| 879 | if ((rc = dbAllocDmapLev(bmp, dp, (int) nblocks, l2nb, results)) | 835 | if ((rc = dbAllocDmapLev(bmp, dp, (int) nblocks, l2nb, results)) |
| 880 | != -ENOSPC) { | 836 | != -ENOSPC) { |
| 881 | if (rc == 0) { | 837 | if (rc == 0) |
| 882 | DBALLOC(bmp->db_DBmap, bmp->db_mapsize, | ||
| 883 | *results, nblocks); | ||
| 884 | mark_metapage_dirty(mp); | 838 | mark_metapage_dirty(mp); |
| 885 | } | ||
| 886 | 839 | ||
| 887 | release_metapage(mp); | 840 | release_metapage(mp); |
| 888 | goto read_unlock; | 841 | goto read_unlock; |
| @@ -896,13 +849,9 @@ int dbAlloc(struct inode *ip, s64 hint, s64 nblocks, s64 * results) | |||
| 896 | * the same allocation group as the hint. | 849 | * the same allocation group as the hint. |
| 897 | */ | 850 | */ |
| 898 | IWRITE_LOCK(ipbmap); | 851 | IWRITE_LOCK(ipbmap); |
| 899 | if ((rc = dbAllocAG(bmp, agno, nblocks, l2nb, results)) | 852 | if ((rc = dbAllocAG(bmp, agno, nblocks, l2nb, results)) != -ENOSPC) |
| 900 | != -ENOSPC) { | ||
| 901 | if (rc == 0) | ||
| 902 | DBALLOC(bmp->db_DBmap, bmp->db_mapsize, | ||
| 903 | *results, nblocks); | ||
| 904 | goto write_unlock; | 853 | goto write_unlock; |
| 905 | } | 854 | |
| 906 | IWRITE_UNLOCK(ipbmap); | 855 | IWRITE_UNLOCK(ipbmap); |
| 907 | 856 | ||
| 908 | 857 | ||
| @@ -918,9 +867,6 @@ int dbAlloc(struct inode *ip, s64 hint, s64 nblocks, s64 * results) | |||
| 918 | */ | 867 | */ |
| 919 | if ((rc = dbAllocAG(bmp, agno, nblocks, l2nb, results)) == -ENOSPC) | 868 | if ((rc = dbAllocAG(bmp, agno, nblocks, l2nb, results)) == -ENOSPC) |
| 920 | rc = dbAllocAny(bmp, nblocks, l2nb, results); | 869 | rc = dbAllocAny(bmp, nblocks, l2nb, results); |
| 921 | if (rc == 0) { | ||
| 922 | DBALLOC(bmp->db_DBmap, bmp->db_mapsize, *results, nblocks); | ||
| 923 | } | ||
| 924 | 870 | ||
| 925 | write_unlock: | 871 | write_unlock: |
| 926 | IWRITE_UNLOCK(ipbmap); | 872 | IWRITE_UNLOCK(ipbmap); |
| @@ -992,10 +938,9 @@ int dbAllocExact(struct inode *ip, s64 blkno, int nblocks) | |||
| 992 | 938 | ||
| 993 | IREAD_UNLOCK(ipbmap); | 939 | IREAD_UNLOCK(ipbmap); |
| 994 | 940 | ||
| 995 | if (rc == 0) { | 941 | if (rc == 0) |
| 996 | DBALLOC(bmp->db_DBmap, bmp->db_mapsize, blkno, nblocks); | ||
| 997 | mark_metapage_dirty(mp); | 942 | mark_metapage_dirty(mp); |
| 998 | } | 943 | |
| 999 | release_metapage(mp); | 944 | release_metapage(mp); |
| 1000 | 945 | ||
| 1001 | return (rc); | 946 | return (rc); |
| @@ -1144,7 +1089,6 @@ static int dbExtend(struct inode *ip, s64 blkno, s64 nblocks, s64 addnblocks) | |||
| 1144 | return -EIO; | 1089 | return -EIO; |
| 1145 | } | 1090 | } |
| 1146 | 1091 | ||
| 1147 | DBALLOCCK(bmp->db_DBmap, bmp->db_mapsize, blkno, nblocks); | ||
| 1148 | dp = (struct dmap *) mp->data; | 1092 | dp = (struct dmap *) mp->data; |
| 1149 | 1093 | ||
| 1150 | /* try to allocate the blocks immediately following the | 1094 | /* try to allocate the blocks immediately following the |
| @@ -1155,11 +1099,9 @@ static int dbExtend(struct inode *ip, s64 blkno, s64 nblocks, s64 addnblocks) | |||
| 1155 | IREAD_UNLOCK(ipbmap); | 1099 | IREAD_UNLOCK(ipbmap); |
| 1156 | 1100 | ||
| 1157 | /* were we successful ? */ | 1101 | /* were we successful ? */ |
| 1158 | if (rc == 0) { | 1102 | if (rc == 0) |
| 1159 | DBALLOC(bmp->db_DBmap, bmp->db_mapsize, extblkno, | ||
| 1160 | addnblocks); | ||
| 1161 | write_metapage(mp); | 1103 | write_metapage(mp); |
| 1162 | } else | 1104 | else |
| 1163 | /* we were not successful */ | 1105 | /* we were not successful */ |
| 1164 | release_metapage(mp); | 1106 | release_metapage(mp); |
| 1165 | 1107 | ||
| @@ -3185,16 +3127,12 @@ int dbAllocBottomUp(struct inode *ip, s64 blkno, s64 nblocks) | |||
| 3185 | */ | 3127 | */ |
| 3186 | nb = min(rem, BPERDMAP - (blkno & (BPERDMAP - 1))); | 3128 | nb = min(rem, BPERDMAP - (blkno & (BPERDMAP - 1))); |
| 3187 | 3129 | ||
| 3188 | DBFREECK(bmp->db_DBmap, bmp->db_mapsize, blkno, nb); | ||
| 3189 | |||
| 3190 | /* allocate the blocks. */ | 3130 | /* allocate the blocks. */ |
| 3191 | if ((rc = dbAllocDmapBU(bmp, dp, blkno, nb))) { | 3131 | if ((rc = dbAllocDmapBU(bmp, dp, blkno, nb))) { |
| 3192 | release_metapage(mp); | 3132 | release_metapage(mp); |
| 3193 | IREAD_UNLOCK(ipbmap); | 3133 | IREAD_UNLOCK(ipbmap); |
| 3194 | return (rc); | 3134 | return (rc); |
| 3195 | } | 3135 | } |
| 3196 | |||
| 3197 | DBALLOC(bmp->db_DBmap, bmp->db_mapsize, blkno, nb); | ||
| 3198 | } | 3136 | } |
| 3199 | 3137 | ||
| 3200 | /* write the last buffer. */ | 3138 | /* write the last buffer. */ |
| @@ -4041,223 +3979,3 @@ s64 dbMapFileSizeToMapSize(struct inode * ipbmap) | |||
| 4041 | 3979 | ||
| 4042 | return (nblocks); | 3980 | return (nblocks); |
| 4043 | } | 3981 | } |
| 4044 | |||
| 4045 | |||
| 4046 | #ifdef _JFS_DEBUG_DMAP | ||
| 4047 | /* | ||
| 4048 | * DBinitmap() | ||
| 4049 | */ | ||
| 4050 | static void DBinitmap(s64 size, struct inode *ipbmap, u32 ** results) | ||
| 4051 | { | ||
| 4052 | int npages; | ||
| 4053 | u32 *dbmap, *d; | ||
| 4054 | int n; | ||
| 4055 | s64 lblkno, cur_block; | ||
| 4056 | struct dmap *dp; | ||
| 4057 | struct metapage *mp; | ||
| 4058 | |||
| 4059 | npages = size / 32768; | ||
| 4060 | npages += (size % 32768) ? 1 : 0; | ||
| 4061 | |||
| 4062 | dbmap = (u32 *) xmalloc(npages * 4096, L2PSIZE, kernel_heap); | ||
| 4063 | if (dbmap == NULL) | ||
| 4064 | BUG(); /* Not robust since this is only unused debug code */ | ||
| 4065 | |||
| 4066 | for (n = 0, d = dbmap; n < npages; n++, d += 1024) | ||
| 4067 | bzero(d, 4096); | ||
| 4068 | |||
| 4069 | /* Need to initialize from disk map pages | ||
| 4070 | */ | ||
| 4071 | for (d = dbmap, cur_block = 0; cur_block < size; | ||
| 4072 | cur_block += BPERDMAP, d += LPERDMAP) { | ||
| 4073 | lblkno = BLKTODMAP(cur_block, | ||
| 4074 | JFS_SBI(ipbmap->i_sb)->bmap-> | ||
| 4075 | db_l2nbperpage); | ||
| 4076 | mp = read_metapage(ipbmap, lblkno, PSIZE, 0); | ||
| 4077 | if (mp == NULL) { | ||
| 4078 | jfs_error(ipbmap->i_sb, | ||
| 4079 | "DBinitmap: could not read disk map page"); | ||
| 4080 | continue; | ||
| 4081 | } | ||
| 4082 | dp = (struct dmap *) mp->data; | ||
| 4083 | |||
| 4084 | for (n = 0; n < LPERDMAP; n++) | ||
| 4085 | d[n] = le32_to_cpu(dp->wmap[n]); | ||
| 4086 | |||
| 4087 | release_metapage(mp); | ||
| 4088 | } | ||
| 4089 | |||
| 4090 | *results = dbmap; | ||
| 4091 | } | ||
| 4092 | |||
| 4093 | |||
| 4094 | /* | ||
| 4095 | * DBAlloc() | ||
| 4096 | */ | ||
| 4097 | void DBAlloc(uint * dbmap, s64 mapsize, s64 blkno, s64 nblocks) | ||
| 4098 | { | ||
| 4099 | int word, nb, bitno; | ||
| 4100 | u32 mask; | ||
| 4101 | |||
| 4102 | assert(blkno > 0 && blkno < mapsize); | ||
| 4103 | assert(nblocks > 0 && nblocks <= mapsize); | ||
| 4104 | |||
| 4105 | assert(blkno + nblocks <= mapsize); | ||
| 4106 | |||
| 4107 | dbmap += (blkno / 32); | ||
| 4108 | while (nblocks > 0) { | ||
| 4109 | bitno = blkno & (32 - 1); | ||
| 4110 | nb = min(nblocks, 32 - bitno); | ||
| 4111 | |||
| 4112 | mask = (0xffffffff << (32 - nb) >> bitno); | ||
| 4113 | assert((mask & *dbmap) == 0); | ||
| 4114 | *dbmap |= mask; | ||
| 4115 | |||
| 4116 | dbmap++; | ||
| 4117 | blkno += nb; | ||
| 4118 | nblocks -= nb; | ||
| 4119 | } | ||
| 4120 | } | ||
| 4121 | |||
| 4122 | |||
| 4123 | /* | ||
| 4124 | * DBFree() | ||
| 4125 | */ | ||
| 4126 | static void DBFree(uint * dbmap, s64 mapsize, s64 blkno, s64 nblocks) | ||
| 4127 | { | ||
| 4128 | int word, nb, bitno; | ||
| 4129 | u32 mask; | ||
| 4130 | |||
| 4131 | assert(blkno > 0 && blkno < mapsize); | ||
| 4132 | assert(nblocks > 0 && nblocks <= mapsize); | ||
| 4133 | |||
| 4134 | assert(blkno + nblocks <= mapsize); | ||
| 4135 | |||
| 4136 | dbmap += (blkno / 32); | ||
| 4137 | while (nblocks > 0) { | ||
| 4138 | bitno = blkno & (32 - 1); | ||
| 4139 | nb = min(nblocks, 32 - bitno); | ||
| 4140 | |||
| 4141 | mask = (0xffffffff << (32 - nb) >> bitno); | ||
| 4142 | assert((mask & *dbmap) == mask); | ||
| 4143 | *dbmap &= ~mask; | ||
| 4144 | |||
| 4145 | dbmap++; | ||
| 4146 | blkno += nb; | ||
| 4147 | nblocks -= nb; | ||
| 4148 | } | ||
| 4149 | } | ||
| 4150 | |||
| 4151 | |||
| 4152 | /* | ||
| 4153 | * DBAllocCK() | ||
| 4154 | */ | ||
| 4155 | static void DBAllocCK(uint * dbmap, s64 mapsize, s64 blkno, s64 nblocks) | ||
| 4156 | { | ||
| 4157 | int word, nb, bitno; | ||
| 4158 | u32 mask; | ||
| 4159 | |||
| 4160 | assert(blkno > 0 && blkno < mapsize); | ||
| 4161 | assert(nblocks > 0 && nblocks <= mapsize); | ||
| 4162 | |||
| 4163 | assert(blkno + nblocks <= mapsize); | ||
| 4164 | |||
| 4165 | dbmap += (blkno / 32); | ||
| 4166 | while (nblocks > 0) { | ||
| 4167 | bitno = blkno & (32 - 1); | ||
| 4168 | nb = min(nblocks, 32 - bitno); | ||
| 4169 | |||
| 4170 | mask = (0xffffffff << (32 - nb) >> bitno); | ||
| 4171 | assert((mask & *dbmap) == mask); | ||
| 4172 | |||
| 4173 | dbmap++; | ||
| 4174 | blkno += nb; | ||
| 4175 | nblocks -= nb; | ||
| 4176 | } | ||
| 4177 | } | ||
| 4178 | |||
| 4179 | |||
| 4180 | /* | ||
| 4181 | * DBFreeCK() | ||
| 4182 | */ | ||
| 4183 | static void DBFreeCK(uint * dbmap, s64 mapsize, s64 blkno, s64 nblocks) | ||
| 4184 | { | ||
| 4185 | int word, nb, bitno; | ||
| 4186 | u32 mask; | ||
| 4187 | |||
| 4188 | assert(blkno > 0 && blkno < mapsize); | ||
| 4189 | assert(nblocks > 0 && nblocks <= mapsize); | ||
| 4190 | |||
| 4191 | assert(blkno + nblocks <= mapsize); | ||
| 4192 | |||
| 4193 | dbmap += (blkno / 32); | ||
| 4194 | while (nblocks > 0) { | ||
| 4195 | bitno = blkno & (32 - 1); | ||
| 4196 | nb = min(nblocks, 32 - bitno); | ||
| 4197 | |||
| 4198 | mask = (0xffffffff << (32 - nb) >> bitno); | ||
| 4199 | assert((mask & *dbmap) == 0); | ||
| 4200 | |||
| 4201 | dbmap++; | ||
| 4202 | blkno += nb; | ||
| 4203 | nblocks -= nb; | ||
| 4204 | } | ||
| 4205 | } | ||
| 4206 | |||
| 4207 | |||
| 4208 | /* | ||
| 4209 | * dbPrtMap() | ||
| 4210 | */ | ||
| 4211 | static void dbPrtMap(struct bmap * bmp) | ||
| 4212 | { | ||
| 4213 | printk(" mapsize: %d%d\n", bmp->db_mapsize); | ||
| 4214 | printk(" nfree: %d%d\n", bmp->db_nfree); | ||
| 4215 | printk(" numag: %d\n", bmp->db_numag); | ||
| 4216 | printk(" agsize: %d%d\n", bmp->db_agsize); | ||
| 4217 | printk(" agl2size: %d\n", bmp->db_agl2size); | ||
| 4218 | printk(" agwidth: %d\n", bmp->db_agwidth); | ||
| 4219 | printk(" agstart: %d\n", bmp->db_agstart); | ||
| 4220 | printk(" agheigth: %d\n", bmp->db_agheigth); | ||
| 4221 | printk(" aglevel: %d\n", bmp->db_aglevel); | ||
| 4222 | printk(" maxlevel: %d\n", bmp->db_maxlevel); | ||
| 4223 | printk(" maxag: %d\n", bmp->db_maxag); | ||
| 4224 | printk(" agpref: %d\n", bmp->db_agpref); | ||
| 4225 | printk(" l2nbppg: %d\n", bmp->db_l2nbperpage); | ||
| 4226 | } | ||
| 4227 | |||
| 4228 | |||
| 4229 | /* | ||
| 4230 | * dbPrtCtl() | ||
| 4231 | */ | ||
| 4232 | static void dbPrtCtl(struct dmapctl * dcp) | ||
| 4233 | { | ||
| 4234 | int i, j, n; | ||
| 4235 | |||
| 4236 | printk(" height: %08x\n", le32_to_cpu(dcp->height)); | ||
| 4237 | printk(" leafidx: %08x\n", le32_to_cpu(dcp->leafidx)); | ||
| 4238 | printk(" budmin: %08x\n", dcp->budmin); | ||
| 4239 | printk(" nleafs: %08x\n", le32_to_cpu(dcp->nleafs)); | ||
| 4240 | printk(" l2nleafs: %08x\n", le32_to_cpu(dcp->l2nleafs)); | ||
| 4241 | |||
| 4242 | printk("\n Tree:\n"); | ||
| 4243 | for (i = 0; i < CTLLEAFIND; i += 8) { | ||
| 4244 | n = min(8, CTLLEAFIND - i); | ||
| 4245 | |||
| 4246 | for (j = 0; j < n; j++) | ||
| 4247 | printf(" [%03x]: %02x", i + j, | ||
| 4248 | (char) dcp->stree[i + j]); | ||
| 4249 | printf("\n"); | ||
| 4250 | } | ||
| 4251 | |||
| 4252 | printk("\n Tree Leaves:\n"); | ||
| 4253 | for (i = 0; i < LPERCTL; i += 8) { | ||
| 4254 | n = min(8, LPERCTL - i); | ||
| 4255 | |||
| 4256 | for (j = 0; j < n; j++) | ||
| 4257 | printf(" [%03x]: %02x", | ||
| 4258 | i + j, | ||
| 4259 | (char) dcp->stree[i + j + CTLLEAFIND]); | ||
| 4260 | printf("\n"); | ||
| 4261 | } | ||
| 4262 | } | ||
| 4263 | #endif /* _JFS_DEBUG_DMAP */ | ||
diff --git a/fs/jfs/jfs_dtree.c b/fs/jfs/jfs_dtree.c index 8676aee3ae48..73b5fc7eda80 100644 --- a/fs/jfs/jfs_dtree.c +++ b/fs/jfs/jfs_dtree.c | |||
| @@ -4554,202 +4554,3 @@ int dtModify(tid_t tid, struct inode *ip, | |||
| 4554 | 4554 | ||
| 4555 | return 0; | 4555 | return 0; |
| 4556 | } | 4556 | } |
| 4557 | |||
| 4558 | #ifdef _JFS_DEBUG_DTREE | ||
| 4559 | /* | ||
| 4560 | * dtDisplayTree() | ||
| 4561 | * | ||
| 4562 | * function: traverse forward | ||
| 4563 | */ | ||
| 4564 | int dtDisplayTree(struct inode *ip) | ||
| 4565 | { | ||
| 4566 | int rc; | ||
| 4567 | struct metapage *mp; | ||
| 4568 | dtpage_t *p; | ||
| 4569 | s64 bn, pbn; | ||
| 4570 | int index, lastindex, v, h; | ||
| 4571 | pxd_t *xd; | ||
| 4572 | struct btstack btstack; | ||
| 4573 | struct btframe *btsp; | ||
| 4574 | struct btframe *parent; | ||
| 4575 | u8 *stbl; | ||
| 4576 | int psize = 256; | ||
| 4577 | |||
| 4578 | printk("display B+-tree.\n"); | ||
| 4579 | |||
| 4580 | /* clear stack */ | ||
| 4581 | btsp = btstack.stack; | ||
| 4582 | |||
| 4583 | /* | ||
| 4584 | * start with root | ||
| 4585 | * | ||
| 4586 | * root resides in the inode | ||
| 4587 | */ | ||
| 4588 | bn = 0; | ||
| 4589 | v = h = 0; | ||
| 4590 | |||
| 4591 | /* | ||
| 4592 | * first access of each page: | ||
| 4593 | */ | ||
| 4594 | newPage: | ||
| 4595 | DT_GETPAGE(ip, bn, mp, psize, p, rc); | ||
| 4596 | if (rc) | ||
| 4597 | return rc; | ||
| 4598 | |||
| 4599 | /* process entries forward from first index */ | ||
| 4600 | index = 0; | ||
| 4601 | lastindex = p->header.nextindex - 1; | ||
| 4602 | |||
| 4603 | if (p->header.flag & BT_INTERNAL) { | ||
| 4604 | /* | ||
| 4605 | * first access of each internal page | ||
| 4606 | */ | ||
| 4607 | printf("internal page "); | ||
| 4608 | dtDisplayPage(ip, bn, p); | ||
| 4609 | |||
| 4610 | goto getChild; | ||
| 4611 | } else { /* (p->header.flag & BT_LEAF) */ | ||
| 4612 | |||
| 4613 | /* | ||
| 4614 | * first access of each leaf page | ||
| 4615 | */ | ||
| 4616 | printf("leaf page "); | ||
| 4617 | dtDisplayPage(ip, bn, p); | ||
| 4618 | |||
| 4619 | /* | ||
| 4620 | * process leaf page entries | ||
| 4621 | * | ||
| 4622 | for ( ; index <= lastindex; index++) | ||
| 4623 | { | ||
| 4624 | } | ||
| 4625 | */ | ||
| 4626 | |||
| 4627 | /* unpin the leaf page */ | ||
| 4628 | DT_PUTPAGE(mp); | ||
| 4629 | } | ||
| 4630 | |||
| 4631 | /* | ||
| 4632 | * go back up to the parent page | ||
| 4633 | */ | ||
| 4634 | getParent: | ||
| 4635 | /* pop/restore parent entry for the current child page */ | ||
| 4636 | if ((parent = (btsp == btstack.stack ? NULL : --btsp)) == NULL) | ||
| 4637 | /* current page must have been root */ | ||
| 4638 | return; | ||
| 4639 | |||
| 4640 | /* | ||
| 4641 | * parent page scan completed | ||
| 4642 | */ | ||
| 4643 | if ((index = parent->index) == (lastindex = parent->lastindex)) { | ||
| 4644 | /* go back up to the parent page */ | ||
| 4645 | goto getParent; | ||
| 4646 | } | ||
| 4647 | |||
| 4648 | /* | ||
| 4649 | * parent page has entries remaining | ||
| 4650 | */ | ||
| 4651 | /* get back the parent page */ | ||
| 4652 | bn = parent->bn; | ||
| 4653 | /* v = parent->level; */ | ||
| 4654 | DT_GETPAGE(ip, bn, mp, PSIZE, p, rc); | ||
| 4655 | if (rc) | ||
| 4656 | return rc; | ||
| 4657 | |||
| 4658 | /* get next parent entry */ | ||
| 4659 | index++; | ||
| 4660 | |||
| 4661 | /* | ||
| 4662 | * internal page: go down to child page of current entry | ||
| 4663 | */ | ||
| 4664 | getChild: | ||
| 4665 | /* push/save current parent entry for the child page */ | ||
| 4666 | btsp->bn = pbn = bn; | ||
| 4667 | btsp->index = index; | ||
| 4668 | btsp->lastindex = lastindex; | ||
| 4669 | /* btsp->level = v; */ | ||
| 4670 | /* btsp->node = h; */ | ||
| 4671 | ++btsp; | ||
| 4672 | |||
| 4673 | /* get current entry for the child page */ | ||
| 4674 | stbl = DT_GETSTBL(p); | ||
| 4675 | xd = (pxd_t *) & p->slot[stbl[index]]; | ||
| 4676 | |||
| 4677 | /* | ||
| 4678 | * first access of each internal entry: | ||
| 4679 | */ | ||
| 4680 | |||
| 4681 | /* get child page */ | ||
| 4682 | bn = addressPXD(xd); | ||
| 4683 | psize = lengthPXD(xd) << ip->i_ipmnt->i_l2bsize; | ||
| 4684 | |||
| 4685 | printk("traverse down 0x%Lx[%d]->0x%Lx\n", pbn, index, bn); | ||
| 4686 | v++; | ||
| 4687 | h = index; | ||
| 4688 | |||
| 4689 | /* release parent page */ | ||
| 4690 | DT_PUTPAGE(mp); | ||
| 4691 | |||
| 4692 | /* process the child page */ | ||
| 4693 | goto newPage; | ||
| 4694 | } | ||
| 4695 | |||
| 4696 | |||
| 4697 | /* | ||
| 4698 | * dtDisplayPage() | ||
| 4699 | * | ||
| 4700 | * function: display page | ||
| 4701 | */ | ||
| 4702 | int dtDisplayPage(struct inode *ip, s64 bn, dtpage_t * p) | ||
| 4703 | { | ||
| 4704 | int rc; | ||
| 4705 | struct metapage *mp; | ||
| 4706 | struct ldtentry *lh; | ||
| 4707 | struct idtentry *ih; | ||
| 4708 | pxd_t *xd; | ||
| 4709 | int i, j; | ||
| 4710 | u8 *stbl; | ||
| 4711 | wchar_t name[JFS_NAME_MAX + 1]; | ||
| 4712 | struct component_name key = { 0, name }; | ||
| 4713 | int freepage = 0; | ||
| 4714 | |||
| 4715 | if (p == NULL) { | ||
| 4716 | freepage = 1; | ||
| 4717 | DT_GETPAGE(ip, bn, mp, PSIZE, p, rc); | ||
| 4718 | if (rc) | ||
| 4719 | return rc; | ||
| 4720 | } | ||
| 4721 | |||
| 4722 | /* display page control */ | ||
| 4723 | printk("bn:0x%Lx flag:0x%08x nextindex:%d\n", | ||
| 4724 | bn, p->header.flag, p->header.nextindex); | ||
| 4725 | |||
| 4726 | /* display entries */ | ||
| 4727 | stbl = DT_GETSTBL(p); | ||
| 4728 | for (i = 0, j = 1; i < p->header.nextindex; i++, j++) { | ||
| 4729 | dtGetKey(p, i, &key, JFS_SBI(ip->i_sb)->mntflag); | ||
| 4730 | key.name[key.namlen] = '\0'; | ||
| 4731 | if (p->header.flag & BT_LEAF) { | ||
| 4732 | lh = (struct ldtentry *) & p->slot[stbl[i]]; | ||
| 4733 | printf("\t[%d] %s:%d", i, key.name, | ||
| 4734 | le32_to_cpu(lh->inumber)); | ||
| 4735 | } else { | ||
| 4736 | ih = (struct idtentry *) & p->slot[stbl[i]]; | ||
| 4737 | xd = (pxd_t *) ih; | ||
| 4738 | bn = addressPXD(xd); | ||
| 4739 | printf("\t[%d] %s:0x%Lx", i, key.name, bn); | ||
| 4740 | } | ||
| 4741 | |||
| 4742 | if (j == 4) { | ||
| 4743 | printf("\n"); | ||
| 4744 | j = 0; | ||
| 4745 | } | ||
| 4746 | } | ||
| 4747 | |||
| 4748 | printf("\n"); | ||
| 4749 | |||
| 4750 | if (freepage) | ||
| 4751 | DT_PUTPAGE(mp); | ||
| 4752 | |||
| 4753 | return 0; | ||
| 4754 | } | ||
| 4755 | #endif /* _JFS_DEBUG_DTREE */ | ||
diff --git a/fs/jfs/jfs_dtree.h b/fs/jfs/jfs_dtree.h index 273a80130c9d..13e4fdf07724 100644 --- a/fs/jfs/jfs_dtree.h +++ b/fs/jfs/jfs_dtree.h | |||
| @@ -269,11 +269,4 @@ extern int dtModify(tid_t tid, struct inode *ip, struct component_name * key, | |||
| 269 | ino_t * orig_ino, ino_t new_ino, int flag); | 269 | ino_t * orig_ino, ino_t new_ino, int flag); |
| 270 | 270 | ||
| 271 | extern int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir); | 271 | extern int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir); |
| 272 | |||
| 273 | #ifdef _JFS_DEBUG_DTREE | ||
| 274 | extern int dtDisplayTree(struct inode *ip); | ||
| 275 | |||
| 276 | extern int dtDisplayPage(struct inode *ip, s64 bn, dtpage_t * p); | ||
| 277 | #endif /* _JFS_DEBUG_DTREE */ | ||
| 278 | |||
| 279 | #endif /* !_H_JFS_DTREE */ | 272 | #endif /* !_H_JFS_DTREE */ |
diff --git a/fs/jfs/jfs_imap.c b/fs/jfs/jfs_imap.c index 971af2977eff..4021d46da7e3 100644 --- a/fs/jfs/jfs_imap.c +++ b/fs/jfs/jfs_imap.c | |||
| @@ -87,25 +87,6 @@ static int copy_from_dinode(struct dinode *, struct inode *); | |||
| 87 | static void copy_to_dinode(struct dinode *, struct inode *); | 87 | static void copy_to_dinode(struct dinode *, struct inode *); |
| 88 | 88 | ||
| 89 | /* | 89 | /* |
| 90 | * debug code for double-checking inode map | ||
| 91 | */ | ||
| 92 | /* #define _JFS_DEBUG_IMAP 1 */ | ||
| 93 | |||
| 94 | #ifdef _JFS_DEBUG_IMAP | ||
| 95 | #define DBG_DIINIT(imap) DBGdiInit(imap) | ||
| 96 | #define DBG_DIALLOC(imap, ino) DBGdiAlloc(imap, ino) | ||
| 97 | #define DBG_DIFREE(imap, ino) DBGdiFree(imap, ino) | ||
| 98 | |||
| 99 | static void *DBGdiInit(struct inomap * imap); | ||
| 100 | static void DBGdiAlloc(struct inomap * imap, ino_t ino); | ||
| 101 | static void DBGdiFree(struct inomap * imap, ino_t ino); | ||
| 102 | #else | ||
| 103 | #define DBG_DIINIT(imap) | ||
| 104 | #define DBG_DIALLOC(imap, ino) | ||
| 105 | #define DBG_DIFREE(imap, ino) | ||
| 106 | #endif /* _JFS_DEBUG_IMAP */ | ||
| 107 | |||
| 108 | /* | ||
| 109 | * NAME: diMount() | 90 | * NAME: diMount() |
| 110 | * | 91 | * |
| 111 | * FUNCTION: initialize the incore inode map control structures for | 92 | * FUNCTION: initialize the incore inode map control structures for |
| @@ -188,8 +169,6 @@ int diMount(struct inode *ipimap) | |||
| 188 | imap->im_ipimap = ipimap; | 169 | imap->im_ipimap = ipimap; |
| 189 | JFS_IP(ipimap)->i_imap = imap; | 170 | JFS_IP(ipimap)->i_imap = imap; |
| 190 | 171 | ||
| 191 | // DBG_DIINIT(imap); | ||
| 192 | |||
| 193 | return (0); | 172 | return (0); |
| 194 | } | 173 | } |
| 195 | 174 | ||
| @@ -1043,7 +1022,6 @@ int diFree(struct inode *ip) | |||
| 1043 | /* update the bitmap. | 1022 | /* update the bitmap. |
| 1044 | */ | 1023 | */ |
| 1045 | iagp->wmap[extno] = cpu_to_le32(bitmap); | 1024 | iagp->wmap[extno] = cpu_to_le32(bitmap); |
| 1046 | DBG_DIFREE(imap, inum); | ||
| 1047 | 1025 | ||
| 1048 | /* update the free inode counts at the iag, ag and | 1026 | /* update the free inode counts at the iag, ag and |
| 1049 | * map level. | 1027 | * map level. |
| @@ -1231,7 +1209,6 @@ int diFree(struct inode *ip) | |||
| 1231 | jfs_error(ip->i_sb, "diFree: the pmap does not show inode free"); | 1209 | jfs_error(ip->i_sb, "diFree: the pmap does not show inode free"); |
| 1232 | } | 1210 | } |
| 1233 | iagp->wmap[extno] = 0; | 1211 | iagp->wmap[extno] = 0; |
| 1234 | DBG_DIFREE(imap, inum); | ||
| 1235 | PXDlength(&iagp->inoext[extno], 0); | 1212 | PXDlength(&iagp->inoext[extno], 0); |
| 1236 | PXDaddress(&iagp->inoext[extno], 0); | 1213 | PXDaddress(&iagp->inoext[extno], 0); |
| 1237 | 1214 | ||
| @@ -1350,7 +1327,6 @@ diInitInode(struct inode *ip, int iagno, int ino, int extno, struct iag * iagp) | |||
| 1350 | struct jfs_inode_info *jfs_ip = JFS_IP(ip); | 1327 | struct jfs_inode_info *jfs_ip = JFS_IP(ip); |
| 1351 | 1328 | ||
| 1352 | ip->i_ino = (iagno << L2INOSPERIAG) + ino; | 1329 | ip->i_ino = (iagno << L2INOSPERIAG) + ino; |
| 1353 | DBG_DIALLOC(JFS_IP(ipimap)->i_imap, ip->i_ino); | ||
| 1354 | jfs_ip->ixpxd = iagp->inoext[extno]; | 1330 | jfs_ip->ixpxd = iagp->inoext[extno]; |
| 1355 | jfs_ip->agno = BLKTOAG(le64_to_cpu(iagp->agstart), sbi); | 1331 | jfs_ip->agno = BLKTOAG(le64_to_cpu(iagp->agstart), sbi); |
| 1356 | jfs_ip->active_ag = -1; | 1332 | jfs_ip->active_ag = -1; |
| @@ -3185,84 +3161,3 @@ static void copy_to_dinode(struct dinode * dip, struct inode *ip) | |||
| 3185 | if (S_ISCHR(ip->i_mode) || S_ISBLK(ip->i_mode)) | 3161 | if (S_ISCHR(ip->i_mode) || S_ISBLK(ip->i_mode)) |
| 3186 | dip->di_rdev = cpu_to_le32(jfs_ip->dev); | 3162 | dip->di_rdev = cpu_to_le32(jfs_ip->dev); |
| 3187 | } | 3163 | } |
| 3188 | |||
| 3189 | #ifdef _JFS_DEBUG_IMAP | ||
| 3190 | /* | ||
| 3191 | * DBGdiInit() | ||
| 3192 | */ | ||
| 3193 | static void *DBGdiInit(struct inomap * imap) | ||
| 3194 | { | ||
| 3195 | u32 *dimap; | ||
| 3196 | int size; | ||
| 3197 | size = 64 * 1024; | ||
| 3198 | if ((dimap = (u32 *) xmalloc(size, L2PSIZE, kernel_heap)) == NULL) | ||
| 3199 | assert(0); | ||
| 3200 | bzero((void *) dimap, size); | ||
| 3201 | imap->im_DBGdimap = dimap; | ||
| 3202 | } | ||
| 3203 | |||
| 3204 | /* | ||
| 3205 | * DBGdiAlloc() | ||
| 3206 | */ | ||
| 3207 | static void DBGdiAlloc(struct inomap * imap, ino_t ino) | ||
| 3208 | { | ||
| 3209 | u32 *dimap = imap->im_DBGdimap; | ||
| 3210 | int w, b; | ||
| 3211 | u32 m; | ||
| 3212 | w = ino >> 5; | ||
| 3213 | b = ino & 31; | ||
| 3214 | m = 0x80000000 >> b; | ||
| 3215 | assert(w < 64 * 256); | ||
| 3216 | if (dimap[w] & m) { | ||
| 3217 | printk("DEBUG diAlloc: duplicate alloc ino:0x%x\n", ino); | ||
| 3218 | } | ||
| 3219 | dimap[w] |= m; | ||
| 3220 | } | ||
| 3221 | |||
| 3222 | /* | ||
| 3223 | * DBGdiFree() | ||
| 3224 | */ | ||
| 3225 | static void DBGdiFree(struct inomap * imap, ino_t ino) | ||
| 3226 | { | ||
| 3227 | u32 *dimap = imap->im_DBGdimap; | ||
| 3228 | int w, b; | ||
| 3229 | u32 m; | ||
| 3230 | w = ino >> 5; | ||
| 3231 | b = ino & 31; | ||
| 3232 | m = 0x80000000 >> b; | ||
| 3233 | assert(w < 64 * 256); | ||
| 3234 | if ((dimap[w] & m) == 0) { | ||
| 3235 | printk("DEBUG diFree: duplicate free ino:0x%x\n", ino); | ||
| 3236 | } | ||
| 3237 | dimap[w] &= ~m; | ||
| 3238 | } | ||
| 3239 | |||
| 3240 | static void dump_cp(struct inomap * ipimap, char *function, int line) | ||
| 3241 | { | ||
| 3242 | printk("\n* ********* *\nControl Page %s %d\n", function, line); | ||
| 3243 | printk("FreeIAG %d\tNextIAG %d\n", ipimap->im_freeiag, | ||
| 3244 | ipimap->im_nextiag); | ||
| 3245 | printk("NumInos %d\tNumFree %d\n", | ||
| 3246 | atomic_read(&ipimap->im_numinos), | ||
| 3247 | atomic_read(&ipimap->im_numfree)); | ||
| 3248 | printk("AG InoFree %d\tAG ExtFree %d\n", | ||
| 3249 | ipimap->im_agctl[0].inofree, ipimap->im_agctl[0].extfree); | ||
| 3250 | printk("AG NumInos %d\tAG NumFree %d\n", | ||
| 3251 | ipimap->im_agctl[0].numinos, ipimap->im_agctl[0].numfree); | ||
| 3252 | } | ||
| 3253 | |||
| 3254 | static void dump_iag(struct iag * iag, char *function, int line) | ||
| 3255 | { | ||
| 3256 | printk("\n* ********* *\nIAG %s %d\n", function, line); | ||
| 3257 | printk("IagNum %d\tIAG Free %d\n", le32_to_cpu(iag->iagnum), | ||
| 3258 | le32_to_cpu(iag->iagfree)); | ||
| 3259 | printk("InoFreeFwd %d\tInoFreeBack %d\n", | ||
| 3260 | le32_to_cpu(iag->inofreefwd), | ||
| 3261 | le32_to_cpu(iag->inofreeback)); | ||
| 3262 | printk("ExtFreeFwd %d\tExtFreeBack %d\n", | ||
| 3263 | le32_to_cpu(iag->extfreefwd), | ||
| 3264 | le32_to_cpu(iag->extfreeback)); | ||
| 3265 | printk("NFreeInos %d\tNFreeExts %d\n", le32_to_cpu(iag->nfreeinos), | ||
| 3266 | le32_to_cpu(iag->nfreeexts)); | ||
| 3267 | } | ||
| 3268 | #endif /* _JFS_DEBUG_IMAP */ | ||
diff --git a/fs/jfs/jfs_unicode.c b/fs/jfs/jfs_unicode.c index b32208aad550..f327decfb155 100644 --- a/fs/jfs/jfs_unicode.c +++ b/fs/jfs/jfs_unicode.c | |||
| @@ -51,8 +51,9 @@ int jfs_strfromUCS_le(char *to, const __le16 * from, | |||
| 51 | } | 51 | } |
| 52 | } else { | 52 | } else { |
| 53 | for (i = 0; (i < len) && from[i]; i++) { | 53 | for (i = 0; (i < len) && from[i]; i++) { |
| 54 | if (le16_to_cpu(from[i]) & 0xff00) { | 54 | if (unlikely(le16_to_cpu(from[i]) & 0xff00)) { |
| 55 | if (warn) { | 55 | to[i] = '?'; |
| 56 | if (unlikely(warn)) { | ||
| 56 | warn--; | 57 | warn--; |
| 57 | warn_again--; | 58 | warn_again--; |
| 58 | printk(KERN_ERR | 59 | printk(KERN_ERR |
| @@ -61,7 +62,7 @@ int jfs_strfromUCS_le(char *to, const __le16 * from, | |||
| 61 | printk(KERN_ERR | 62 | printk(KERN_ERR |
| 62 | "mount with iocharset=utf8 to access\n"); | 63 | "mount with iocharset=utf8 to access\n"); |
| 63 | } | 64 | } |
| 64 | to[i] = '?'; | 65 | |
| 65 | } | 66 | } |
| 66 | else | 67 | else |
| 67 | to[i] = (char) (le16_to_cpu(from[i])); | 68 | to[i] = (char) (le16_to_cpu(from[i])); |
diff --git a/fs/jfs/jfs_xtree.c b/fs/jfs/jfs_xtree.c index 31b34db4519e..a7fe2f2b969f 100644 --- a/fs/jfs/jfs_xtree.c +++ b/fs/jfs/jfs_xtree.c | |||
| @@ -135,14 +135,6 @@ static int xtSearchNode(struct inode *ip, | |||
| 135 | static int xtRelink(tid_t tid, struct inode *ip, xtpage_t * fp); | 135 | static int xtRelink(tid_t tid, struct inode *ip, xtpage_t * fp); |
| 136 | #endif /* _STILL_TO_PORT */ | 136 | #endif /* _STILL_TO_PORT */ |
| 137 | 137 | ||
| 138 | /* External references */ | ||
| 139 | |||
| 140 | /* | ||
| 141 | * debug control | ||
| 142 | */ | ||
| 143 | /* #define _JFS_DEBUG_XTREE 1 */ | ||
| 144 | |||
| 145 | |||
| 146 | /* | 138 | /* |
| 147 | * xtLookup() | 139 | * xtLookup() |
| 148 | * | 140 | * |
| @@ -4140,338 +4132,6 @@ s64 xtTruncate_pmap(tid_t tid, struct inode *ip, s64 committed_size) | |||
| 4140 | return 0; | 4132 | return 0; |
| 4141 | } | 4133 | } |
| 4142 | 4134 | ||
| 4143 | |||
| 4144 | #ifdef _JFS_DEBUG_XTREE | ||
| 4145 | /* | ||
| 4146 | * xtDisplayTree() | ||
| 4147 | * | ||
| 4148 | * function: traverse forward | ||
| 4149 | */ | ||
| 4150 | int xtDisplayTree(struct inode *ip) | ||
| 4151 | { | ||
| 4152 | int rc = 0; | ||
| 4153 | struct metapage *mp; | ||
| 4154 | xtpage_t *p; | ||
| 4155 | s64 bn, pbn; | ||
| 4156 | int index, lastindex, v, h; | ||
| 4157 | xad_t *xad; | ||
| 4158 | struct btstack btstack; | ||
| 4159 | struct btframe *btsp; | ||
| 4160 | struct btframe *parent; | ||
| 4161 | |||
| 4162 | printk("display B+-tree.\n"); | ||
| 4163 | |||
| 4164 | /* clear stack */ | ||
| 4165 | btsp = btstack.stack; | ||
| 4166 | |||
| 4167 | /* | ||
| 4168 | * start with root | ||
| 4169 | * | ||
| 4170 | * root resides in the inode | ||
| 4171 | */ | ||
| 4172 | bn = 0; | ||
| 4173 | v = h = 0; | ||
| 4174 | |||
| 4175 | /* | ||
| 4176 | * first access of each page: | ||
| 4177 | */ | ||
| 4178 | getPage: | ||
| 4179 | XT_GETPAGE(ip, bn, mp, PSIZE, p, rc); | ||
| 4180 | if (rc) | ||
| 4181 | return rc; | ||
| 4182 | |||
| 4183 | /* process entries forward from first index */ | ||
| 4184 | index = XTENTRYSTART; | ||
| 4185 | lastindex = le16_to_cpu(p->header.nextindex) - 1; | ||
| 4186 | |||
| 4187 | if (p->header.flag & BT_INTERNAL) { | ||
| 4188 | /* | ||
| 4189 | * first access of each internal page | ||
| 4190 | */ | ||
| 4191 | goto getChild; | ||
| 4192 | } else { /* (p->header.flag & BT_LEAF) */ | ||
| 4193 | |||
| 4194 | /* | ||
| 4195 | * first access of each leaf page | ||
| 4196 | */ | ||
| 4197 | printf("leaf page "); | ||
| 4198 | xtDisplayPage(ip, bn, p); | ||
| 4199 | |||
| 4200 | /* unpin the leaf page */ | ||
| 4201 | XT_PUTPAGE(mp); | ||
| 4202 | } | ||
| 4203 | |||
| 4204 | /* | ||
| 4205 | * go back up to the parent page | ||
| 4206 | */ | ||
| 4207 | getParent: | ||
| 4208 | /* pop/restore parent entry for the current child page */ | ||
| 4209 | if ((parent = (btsp == btstack.stack ? NULL : --btsp)) == NULL) | ||
| 4210 | /* current page must have been root */ | ||
| 4211 | return; | ||
| 4212 | |||
| 4213 | /* | ||
| 4214 | * parent page scan completed | ||
| 4215 | */ | ||
| 4216 | if ((index = parent->index) == (lastindex = parent->lastindex)) { | ||
| 4217 | /* go back up to the parent page */ | ||
| 4218 | goto getParent; | ||
| 4219 | } | ||
| 4220 | |||
| 4221 | /* | ||
| 4222 | * parent page has entries remaining | ||
| 4223 | */ | ||
| 4224 | /* get back the parent page */ | ||
| 4225 | bn = parent->bn; | ||
| 4226 | /* v = parent->level; */ | ||
| 4227 | XT_GETPAGE(ip, bn, mp, PSIZE, p, rc); | ||
| 4228 | if (rc) | ||
| 4229 | return rc; | ||
| 4230 | |||
| 4231 | /* get next parent entry */ | ||
| 4232 | index++; | ||
| 4233 | |||
| 4234 | /* | ||
| 4235 | * internal page: go down to child page of current entry | ||
| 4236 | */ | ||
| 4237 | getChild: | ||
| 4238 | /* push/save current parent entry for the child page */ | ||
| 4239 | btsp->bn = pbn = bn; | ||
| 4240 | btsp->index = index; | ||
| 4241 | btsp->lastindex = lastindex; | ||
| 4242 | /* btsp->level = v; */ | ||
| 4243 | /* btsp->node = h; */ | ||
| 4244 | ++btsp; | ||
| 4245 | |||
| 4246 | /* get child page */ | ||
| 4247 | xad = &p->xad[index]; | ||
| 4248 | bn = addressXAD(xad); | ||
| 4249 | |||
| 4250 | /* | ||
| 4251 | * first access of each internal entry: | ||
| 4252 | */ | ||
| 4253 | /* release parent page */ | ||
| 4254 | XT_PUTPAGE(mp); | ||
| 4255 | |||
| 4256 | printk("traverse down 0x%lx[%d]->0x%lx\n", (ulong) pbn, index, | ||
| 4257 | (ulong) bn); | ||
| 4258 | v++; | ||
| 4259 | h = index; | ||
| 4260 | |||
| 4261 | /* process the child page */ | ||
| 4262 | goto getPage; | ||
| 4263 | } | ||
| 4264 | |||
| 4265 | |||
| 4266 | /* | ||
| 4267 | * xtDisplayPage() | ||
| 4268 | * | ||
| 4269 | * function: display page | ||
| 4270 | */ | ||
| 4271 | int xtDisplayPage(struct inode *ip, s64 bn, xtpage_t * p) | ||
| 4272 | { | ||
| 4273 | int rc = 0; | ||
| 4274 | xad_t *xad; | ||
| 4275 | s64 xaddr, xoff; | ||
| 4276 | int xlen, i, j; | ||
| 4277 | |||
| 4278 | /* display page control */ | ||
| 4279 | printf("bn:0x%lx flag:0x%x nextindex:%d\n", | ||
| 4280 | (ulong) bn, p->header.flag, | ||
| 4281 | le16_to_cpu(p->header.nextindex)); | ||
| 4282 | |||
| 4283 | /* display entries */ | ||
| 4284 | xad = &p->xad[XTENTRYSTART]; | ||
| 4285 | for (i = XTENTRYSTART, j = 1; i < le16_to_cpu(p->header.nextindex); | ||
| 4286 | i++, xad++, j++) { | ||
| 4287 | xoff = offsetXAD(xad); | ||
| 4288 | xaddr = addressXAD(xad); | ||
| 4289 | xlen = lengthXAD(xad); | ||
| 4290 | printf("\t[%d] 0x%lx:0x%lx(0x%x)", i, (ulong) xoff, | ||
| 4291 | (ulong) xaddr, xlen); | ||
| 4292 | |||
| 4293 | if (j == 4) { | ||
| 4294 | printf("\n"); | ||
| 4295 | j = 0; | ||
| 4296 | } | ||
| 4297 | } | ||
| 4298 | |||
| 4299 | printf("\n"); | ||
| 4300 | } | ||
| 4301 | #endif /* _JFS_DEBUG_XTREE */ | ||
| 4302 | |||
| 4303 | |||
| 4304 | #ifdef _JFS_WIP | ||
| 4305 | /* | ||
| 4306 | * xtGather() | ||
| 4307 | * | ||
| 4308 | * function: | ||
| 4309 | * traverse for allocation acquiring tlock at commit time | ||
| 4310 | * (vs at the time of update) logging backward top down | ||
| 4311 | * | ||
| 4312 | * note: | ||
| 4313 | * problem - establishing that all new allocation have been | ||
| 4314 | * processed both for append and random write in sparse file | ||
| 4315 | * at the current entry at the current subtree root page | ||
| 4316 | * | ||
| 4317 | */ | ||
| 4318 | int xtGather(btree_t *t) | ||
| 4319 | { | ||
| 4320 | int rc = 0; | ||
| 4321 | xtpage_t *p; | ||
| 4322 | u64 bn; | ||
| 4323 | int index; | ||
| 4324 | btentry_t *e; | ||
| 4325 | struct btstack btstack; | ||
| 4326 | struct btsf *parent; | ||
| 4327 | |||
| 4328 | /* clear stack */ | ||
| 4329 | BT_CLR(&btstack); | ||
| 4330 | |||
| 4331 | /* | ||
| 4332 | * start with root | ||
| 4333 | * | ||
| 4334 | * root resides in the inode | ||
| 4335 | */ | ||
| 4336 | bn = 0; | ||
| 4337 | XT_GETPAGE(ip, bn, mp, PSIZE, p, rc); | ||
| 4338 | if (rc) | ||
| 4339 | return rc; | ||
| 4340 | |||
| 4341 | /* new root is NOT pointed by a new entry | ||
| 4342 | if (p->header.flag & NEW) | ||
| 4343 | allocate new page lock; | ||
| 4344 | write a NEWPAGE log; | ||
| 4345 | */ | ||
| 4346 | |||
| 4347 | dopage: | ||
| 4348 | /* | ||
| 4349 | * first access of each page: | ||
| 4350 | */ | ||
| 4351 | /* process entries backward from last index */ | ||
| 4352 | index = le16_to_cpu(p->header.nextindex) - 1; | ||
| 4353 | |||
| 4354 | if (p->header.flag & BT_LEAF) { | ||
| 4355 | /* | ||
| 4356 | * first access of each leaf page | ||
| 4357 | */ | ||
| 4358 | /* process leaf page entries backward */ | ||
| 4359 | for (; index >= XTENTRYSTART; index--) { | ||
| 4360 | e = &p->xad[index]; | ||
| 4361 | /* | ||
| 4362 | * if newpage, log NEWPAGE. | ||
| 4363 | * | ||
| 4364 | if (e->flag & XAD_NEW) { | ||
| 4365 | nfound =+ entry->length; | ||
| 4366 | update current page lock for the entry; | ||
| 4367 | newpage(entry); | ||
| 4368 | * | ||
| 4369 | * if moved, log move. | ||
| 4370 | * | ||
| 4371 | } else if (e->flag & XAD_MOVED) { | ||
| 4372 | reset flag; | ||
| 4373 | update current page lock for the entry; | ||
| 4374 | } | ||
| 4375 | */ | ||
| 4376 | } | ||
| 4377 | |||
| 4378 | /* unpin the leaf page */ | ||
| 4379 | XT_PUTPAGE(mp); | ||
| 4380 | |||
| 4381 | /* | ||
| 4382 | * go back up to the parent page | ||
| 4383 | */ | ||
| 4384 | getParent: | ||
| 4385 | /* restore parent entry for the current child page */ | ||
| 4386 | if ((parent = BT_POP(&btstack)) == NULL) | ||
| 4387 | /* current page must have been root */ | ||
| 4388 | return 0; | ||
| 4389 | |||
| 4390 | if ((index = parent->index) == XTENTRYSTART) { | ||
| 4391 | /* | ||
| 4392 | * parent page scan completed | ||
| 4393 | */ | ||
| 4394 | /* go back up to the parent page */ | ||
| 4395 | goto getParent; | ||
| 4396 | } else { | ||
| 4397 | /* | ||
| 4398 | * parent page has entries remaining | ||
| 4399 | */ | ||
| 4400 | /* get back the parent page */ | ||
| 4401 | bn = parent->bn; | ||
| 4402 | XT_GETPAGE(ip, bn, mp, PSIZE, p, rc); | ||
| 4403 | if (rc) | ||
| 4404 | return -EIO; | ||
| 4405 | |||
| 4406 | /* first subroot page which | ||
| 4407 | * covers all new allocated blocks | ||
| 4408 | * itself not new/modified. | ||
| 4409 | * (if modified from split of descendent, | ||
| 4410 | * go down path of split page) | ||
| 4411 | |||
| 4412 | if (nfound == nnew && | ||
| 4413 | !(p->header.flag & (NEW | MOD))) | ||
| 4414 | exit scan; | ||
| 4415 | */ | ||
| 4416 | |||
| 4417 | /* process parent page entries backward */ | ||
| 4418 | index--; | ||
| 4419 | } | ||
| 4420 | } else { | ||
| 4421 | /* | ||
| 4422 | * first access of each internal page | ||
| 4423 | */ | ||
| 4424 | } | ||
| 4425 | |||
| 4426 | /* | ||
| 4427 | * internal page: go down to child page of current entry | ||
| 4428 | */ | ||
| 4429 | |||
| 4430 | /* save current parent entry for the child page */ | ||
| 4431 | BT_PUSH(&btstack, bn, index); | ||
| 4432 | |||
| 4433 | /* get current entry for the child page */ | ||
| 4434 | e = &p->xad[index]; | ||
| 4435 | |||
| 4436 | /* | ||
| 4437 | * first access of each internal entry: | ||
| 4438 | */ | ||
| 4439 | /* | ||
| 4440 | * if new entry, log btree_tnewentry. | ||
| 4441 | * | ||
| 4442 | if (e->flag & XAD_NEW) | ||
| 4443 | update parent page lock for the entry; | ||
| 4444 | */ | ||
| 4445 | |||
| 4446 | /* release parent page */ | ||
| 4447 | XT_PUTPAGE(mp); | ||
| 4448 | |||
| 4449 | /* get child page */ | ||
| 4450 | bn = e->bn; | ||
| 4451 | XT_GETPAGE(ip, bn, mp, PSIZE, p, rc); | ||
| 4452 | if (rc) | ||
| 4453 | return rc; | ||
| 4454 | |||
| 4455 | /* | ||
| 4456 | * first access of each non-root page: | ||
| 4457 | */ | ||
| 4458 | /* | ||
| 4459 | * if new, log btree_newpage. | ||
| 4460 | * | ||
| 4461 | if (p->header.flag & NEW) | ||
| 4462 | allocate new page lock; | ||
| 4463 | write a NEWPAGE log (next, prev); | ||
| 4464 | */ | ||
| 4465 | |||
| 4466 | /* process the child page */ | ||
| 4467 | goto dopage; | ||
| 4468 | |||
| 4469 | out: | ||
| 4470 | return 0; | ||
| 4471 | } | ||
| 4472 | #endif /* _JFS_WIP */ | ||
| 4473 | |||
| 4474 | |||
| 4475 | #ifdef CONFIG_JFS_STATISTICS | 4135 | #ifdef CONFIG_JFS_STATISTICS |
| 4476 | int jfs_xtstat_read(char *buffer, char **start, off_t offset, int length, | 4136 | int jfs_xtstat_read(char *buffer, char **start, off_t offset, int length, |
| 4477 | int *eof, void *data) | 4137 | int *eof, void *data) |
diff --git a/fs/jfs/jfs_xtree.h b/fs/jfs/jfs_xtree.h index a69784254fe7..af668a80b40f 100644 --- a/fs/jfs/jfs_xtree.h +++ b/fs/jfs/jfs_xtree.h | |||
| @@ -131,10 +131,4 @@ extern int xtRelocate(tid_t tid, struct inode *ip, | |||
| 131 | extern int xtAppend(tid_t tid, | 131 | extern int xtAppend(tid_t tid, |
| 132 | struct inode *ip, int xflag, s64 xoff, int maxblocks, | 132 | struct inode *ip, int xflag, s64 xoff, int maxblocks, |
| 133 | int *xlenp, s64 * xaddrp, int flag); | 133 | int *xlenp, s64 * xaddrp, int flag); |
| 134 | |||
| 135 | #ifdef _JFS_DEBUG_XTREE | ||
| 136 | extern int xtDisplayTree(struct inode *ip); | ||
| 137 | extern int xtDisplayPage(struct inode *ip, s64 bn, xtpage_t * p); | ||
| 138 | #endif /* _JFS_DEBUG_XTREE */ | ||
| 139 | |||
| 140 | #endif /* !_H_JFS_XTREE */ | 134 | #endif /* !_H_JFS_XTREE */ |
diff --git a/fs/jfs/xattr.c b/fs/jfs/xattr.c index ee438d429d45..554ec739e49b 100644 --- a/fs/jfs/xattr.c +++ b/fs/jfs/xattr.c | |||
| @@ -781,7 +781,7 @@ static int can_set_xattr(struct inode *inode, const char *name, | |||
| 781 | if (IS_RDONLY(inode)) | 781 | if (IS_RDONLY(inode)) |
| 782 | return -EROFS; | 782 | return -EROFS; |
| 783 | 783 | ||
| 784 | if (IS_IMMUTABLE(inode) || IS_APPEND(inode) || S_ISLNK(inode->i_mode)) | 784 | if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) |
| 785 | return -EPERM; | 785 | return -EPERM; |
| 786 | 786 | ||
| 787 | if(strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN) == 0) | 787 | if(strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN) == 0) |
| @@ -790,12 +790,12 @@ static int can_set_xattr(struct inode *inode, const char *name, | |||
| 790 | */ | 790 | */ |
| 791 | return can_set_system_xattr(inode, name, value, value_len); | 791 | return can_set_system_xattr(inode, name, value, value_len); |
| 792 | 792 | ||
| 793 | if(strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN) != 0) | 793 | if(strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN) == 0) |
| 794 | return (capable(CAP_SYS_ADMIN) ? 0 : -EPERM); | 794 | return (capable(CAP_SYS_ADMIN) ? 0 : -EPERM); |
| 795 | 795 | ||
| 796 | #ifdef CONFIG_JFS_SECURITY | 796 | #ifdef CONFIG_JFS_SECURITY |
| 797 | if (strncmp(name, XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN) | 797 | if (strncmp(name, XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN) |
| 798 | != 0) | 798 | == 0) |
| 799 | return 0; /* Leave it to the security module */ | 799 | return 0; /* Leave it to the security module */ |
| 800 | #endif | 800 | #endif |
| 801 | 801 | ||
