Fixed freeing a full compression block when fragmented

PERMISSION_HANDLING_BRANCH
Jean-Pierre André 2010-05-28 16:33:50 +02:00
parent b20d1020fc
commit cc4b358383
1 changed files with 16 additions and 4 deletions

View File

@ -1130,7 +1130,7 @@ static int ntfs_compress_overwr_free(ntfs_attr *na, runlist_element *rl,
/* merging with a hole before */ /* merging with a hole before */
freerl = rl; freerl = rl;
} else { } else {
rl->length -= freelength; rl->length -= freelength; /* warning : can be zero */
freerl = ++rl; freerl = ++rl;
} }
if (!mergeholes && (usedcnt || beginhole)) { if (!mergeholes && (usedcnt || beginhole)) {
@ -1154,6 +1154,8 @@ static int ntfs_compress_overwr_free(ntfs_attr *na, runlist_element *rl,
if (!usedcnt) { if (!usedcnt) {
holes++; holes++;
freerl--; freerl--;
freerl->length += (threeparts
? freecnt : freelength);
if (freerl->vcn < *update_from) if (freerl->vcn < *update_from)
*update_from = freerl->vcn; *update_from = freerl->vcn;
} }
@ -1352,16 +1354,26 @@ static int ntfs_compress_free(ntfs_attr *na, runlist_element *rl,
usedcnt,freecnt,update_from); usedcnt,freecnt,update_from);
else { else {
freelength = rl->length - usedcnt; freelength = rl->length - usedcnt;
rl->length = usedcnt; /* warning : can be zero */
beginhole = !usedcnt && !rl->vcn; beginhole = !usedcnt && !rl->vcn;
mergeholes = !usedcnt mergeholes = !usedcnt
&& rl[0].vcn && rl[0].vcn
&& (rl[-1].lcn == LCN_HOLE); && (rl[-1].lcn == LCN_HOLE);
if (mergeholes) { if (mergeholes) {
s32 carry;
/* shorten the runs which have free space */
carry = freecnt;
freerl = rl; freerl = rl;
freerl->length = freecnt; while (freerl->length < carry) {
} else carry -= freerl->length;
freerl++;
}
freerl->length = carry;
freerl = rl;
} else {
rl->length = usedcnt; /* can be zero ? */
freerl = ++rl; freerl = ++rl;
}
if ((freelength > 0) if ((freelength > 0)
&& !mergeholes && !mergeholes
&& (usedcnt || beginhole)) { && (usedcnt || beginhole)) {