fs/ntfs3: Add new argument is_mft to ntfs_mark_rec_free
This argument helps in avoiding double locking Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
This commit is contained in:
parent
6700eabb90
commit
071100ea0e
|
@ -1048,7 +1048,7 @@ out2:
|
|||
err = -EINVAL;
|
||||
|
||||
out1:
|
||||
ntfs_mark_rec_free(sbi, rno);
|
||||
ntfs_mark_rec_free(sbi, rno, is_mft);
|
||||
|
||||
out:
|
||||
return err;
|
||||
|
@ -1243,7 +1243,7 @@ static int ni_expand_mft_list(struct ntfs_inode *ni)
|
|||
mft_min = mft_new;
|
||||
mi_min = mi_new;
|
||||
} else {
|
||||
ntfs_mark_rec_free(sbi, mft_new);
|
||||
ntfs_mark_rec_free(sbi, mft_new, true);
|
||||
mft_new = 0;
|
||||
ni_remove_mi(ni, mi_new);
|
||||
}
|
||||
|
@ -1326,7 +1326,7 @@ static int ni_expand_mft_list(struct ntfs_inode *ni)
|
|||
|
||||
out:
|
||||
if (mft_new) {
|
||||
ntfs_mark_rec_free(sbi, mft_new);
|
||||
ntfs_mark_rec_free(sbi, mft_new, true);
|
||||
ni_remove_mi(ni, mi_new);
|
||||
}
|
||||
|
||||
|
@ -1585,7 +1585,7 @@ int ni_delete_all(struct ntfs_inode *ni)
|
|||
mi->dirty = true;
|
||||
mi_write(mi, 0);
|
||||
|
||||
ntfs_mark_rec_free(sbi, mi->rno);
|
||||
ntfs_mark_rec_free(sbi, mi->rno, false);
|
||||
ni_remove_mi(ni, mi);
|
||||
mi_put(mi);
|
||||
node = next;
|
||||
|
@ -1596,7 +1596,7 @@ int ni_delete_all(struct ntfs_inode *ni)
|
|||
ni->mi.dirty = true;
|
||||
err = mi_write(&ni->mi, 0);
|
||||
|
||||
ntfs_mark_rec_free(sbi, ni->mi.rno);
|
||||
ntfs_mark_rec_free(sbi, ni->mi.rno, false);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
@ -3286,7 +3286,7 @@ int ni_write_inode(struct inode *inode, int sync, const char *hint)
|
|||
err = err2;
|
||||
|
||||
if (is_empty) {
|
||||
ntfs_mark_rec_free(sbi, mi->rno);
|
||||
ntfs_mark_rec_free(sbi, mi->rno, false);
|
||||
rb_erase(node, &ni->mi_tree);
|
||||
mi_put(mi);
|
||||
}
|
||||
|
|
|
@ -703,12 +703,14 @@ out:
|
|||
|
||||
/*
|
||||
* ntfs_mark_rec_free - Mark record as free.
|
||||
* is_mft - true if we are changing MFT
|
||||
*/
|
||||
void ntfs_mark_rec_free(struct ntfs_sb_info *sbi, CLST rno)
|
||||
void ntfs_mark_rec_free(struct ntfs_sb_info *sbi, CLST rno, bool is_mft)
|
||||
{
|
||||
struct wnd_bitmap *wnd = &sbi->mft.bitmap;
|
||||
|
||||
down_write_nested(&wnd->rw_lock, BITMAP_MUTEX_MFT);
|
||||
if (!is_mft)
|
||||
down_write_nested(&wnd->rw_lock, BITMAP_MUTEX_MFT);
|
||||
if (rno >= wnd->nbits)
|
||||
goto out;
|
||||
|
||||
|
@ -727,7 +729,8 @@ void ntfs_mark_rec_free(struct ntfs_sb_info *sbi, CLST rno)
|
|||
sbi->mft.next_free = rno;
|
||||
|
||||
out:
|
||||
up_write(&wnd->rw_lock);
|
||||
if (!is_mft)
|
||||
up_write(&wnd->rw_lock);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -1636,7 +1636,7 @@ out4:
|
|||
ni->mi.dirty = false;
|
||||
discard_new_inode(inode);
|
||||
out3:
|
||||
ntfs_mark_rec_free(sbi, ino);
|
||||
ntfs_mark_rec_free(sbi, ino, false);
|
||||
|
||||
out2:
|
||||
__putname(new_de);
|
||||
|
|
|
@ -590,7 +590,7 @@ int ntfs_look_for_free_space(struct ntfs_sb_info *sbi, CLST lcn, CLST len,
|
|||
enum ALLOCATE_OPT opt);
|
||||
int ntfs_look_free_mft(struct ntfs_sb_info *sbi, CLST *rno, bool mft,
|
||||
struct ntfs_inode *ni, struct mft_inode **mi);
|
||||
void ntfs_mark_rec_free(struct ntfs_sb_info *sbi, CLST rno);
|
||||
void ntfs_mark_rec_free(struct ntfs_sb_info *sbi, CLST rno, bool is_mft);
|
||||
int ntfs_clear_mft_tail(struct ntfs_sb_info *sbi, size_t from, size_t to);
|
||||
int ntfs_refresh_zone(struct ntfs_sb_info *sbi);
|
||||
void ntfs_update_mftmirr(struct ntfs_sb_info *sbi, int wait);
|
||||
|
|
Loading…
Reference in New Issue