patch-2.4.27 linux-2.4.27/fs/hpfs/alloc.c
Next file: linux-2.4.27/fs/hpfs/anode.c
Previous file: linux-2.4.27/fs/hfs/file_hdr.c
Back to the patch index
Back to the overall index
- Lines: 135
- Date:
2004-08-07 16:26:05.978401181 -0700
- Orig file:
linux-2.4.26/fs/hpfs/alloc.c
- Orig date:
1999-06-04 01:06:29.000000000 -0700
diff -urN linux-2.4.26/fs/hpfs/alloc.c linux-2.4.27/fs/hpfs/alloc.c
@@ -79,11 +79,11 @@
} else {
if (!(bmp = hpfs_map_dnode_bitmap(s, &qbh))) goto uls;
}
- /*if (!tstbits(bmp, nr + n, n + forward)) {
+ if (!tstbits(bmp, nr, n + forward)) {
ret = bs + nr;
goto rt;
}
- if (!tstbits(bmp, nr + 2*n, n + forward)) {
+ /*if (!tstbits(bmp, nr + n, n + forward)) {
ret = bs + nr + n;
goto rt;
}*/
@@ -103,9 +103,11 @@
goto rt;
}
nr >>= 5;
- for (i = nr + 1; i != nr; i++, i &= 0x1ff) {
- if (!bmp[i]) continue;
- if (n + forward >= 0x3f && bmp[i] != -1) continue;
+ /*for (i = nr + 1; i != nr; i++, i &= 0x1ff) {*/
+ i = nr;
+ do {
+ if (!bmp[i]) goto cont;
+ if (n + forward >= 0x3f && bmp[i] != -1) goto cont;
q = i<<5;
if (i > 0) {
unsigned k = bmp[i-1];
@@ -123,7 +125,9 @@
ret = bs + q;
goto rt;
}
- }
+ cont:
+ i++, i &= 0x1ff;
+ } while (i != nr);
rt:
if (ret) {
if (s->s_hpfs_chk && ((ret >> 14) != (bs >> 14) || (bmp[(ret & 0x3fff) >> 5] | ~(((1 << n) - 1) << (ret & 0x1f))) != 0xffffffff)) {
@@ -152,45 +156,57 @@
secno hpfs_alloc_sector(struct super_block *s, secno near, unsigned n, int forward, int lock)
{
secno sec;
- unsigned i;
+ int i;
unsigned n_bmps;
- int b = s->s_hpfs_c_bitmap;
int f_p = 0;
+ int near_bmp;
if (forward < 0) {
forward = -forward;
f_p = 1;
}
if (lock) hpfs_lock_creation(s);
- if (near && near < s->s_hpfs_fs_size)
+ n_bmps = (s->s_hpfs_fs_size + 0x4000 - 1) >> 14;
+ if (near && near < s->s_hpfs_fs_size) {
if ((sec = alloc_in_bmp(s, near, n, f_p ? forward : forward/4))) goto ret;
+ near_bmp = near >> 14;
+ } else near_bmp = n_bmps / 2;
+ /*
if (b != -1) {
if ((sec = alloc_in_bmp(s, b<<14, n, f_p ? forward : forward/2))) {
b &= 0x0fffffff;
goto ret;
}
if (b > 0x10000000) if ((sec = alloc_in_bmp(s, (b&0xfffffff)<<14, n, f_p ? forward : 0))) goto ret;
- }
- n_bmps = (s->s_hpfs_fs_size + 0x4000 - 1) >> 14;
- for (i = 0; i < n_bmps / 2; i++) {
- if ((sec = alloc_in_bmp(s, (n_bmps/2+i) << 14, n, forward))) {
- s->s_hpfs_c_bitmap = n_bmps/2+i;
+ }
+ */
+ if (!f_p) if (forward > s->s_hpfs_max_fwd_alloc) forward = s->s_hpfs_max_fwd_alloc;
+ less_fwd:
+ for (i = 0; i < n_bmps; i++) {
+ if (near_bmp+i < n_bmps && ((sec = alloc_in_bmp(s, (near_bmp+i) << 14, n, forward)))) {
+ s->s_hpfs_c_bitmap = near_bmp+i;
goto ret;
}
- if ((sec = alloc_in_bmp(s, (n_bmps/2-i-1) << 14, n, forward))) {
- s->s_hpfs_c_bitmap = n_bmps/2-i-1;
+ if (!forward) {
+ if (near_bmp-i-1 >= 0 && ((sec = alloc_in_bmp(s, (near_bmp-i-1) << 14, n, forward)))) {
+ s->s_hpfs_c_bitmap = near_bmp-i-1;
+ goto ret;
+ }
+ } else {
+ if (near_bmp+i >= n_bmps && ((sec = alloc_in_bmp(s, (near_bmp+i-n_bmps) << 14, n, forward)))) {
+ s->s_hpfs_c_bitmap = near_bmp+i-n_bmps;
+ goto ret;
+ }
+ }
+ if (i == 1 && s->s_hpfs_c_bitmap != -1 && ((sec = alloc_in_bmp(s, (s->s_hpfs_c_bitmap) << 14, n, forward)))) {
goto ret;
}
}
- if ((sec = alloc_in_bmp(s, (n_bmps-1) << 14, n, forward))) {
- s->s_hpfs_c_bitmap = n_bmps-1;
- goto ret;
- }
if (!f_p) {
- for (i = 0; i < n_bmps; i++)
- if ((sec = alloc_in_bmp(s, i << 14, n, 0))) {
- s->s_hpfs_c_bitmap = 0x10000000 + i;
- goto ret;
- }
+ if (forward) {
+ s->s_hpfs_max_fwd_alloc = forward * 3 / 4;
+ forward /= 2;
+ goto less_fwd;
+ }
}
sec = 0;
ret:
@@ -267,6 +283,8 @@
return;
}
lock_super(s);
+ s->s_hpfs_max_fwd_alloc += n > 0xffff ? 0xffff : n;
+ if (s->s_hpfs_max_fwd_alloc > 0xffffff) s->s_hpfs_max_fwd_alloc = 0xffffff;
new_map:
if (!(bmp = hpfs_map_bitmap(s, sec >> 14, &qbh, "free"))) {
unlock_super(s);
@@ -319,7 +337,7 @@
}
hpfs_brelse4(&qbh);
i = 0;
- if (s->s_hpfs_c_bitmap != -1 ) {
+ if (s->s_hpfs_c_bitmap != -1) {
bmp = hpfs_map_bitmap(s, b, &qbh, "chkdn1");
goto chk_bmp;
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)