mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-14 09:25:12 +00:00
NTFS: Make ntfs_write_block() not instantiate sparse blocks if they are zero.
Signed-off-by: Anton Altaparmakov <aia21@cantab.net>
This commit is contained in:
parent
67bb103725
commit
8dcdebafb8
@ -77,6 +77,8 @@ ToDo/Notes:
|
|||||||
updating the times in the inode in ntfs_setattr().
|
updating the times in the inode in ntfs_setattr().
|
||||||
- Fixup handling of sparse, compressed, and encrypted attributes in
|
- Fixup handling of sparse, compressed, and encrypted attributes in
|
||||||
fs/ntfs/inode.c::ntfs_read_locked_{,attr_,index_}inode().
|
fs/ntfs/inode.c::ntfs_read_locked_{,attr_,index_}inode().
|
||||||
|
- Make ntfs_write_block() not instantiate sparse blocks if they contain
|
||||||
|
only zeroes.
|
||||||
|
|
||||||
2.1.23 - Implement extension of resident files and make writing safe as well as
|
2.1.23 - Implement extension of resident files and make writing safe as well as
|
||||||
many bug fixes, cleanups, and enhancements...
|
many bug fixes, cleanups, and enhancements...
|
||||||
|
@ -670,6 +670,27 @@ lock_retry_remap:
|
|||||||
}
|
}
|
||||||
/* It is a hole, need to instantiate it. */
|
/* It is a hole, need to instantiate it. */
|
||||||
if (lcn == LCN_HOLE) {
|
if (lcn == LCN_HOLE) {
|
||||||
|
u8 *kaddr;
|
||||||
|
unsigned long *bpos, *bend;
|
||||||
|
|
||||||
|
/* Check if the buffer is zero. */
|
||||||
|
kaddr = kmap_atomic(page, KM_USER0);
|
||||||
|
bpos = (unsigned long *)(kaddr + bh_offset(bh));
|
||||||
|
bend = (unsigned long *)((u8*)bpos + blocksize);
|
||||||
|
do {
|
||||||
|
if (unlikely(*bpos))
|
||||||
|
break;
|
||||||
|
} while (likely(++bpos < bend));
|
||||||
|
kunmap_atomic(kaddr, KM_USER0);
|
||||||
|
if (bpos == bend) {
|
||||||
|
/*
|
||||||
|
* Buffer is zero and sparse, no need to write
|
||||||
|
* it.
|
||||||
|
*/
|
||||||
|
bh->b_blocknr = -1;
|
||||||
|
clear_buffer_dirty(bh);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
// TODO: Instantiate the hole.
|
// TODO: Instantiate the hole.
|
||||||
// clear_buffer_new(bh);
|
// clear_buffer_new(bh);
|
||||||
// unmap_underlying_metadata(bh->b_bdev, bh->b_blocknr);
|
// unmap_underlying_metadata(bh->b_bdev, bh->b_blocknr);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user