|
Kmods SIG |
63c143 |
From edb853ff3dc01c22577ea5d0383d067b68a6d663 Mon Sep 17 00:00:00 2001
|
|
Kmods SIG |
63c143 |
From: Kari Argillander <kari.argillander@gmail.com>
|
|
Kmods SIG |
63c143 |
Date: Tue, 7 Sep 2021 17:28:39 +0300
|
|
Kmods SIG |
63c143 |
Subject: [Backport edb853ff3dc0] src: Fix ntfs_look_for_free_space() does
|
|
Kmods SIG |
63c143 |
only report -ENOSPC
|
|
Kmods SIG |
63c143 |
|
|
Kmods SIG |
63c143 |
If ntfs_refresh_zone() returns error it will be changed to -ENOSPC. It
|
|
Kmods SIG |
63c143 |
is not right. Also caller of this functions also check other errors.
|
|
Kmods SIG |
63c143 |
|
|
Kmods SIG |
63c143 |
Fixes: 78ab59fee07f ("src: Rework file operations")
|
|
Kmods SIG |
63c143 |
Signed-off-by: Kari Argillander <kari.argillander@gmail.com>
|
|
Kmods SIG |
63c143 |
Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
|
|
Kmods SIG |
63c143 |
---
|
|
Kmods SIG |
63c143 |
src/fsntfs.c | 51 +++++++++++++++++++++++++----------------------
|
|
Kmods SIG |
63c143 |
1 file changed, 27 insertions(+), 24 deletions(-)
|
|
Kmods SIG |
63c143 |
|
|
Kmods SIG |
63c143 |
diff --git a/src/fsntfs.c b/src/fsntfs.c
|
|
Kmods SIG |
63c143 |
index 9232a7f410c68bb0b1f3a5cedd2295b814372404..e77fad89eaed372cbb972cab51d904fe99b3d565 100644
|
|
Kmods SIG |
63c143 |
--- a/src/fsntfs.c
|
|
Kmods SIG |
63c143 |
+++ b/src/fsntfs.c
|
|
Kmods SIG |
63c143 |
@@ -357,7 +357,7 @@ int ntfs_look_for_free_space(struct ntfs_sb_info *sbi, CLST lcn, CLST len,
|
|
Kmods SIG |
63c143 |
enum ALLOCATE_OPT opt)
|
|
Kmods SIG |
63c143 |
{
|
|
Kmods SIG |
63c143 |
int err;
|
|
Kmods SIG |
63c143 |
- CLST alen = 0;
|
|
Kmods SIG |
63c143 |
+ CLST alen;
|
|
Kmods SIG |
63c143 |
struct super_block *sb = sbi->sb;
|
|
Kmods SIG |
63c143 |
size_t alcn, zlen, zeroes, zlcn, zlen2, ztrim, new_zlen;
|
|
Kmods SIG |
63c143 |
struct wnd_bitmap *wnd = &sbi->used.bitmap;
|
|
Kmods SIG |
63c143 |
@@ -369,13 +369,15 @@ int ntfs_look_for_free_space(struct ntfs_sb_info *sbi, CLST lcn, CLST len,
|
|
Kmods SIG |
63c143 |
if (!zlen) {
|
|
Kmods SIG |
63c143 |
err = ntfs_refresh_zone(sbi);
|
|
Kmods SIG |
63c143 |
if (err)
|
|
Kmods SIG |
63c143 |
- goto out;
|
|
Kmods SIG |
63c143 |
+ goto up_write;
|
|
Kmods SIG |
63c143 |
+
|
|
Kmods SIG |
63c143 |
zlen = wnd_zone_len(wnd);
|
|
Kmods SIG |
63c143 |
}
|
|
Kmods SIG |
63c143 |
|
|
Kmods SIG |
63c143 |
if (!zlen) {
|
|
Kmods SIG |
63c143 |
ntfs_err(sbi->sb, "no free space to extend mft");
|
|
Kmods SIG |
63c143 |
- goto out;
|
|
Kmods SIG |
63c143 |
+ err = -ENOSPC;
|
|
Kmods SIG |
63c143 |
+ goto up_write;
|
|
Kmods SIG |
63c143 |
}
|
|
Kmods SIG |
63c143 |
|
|
Kmods SIG |
63c143 |
lcn = wnd_zone_bit(wnd);
|
|
Kmods SIG |
63c143 |
@@ -384,12 +386,11 @@ int ntfs_look_for_free_space(struct ntfs_sb_info *sbi, CLST lcn, CLST len,
|
|
Kmods SIG |
63c143 |
wnd_zone_set(wnd, lcn + alen, zlen - alen);
|
|
Kmods SIG |
63c143 |
|
|
Kmods SIG |
63c143 |
err = wnd_set_used(wnd, lcn, alen);
|
|
Kmods SIG |
63c143 |
- if (err) {
|
|
Kmods SIG |
63c143 |
- up_write(&wnd->rw_lock);
|
|
Kmods SIG |
63c143 |
- return err;
|
|
Kmods SIG |
63c143 |
- }
|
|
Kmods SIG |
63c143 |
+ if (err)
|
|
Kmods SIG |
63c143 |
+ goto up_write;
|
|
Kmods SIG |
63c143 |
+
|
|
Kmods SIG |
63c143 |
alcn = lcn;
|
|
Kmods SIG |
63c143 |
- goto out;
|
|
Kmods SIG |
63c143 |
+ goto space_found;
|
|
Kmods SIG |
63c143 |
}
|
|
Kmods SIG |
63c143 |
/*
|
|
Kmods SIG |
63c143 |
* 'Cause cluster 0 is always used this value means that we should use
|
|
Kmods SIG |
63c143 |
@@ -403,15 +404,17 @@ int ntfs_look_for_free_space(struct ntfs_sb_info *sbi, CLST lcn, CLST len,
|
|
Kmods SIG |
63c143 |
|
|
Kmods SIG |
63c143 |
alen = wnd_find(wnd, len, lcn, BITMAP_FIND_MARK_AS_USED, &alcn);
|
|
Kmods SIG |
63c143 |
if (alen)
|
|
Kmods SIG |
63c143 |
- goto out;
|
|
Kmods SIG |
63c143 |
+ goto space_found;
|
|
Kmods SIG |
63c143 |
|
|
Kmods SIG |
63c143 |
/* Try to use clusters from MftZone. */
|
|
Kmods SIG |
63c143 |
zlen = wnd_zone_len(wnd);
|
|
Kmods SIG |
63c143 |
zeroes = wnd_zeroes(wnd);
|
|
Kmods SIG |
63c143 |
|
|
Kmods SIG |
63c143 |
/* Check too big request */
|
|
Kmods SIG |
63c143 |
- if (len > zeroes + zlen || zlen <= NTFS_MIN_MFT_ZONE)
|
|
Kmods SIG |
63c143 |
- goto out;
|
|
Kmods SIG |
63c143 |
+ if (len > zeroes + zlen || zlen <= NTFS_MIN_MFT_ZONE) {
|
|
Kmods SIG |
63c143 |
+ err = -ENOSPC;
|
|
Kmods SIG |
63c143 |
+ goto up_write;
|
|
Kmods SIG |
63c143 |
+ }
|
|
Kmods SIG |
63c143 |
|
|
Kmods SIG |
63c143 |
/* How many clusters to cat from zone. */
|
|
Kmods SIG |
63c143 |
zlcn = wnd_zone_bit(wnd);
|
|
Kmods SIG |
63c143 |
@@ -430,22 +433,22 @@ int ntfs_look_for_free_space(struct ntfs_sb_info *sbi, CLST lcn, CLST len,
|
|
Kmods SIG |
63c143 |
/* Allocate continues clusters. */
|
|
Kmods SIG |
63c143 |
alen = wnd_find(wnd, len, 0,
|
|
Kmods SIG |
63c143 |
BITMAP_FIND_MARK_AS_USED | BITMAP_FIND_FULL, &alcn);
|
|
Kmods SIG |
63c143 |
-
|
|
Kmods SIG |
63c143 |
-out:
|
|
Kmods SIG |
63c143 |
- if (alen) {
|
|
Kmods SIG |
63c143 |
- err = 0;
|
|
Kmods SIG |
63c143 |
- *new_len = alen;
|
|
Kmods SIG |
63c143 |
- *new_lcn = alcn;
|
|
Kmods SIG |
63c143 |
-
|
|
Kmods SIG |
63c143 |
- ntfs_unmap_meta(sb, alcn, alen);
|
|
Kmods SIG |
63c143 |
-
|
|
Kmods SIG |
63c143 |
- /* Set hint for next requests. */
|
|
Kmods SIG |
63c143 |
- if (!(opt & ALLOCATE_MFT))
|
|
Kmods SIG |
63c143 |
- sbi->used.next_free_lcn = alcn + alen;
|
|
Kmods SIG |
63c143 |
- } else {
|
|
Kmods SIG |
63c143 |
+ if (!alen) {
|
|
Kmods SIG |
63c143 |
err = -ENOSPC;
|
|
Kmods SIG |
63c143 |
+ goto up_write;
|
|
Kmods SIG |
63c143 |
}
|
|
Kmods SIG |
63c143 |
|
|
Kmods SIG |
63c143 |
+space_found:
|
|
Kmods SIG |
63c143 |
+ err = 0;
|
|
Kmods SIG |
63c143 |
+ *new_len = alen;
|
|
Kmods SIG |
63c143 |
+ *new_lcn = alcn;
|
|
Kmods SIG |
63c143 |
+
|
|
Kmods SIG |
63c143 |
+ ntfs_unmap_meta(sb, alcn, alen);
|
|
Kmods SIG |
63c143 |
+
|
|
Kmods SIG |
63c143 |
+ /* Set hint for next requests. */
|
|
Kmods SIG |
63c143 |
+ if (!(opt & ALLOCATE_MFT))
|
|
Kmods SIG |
63c143 |
+ sbi->used.next_free_lcn = alcn + alen;
|
|
Kmods SIG |
63c143 |
+up_write:
|
|
Kmods SIG |
63c143 |
up_write(&wnd->rw_lock);
|
|
Kmods SIG |
63c143 |
return err;
|
|
Kmods SIG |
63c143 |
}
|
|
Kmods SIG |
63c143 |
--
|
|
Kmods SIG |
63c143 |
2.31.1
|
|
Kmods SIG |
63c143 |
|