Merge git://git.kernel.org/pub/scm/linux/kernel/git/aia21/ntfs
Pull NTFS update from Anton Altaparmakov: "Here is a small NTFS update notably implementing FIBMAP ioctl for NTFS by adding the bmap address space operation. People seem to still want FIBMAP" * git://git.kernel.org/pub/scm/linux/kernel/git/aia21/ntfs: NTFS: Bump version to 2.1.31. NTFS: Add bmap address space operation needed for FIBMAP ioctl. NTFS: Remove changelog from Documentation/filesystems/ntfs.txt. NTFS: Split ntfs_aops into ntfs_normal_aops and ntfs_compressed_aops in preparation for them diverging.
This commit is contained in:
commit
4869447d21
5 changed files with 167 additions and 293 deletions
|
@ -14,7 +14,6 @@ Table of contents
|
||||||
- The Device-Mapper driver
|
- The Device-Mapper driver
|
||||||
- The Software RAID / MD driver
|
- The Software RAID / MD driver
|
||||||
- Limitations when using the MD driver
|
- Limitations when using the MD driver
|
||||||
- ChangeLog
|
|
||||||
|
|
||||||
|
|
||||||
Overview
|
Overview
|
||||||
|
@ -450,270 +449,3 @@ number of sectors BEFORE attempting to use it. You have been warned!
|
||||||
|
|
||||||
Even better is to simply use the Device-Mapper for linear raid and then you do
|
Even better is to simply use the Device-Mapper for linear raid and then you do
|
||||||
not have this problem with odd numbers of sectors.
|
not have this problem with odd numbers of sectors.
|
||||||
|
|
||||||
|
|
||||||
ChangeLog
|
|
||||||
=========
|
|
||||||
|
|
||||||
2.1.30:
|
|
||||||
- Fix writev() (it kept writing the first segment over and over again
|
|
||||||
instead of moving onto subsequent segments).
|
|
||||||
- Fix crash in ntfs_mft_record_alloc() when mapping the new extent mft
|
|
||||||
record failed.
|
|
||||||
2.1.29:
|
|
||||||
- Fix a deadlock when mounting read-write.
|
|
||||||
2.1.28:
|
|
||||||
- Fix a deadlock.
|
|
||||||
2.1.27:
|
|
||||||
- Implement page migration support so the kernel can move memory used
|
|
||||||
by NTFS files and directories around for management purposes.
|
|
||||||
- Add support for writing to sparse files created with Windows XP SP2.
|
|
||||||
- Many minor improvements and bug fixes.
|
|
||||||
2.1.26:
|
|
||||||
- Implement support for sector sizes above 512 bytes (up to the maximum
|
|
||||||
supported by NTFS which is 4096 bytes).
|
|
||||||
- Enhance support for NTFS volumes which were supported by Windows but
|
|
||||||
not by Linux due to invalid attribute list attribute flags.
|
|
||||||
- A few minor updates and bug fixes.
|
|
||||||
2.1.25:
|
|
||||||
- Write support is now extended with write(2) being able to both
|
|
||||||
overwrite existing file data and to extend files. Also, if a write
|
|
||||||
to a sparse region occurs, write(2) will fill in the hole. Note,
|
|
||||||
mmap(2) based writes still do not support writing into holes or
|
|
||||||
writing beyond the initialized size.
|
|
||||||
- Write support has a new feature and that is that truncate(2) and
|
|
||||||
open(2) with O_TRUNC are now implemented thus files can be both made
|
|
||||||
smaller and larger.
|
|
||||||
- Note: Both write(2) and truncate(2)/open(2) with O_TRUNC still have
|
|
||||||
limitations in that they
|
|
||||||
- only provide limited support for highly fragmented files.
|
|
||||||
- only work on regular, i.e. uncompressed and unencrypted files.
|
|
||||||
- never create sparse files although this will change once directory
|
|
||||||
operations are implemented.
|
|
||||||
- Lots of bug fixes and enhancements across the board.
|
|
||||||
2.1.24:
|
|
||||||
- Support journals ($LogFile) which have been modified by chkdsk. This
|
|
||||||
means users can boot into Windows after we marked the volume dirty.
|
|
||||||
The Windows boot will run chkdsk and then reboot. The user can then
|
|
||||||
immediately boot into Linux rather than having to do a full Windows
|
|
||||||
boot first before rebooting into Linux and we will recognize such a
|
|
||||||
journal and empty it as it is clean by definition.
|
|
||||||
- Support journals ($LogFile) with only one restart page as well as
|
|
||||||
journals with two different restart pages. We sanity check both and
|
|
||||||
either use the only sane one or the more recent one of the two in the
|
|
||||||
case that both are valid.
|
|
||||||
- Lots of bug fixes and enhancements across the board.
|
|
||||||
2.1.23:
|
|
||||||
- Stamp the user space journal, aka transaction log, aka $UsnJrnl, if
|
|
||||||
it is present and active thus telling Windows and applications using
|
|
||||||
the transaction log that changes can have happened on the volume
|
|
||||||
which are not recorded in $UsnJrnl.
|
|
||||||
- Detect the case when Windows has been hibernated (suspended to disk)
|
|
||||||
and if this is the case do not allow (re)mounting read-write to
|
|
||||||
prevent data corruption when you boot back into the suspended
|
|
||||||
Windows session.
|
|
||||||
- Implement extension of resident files using the normal file write
|
|
||||||
code paths, i.e. most very small files can be extended to be a little
|
|
||||||
bit bigger but not by much.
|
|
||||||
- Add new mount option "disable_sparse". (See list of mount options
|
|
||||||
above for details.)
|
|
||||||
- Improve handling of ntfs volumes with errors and strange boot sectors
|
|
||||||
in particular.
|
|
||||||
- Fix various bugs including a nasty deadlock that appeared in recent
|
|
||||||
kernels (around 2.6.11-2.6.12 timeframe).
|
|
||||||
2.1.22:
|
|
||||||
- Improve handling of ntfs volumes with errors.
|
|
||||||
- Fix various bugs and race conditions.
|
|
||||||
2.1.21:
|
|
||||||
- Fix several race conditions and various other bugs.
|
|
||||||
- Many internal cleanups, code reorganization, optimizations, and mft
|
|
||||||
and index record writing code rewritten to fit in with the changes.
|
|
||||||
- Update Documentation/filesystems/ntfs.txt with instructions on how to
|
|
||||||
use the Device-Mapper driver with NTFS ftdisk/LDM raid.
|
|
||||||
2.1.20:
|
|
||||||
- Fix two stupid bugs introduced in 2.1.18 release.
|
|
||||||
2.1.19:
|
|
||||||
- Minor bugfix in handling of the default upcase table.
|
|
||||||
- Many internal cleanups and improvements. Many thanks to Linus
|
|
||||||
Torvalds and Al Viro for the help and advice with the sparse
|
|
||||||
annotations and cleanups.
|
|
||||||
2.1.18:
|
|
||||||
- Fix scheduling latencies at mount time. (Ingo Molnar)
|
|
||||||
- Fix endianness bug in a little traversed portion of the attribute
|
|
||||||
lookup code.
|
|
||||||
2.1.17:
|
|
||||||
- Fix bugs in mount time error code paths.
|
|
||||||
2.1.16:
|
|
||||||
- Implement access time updates (including mtime and ctime).
|
|
||||||
- Implement fsync(2), fdatasync(2), and msync(2) system calls.
|
|
||||||
- Enable the readv(2) and writev(2) system calls.
|
|
||||||
- Enable access via the asynchronous io (aio) API by adding support for
|
|
||||||
the aio_read(3) and aio_write(3) functions.
|
|
||||||
2.1.15:
|
|
||||||
- Invalidate quotas when (re)mounting read-write.
|
|
||||||
NOTE: This now only leave user space journalling on the side. (See
|
|
||||||
note for version 2.1.13, below.)
|
|
||||||
2.1.14:
|
|
||||||
- Fix an NFSd caused deadlock reported by several users.
|
|
||||||
2.1.13:
|
|
||||||
- Implement writing of inodes (access time updates are not implemented
|
|
||||||
yet so mounting with -o noatime,nodiratime is enforced).
|
|
||||||
- Enable writing out of resident files so you can now overwrite any
|
|
||||||
uncompressed, unencrypted, nonsparse file as long as you do not
|
|
||||||
change the file size.
|
|
||||||
- Add housekeeping of ntfs system files so that ntfsfix no longer needs
|
|
||||||
to be run after writing to an NTFS volume.
|
|
||||||
NOTE: This still leaves quota tracking and user space journalling on
|
|
||||||
the side but they should not cause data corruption. In the worst
|
|
||||||
case the charged quotas will be out of date ($Quota) and some
|
|
||||||
userspace applications might get confused due to the out of date
|
|
||||||
userspace journal ($UsnJrnl).
|
|
||||||
2.1.12:
|
|
||||||
- Fix the second fix to the decompression engine from the 2.1.9 release
|
|
||||||
and some further internals cleanups.
|
|
||||||
2.1.11:
|
|
||||||
- Driver internal cleanups.
|
|
||||||
2.1.10:
|
|
||||||
- Force read-only (re)mounting of volumes with unsupported volume
|
|
||||||
flags and various cleanups.
|
|
||||||
2.1.9:
|
|
||||||
- Fix two bugs in handling of corner cases in the decompression engine.
|
|
||||||
2.1.8:
|
|
||||||
- Read the $MFT mirror and compare it to the $MFT and if the two do not
|
|
||||||
match, force a read-only mount and do not allow read-write remounts.
|
|
||||||
- Read and parse the $LogFile journal and if it indicates that the
|
|
||||||
volume was not shutdown cleanly, force a read-only mount and do not
|
|
||||||
allow read-write remounts. If the $LogFile indicates a clean
|
|
||||||
shutdown and a read-write (re)mount is requested, empty $LogFile to
|
|
||||||
ensure that Windows cannot cause data corruption by replaying a stale
|
|
||||||
journal after Linux has written to the volume.
|
|
||||||
- Improve time handling so that the NTFS time is fully preserved when
|
|
||||||
converted to kernel time and only up to 99 nano-seconds are lost when
|
|
||||||
kernel time is converted to NTFS time.
|
|
||||||
2.1.7:
|
|
||||||
- Enable NFS exporting of mounted NTFS volumes.
|
|
||||||
2.1.6:
|
|
||||||
- Fix minor bug in handling of compressed directories that fixes the
|
|
||||||
erroneous "du" and "stat" output people reported.
|
|
||||||
2.1.5:
|
|
||||||
- Minor bug fix in attribute list attribute handling that fixes the
|
|
||||||
I/O errors on "ls" of certain fragmented files found by at least two
|
|
||||||
people running Windows XP.
|
|
||||||
2.1.4:
|
|
||||||
- Minor update allowing compilation with all gcc versions (well, the
|
|
||||||
ones the kernel can be compiled with anyway).
|
|
||||||
2.1.3:
|
|
||||||
- Major bug fixes for reading files and volumes in corner cases which
|
|
||||||
were being hit by Windows 2k/XP users.
|
|
||||||
2.1.2:
|
|
||||||
- Major bug fixes alleviating the hangs in statfs experienced by some
|
|
||||||
users.
|
|
||||||
2.1.1:
|
|
||||||
- Update handling of compressed files so people no longer get the
|
|
||||||
frequently reported warning messages about initialized_size !=
|
|
||||||
data_size.
|
|
||||||
2.1.0:
|
|
||||||
- Add configuration option for developmental write support.
|
|
||||||
- Initial implementation of file overwriting. (Writes to resident files
|
|
||||||
are not written out to disk yet, so avoid writing to files smaller
|
|
||||||
than about 1kiB.)
|
|
||||||
- Intercept/abort changes in file size as they are not implemented yet.
|
|
||||||
2.0.25:
|
|
||||||
- Minor bugfixes in error code paths and small cleanups.
|
|
||||||
2.0.24:
|
|
||||||
- Small internal cleanups.
|
|
||||||
- Support for sendfile system call. (Christoph Hellwig)
|
|
||||||
2.0.23:
|
|
||||||
- Massive internal locking changes to mft record locking. Fixes
|
|
||||||
various race conditions and deadlocks.
|
|
||||||
- Fix ntfs over loopback for compressed files by adding an
|
|
||||||
optimization barrier. (gcc was screwing up otherwise ?)
|
|
||||||
Thanks go to Christoph Hellwig for pointing these two out:
|
|
||||||
- Remove now unused function fs/ntfs/malloc.h::vmalloc_nofs().
|
|
||||||
- Fix ntfs_free() for ia64 and parisc.
|
|
||||||
2.0.22:
|
|
||||||
- Small internal cleanups.
|
|
||||||
2.0.21:
|
|
||||||
These only affect 32-bit architectures:
|
|
||||||
- Check for, and refuse to mount too large volumes (maximum is 2TiB).
|
|
||||||
- Check for, and refuse to open too large files and directories
|
|
||||||
(maximum is 16TiB).
|
|
||||||
2.0.20:
|
|
||||||
- Support non-resident directory index bitmaps. This means we now cope
|
|
||||||
with huge directories without problems.
|
|
||||||
- Fix a page leak that manifested itself in some cases when reading
|
|
||||||
directory contents.
|
|
||||||
- Internal cleanups.
|
|
||||||
2.0.19:
|
|
||||||
- Fix race condition and improvements in block i/o interface.
|
|
||||||
- Optimization when reading compressed files.
|
|
||||||
2.0.18:
|
|
||||||
- Fix race condition in reading of compressed files.
|
|
||||||
2.0.17:
|
|
||||||
- Cleanups and optimizations.
|
|
||||||
2.0.16:
|
|
||||||
- Fix stupid bug introduced in 2.0.15 in new attribute inode API.
|
|
||||||
- Big internal cleanup replacing the mftbmp access hacks by using the
|
|
||||||
new attribute inode API instead.
|
|
||||||
2.0.15:
|
|
||||||
- Bug fix in parsing of remount options.
|
|
||||||
- Internal changes implementing attribute (fake) inodes allowing all
|
|
||||||
attribute i/o to go via the page cache and to use all the normal
|
|
||||||
vfs/mm functionality.
|
|
||||||
2.0.14:
|
|
||||||
- Internal changes improving run list merging code and minor locking
|
|
||||||
change to not rely on BKL in ntfs_statfs().
|
|
||||||
2.0.13:
|
|
||||||
- Internal changes towards using iget5_locked() in preparation for
|
|
||||||
fake inodes and small cleanups to ntfs_volume structure.
|
|
||||||
2.0.12:
|
|
||||||
- Internal cleanups in address space operations made possible by the
|
|
||||||
changes introduced in the previous release.
|
|
||||||
2.0.11:
|
|
||||||
- Internal updates and cleanups introducing the first step towards
|
|
||||||
fake inode based attribute i/o.
|
|
||||||
2.0.10:
|
|
||||||
- Microsoft says that the maximum number of inodes is 2^32 - 1. Update
|
|
||||||
the driver accordingly to only use 32-bits to store inode numbers on
|
|
||||||
32-bit architectures. This improves the speed of the driver a little.
|
|
||||||
2.0.9:
|
|
||||||
- Change decompression engine to use a single buffer. This should not
|
|
||||||
affect performance except perhaps on the most heavy i/o on SMP
|
|
||||||
systems when accessing multiple compressed files from multiple
|
|
||||||
devices simultaneously.
|
|
||||||
- Minor updates and cleanups.
|
|
||||||
2.0.8:
|
|
||||||
- Remove now obsolete show_inodes and posix mount option(s).
|
|
||||||
- Restore show_sys_files mount option.
|
|
||||||
- Add new mount option case_sensitive, to determine if the driver
|
|
||||||
treats file names as case sensitive or not.
|
|
||||||
- Mostly drop support for short file names (for backwards compatibility
|
|
||||||
we only support accessing files via their short file name if one
|
|
||||||
exists).
|
|
||||||
- Fix dcache aliasing issues wrt short/long file names.
|
|
||||||
- Cleanups and minor fixes.
|
|
||||||
2.0.7:
|
|
||||||
- Just cleanups.
|
|
||||||
2.0.6:
|
|
||||||
- Major bugfix to make compatible with other kernel changes. This fixes
|
|
||||||
the hangs/oopses on umount.
|
|
||||||
- Locking cleanup in directory operations (remove BKL usage).
|
|
||||||
2.0.5:
|
|
||||||
- Major buffer overflow bug fix.
|
|
||||||
- Minor cleanups and updates for kernel 2.5.12.
|
|
||||||
2.0.4:
|
|
||||||
- Cleanups and updates for kernel 2.5.11.
|
|
||||||
2.0.3:
|
|
||||||
- Small bug fixes, cleanups, and performance improvements.
|
|
||||||
2.0.2:
|
|
||||||
- Use default fmask of 0177 so that files are no executable by default.
|
|
||||||
If you want owner executable files, just use fmask=0077.
|
|
||||||
- Update for kernel 2.5.9 but preserve backwards compatibility with
|
|
||||||
kernel 2.5.7.
|
|
||||||
- Minor bug fixes, cleanups, and updates.
|
|
||||||
2.0.1:
|
|
||||||
- Minor updates, primarily set the executable bit by default on files
|
|
||||||
so they can be executed.
|
|
||||||
2.0.0:
|
|
||||||
- Started ChangeLog.
|
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ ntfs-y := aops.o attrib.o collate.o compress.o debug.o dir.o file.o \
|
||||||
|
|
||||||
ntfs-$(CONFIG_NTFS_RW) += bitmap.o lcnalloc.o logfile.o quota.o usnjrnl.o
|
ntfs-$(CONFIG_NTFS_RW) += bitmap.o lcnalloc.o logfile.o quota.o usnjrnl.o
|
||||||
|
|
||||||
ccflags-y := -DNTFS_VERSION=\"2.1.30\"
|
ccflags-y := -DNTFS_VERSION=\"2.1.31\"
|
||||||
ccflags-$(CONFIG_NTFS_DEBUG) += -DDEBUG
|
ccflags-$(CONFIG_NTFS_DEBUG) += -DDEBUG
|
||||||
ccflags-$(CONFIG_NTFS_RW) += -DNTFS_RW
|
ccflags-$(CONFIG_NTFS_RW) += -DNTFS_RW
|
||||||
|
|
||||||
|
|
163
fs/ntfs/aops.c
163
fs/ntfs/aops.c
|
@ -1,8 +1,7 @@
|
||||||
/**
|
/**
|
||||||
* aops.c - NTFS kernel address space operations and page cache handling.
|
* aops.c - NTFS kernel address space operations and page cache handling.
|
||||||
* Part of the Linux-NTFS project.
|
|
||||||
*
|
*
|
||||||
* Copyright (c) 2001-2007 Anton Altaparmakov
|
* Copyright (c) 2001-2014 Anton Altaparmakov and Tuxera Inc.
|
||||||
* Copyright (c) 2002 Richard Russon
|
* Copyright (c) 2002 Richard Russon
|
||||||
*
|
*
|
||||||
* This program/include file is free software; you can redistribute it and/or
|
* This program/include file is free software; you can redistribute it and/or
|
||||||
|
@ -1539,16 +1538,157 @@ static int ntfs_writepage(struct page *page, struct writeback_control *wbc)
|
||||||
#endif /* NTFS_RW */
|
#endif /* NTFS_RW */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ntfs_aops - general address space operations for inodes and attributes
|
* ntfs_bmap - map logical file block to physical device block
|
||||||
|
* @mapping: address space mapping to which the block to be mapped belongs
|
||||||
|
* @block: logical block to map to its physical device block
|
||||||
|
*
|
||||||
|
* For regular, non-resident files (i.e. not compressed and not encrypted), map
|
||||||
|
* the logical @block belonging to the file described by the address space
|
||||||
|
* mapping @mapping to its physical device block.
|
||||||
|
*
|
||||||
|
* The size of the block is equal to the @s_blocksize field of the super block
|
||||||
|
* of the mounted file system which is guaranteed to be smaller than or equal
|
||||||
|
* to the cluster size thus the block is guaranteed to fit entirely inside the
|
||||||
|
* cluster which means we do not need to care how many contiguous bytes are
|
||||||
|
* available after the beginning of the block.
|
||||||
|
*
|
||||||
|
* Return the physical device block if the mapping succeeded or 0 if the block
|
||||||
|
* is sparse or there was an error.
|
||||||
|
*
|
||||||
|
* Note: This is a problem if someone tries to run bmap() on $Boot system file
|
||||||
|
* as that really is in block zero but there is nothing we can do. bmap() is
|
||||||
|
* just broken in that respect (just like it cannot distinguish sparse from
|
||||||
|
* not available or error).
|
||||||
*/
|
*/
|
||||||
const struct address_space_operations ntfs_aops = {
|
static sector_t ntfs_bmap(struct address_space *mapping, sector_t block)
|
||||||
.readpage = ntfs_readpage, /* Fill page with data. */
|
{
|
||||||
|
s64 ofs, size;
|
||||||
|
loff_t i_size;
|
||||||
|
LCN lcn;
|
||||||
|
unsigned long blocksize, flags;
|
||||||
|
ntfs_inode *ni = NTFS_I(mapping->host);
|
||||||
|
ntfs_volume *vol = ni->vol;
|
||||||
|
unsigned delta;
|
||||||
|
unsigned char blocksize_bits, cluster_size_shift;
|
||||||
|
|
||||||
|
ntfs_debug("Entering for mft_no 0x%lx, logical block 0x%llx.",
|
||||||
|
ni->mft_no, (unsigned long long)block);
|
||||||
|
if (ni->type != AT_DATA || !NInoNonResident(ni) || NInoEncrypted(ni)) {
|
||||||
|
ntfs_error(vol->sb, "BMAP does not make sense for %s "
|
||||||
|
"attributes, returning 0.",
|
||||||
|
(ni->type != AT_DATA) ? "non-data" :
|
||||||
|
(!NInoNonResident(ni) ? "resident" :
|
||||||
|
"encrypted"));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* None of these can happen. */
|
||||||
|
BUG_ON(NInoCompressed(ni));
|
||||||
|
BUG_ON(NInoMstProtected(ni));
|
||||||
|
blocksize = vol->sb->s_blocksize;
|
||||||
|
blocksize_bits = vol->sb->s_blocksize_bits;
|
||||||
|
ofs = (s64)block << blocksize_bits;
|
||||||
|
read_lock_irqsave(&ni->size_lock, flags);
|
||||||
|
size = ni->initialized_size;
|
||||||
|
i_size = i_size_read(VFS_I(ni));
|
||||||
|
read_unlock_irqrestore(&ni->size_lock, flags);
|
||||||
|
/*
|
||||||
|
* If the offset is outside the initialized size or the block straddles
|
||||||
|
* the initialized size then pretend it is a hole unless the
|
||||||
|
* initialized size equals the file size.
|
||||||
|
*/
|
||||||
|
if (unlikely(ofs >= size || (ofs + blocksize > size && size < i_size)))
|
||||||
|
goto hole;
|
||||||
|
cluster_size_shift = vol->cluster_size_bits;
|
||||||
|
down_read(&ni->runlist.lock);
|
||||||
|
lcn = ntfs_attr_vcn_to_lcn_nolock(ni, ofs >> cluster_size_shift, false);
|
||||||
|
up_read(&ni->runlist.lock);
|
||||||
|
if (unlikely(lcn < LCN_HOLE)) {
|
||||||
|
/*
|
||||||
|
* Step down to an integer to avoid gcc doing a long long
|
||||||
|
* comparision in the switch when we know @lcn is between
|
||||||
|
* LCN_HOLE and LCN_EIO (i.e. -1 to -5).
|
||||||
|
*
|
||||||
|
* Otherwise older gcc (at least on some architectures) will
|
||||||
|
* try to use __cmpdi2() which is of course not available in
|
||||||
|
* the kernel.
|
||||||
|
*/
|
||||||
|
switch ((int)lcn) {
|
||||||
|
case LCN_ENOENT:
|
||||||
|
/*
|
||||||
|
* If the offset is out of bounds then pretend it is a
|
||||||
|
* hole.
|
||||||
|
*/
|
||||||
|
goto hole;
|
||||||
|
case LCN_ENOMEM:
|
||||||
|
ntfs_error(vol->sb, "Not enough memory to complete "
|
||||||
|
"mapping for inode 0x%lx. "
|
||||||
|
"Returning 0.", ni->mft_no);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ntfs_error(vol->sb, "Failed to complete mapping for "
|
||||||
|
"inode 0x%lx. Run chkdsk. "
|
||||||
|
"Returning 0.", ni->mft_no);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (lcn < 0) {
|
||||||
|
/* It is a hole. */
|
||||||
|
hole:
|
||||||
|
ntfs_debug("Done (returning hole).");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* The block is really allocated and fullfils all our criteria.
|
||||||
|
* Convert the cluster to units of block size and return the result.
|
||||||
|
*/
|
||||||
|
delta = ofs & vol->cluster_size_mask;
|
||||||
|
if (unlikely(sizeof(block) < sizeof(lcn))) {
|
||||||
|
block = lcn = ((lcn << cluster_size_shift) + delta) >>
|
||||||
|
blocksize_bits;
|
||||||
|
/* If the block number was truncated return 0. */
|
||||||
|
if (unlikely(block != lcn)) {
|
||||||
|
ntfs_error(vol->sb, "Physical block 0x%llx is too "
|
||||||
|
"large to be returned, returning 0.",
|
||||||
|
(long long)lcn);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
block = ((lcn << cluster_size_shift) + delta) >>
|
||||||
|
blocksize_bits;
|
||||||
|
ntfs_debug("Done (returning block 0x%llx).", (unsigned long long)lcn);
|
||||||
|
return block;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ntfs_normal_aops - address space operations for normal inodes and attributes
|
||||||
|
*
|
||||||
|
* Note these are not used for compressed or mst protected inodes and
|
||||||
|
* attributes.
|
||||||
|
*/
|
||||||
|
const struct address_space_operations ntfs_normal_aops = {
|
||||||
|
.readpage = ntfs_readpage,
|
||||||
#ifdef NTFS_RW
|
#ifdef NTFS_RW
|
||||||
.writepage = ntfs_writepage, /* Write dirty page to disk. */
|
.writepage = ntfs_writepage,
|
||||||
|
.set_page_dirty = __set_page_dirty_buffers,
|
||||||
#endif /* NTFS_RW */
|
#endif /* NTFS_RW */
|
||||||
.migratepage = buffer_migrate_page, /* Move a page cache page from
|
.bmap = ntfs_bmap,
|
||||||
one physical page to an
|
.migratepage = buffer_migrate_page,
|
||||||
other. */
|
.is_partially_uptodate = block_is_partially_uptodate,
|
||||||
|
.error_remove_page = generic_error_remove_page,
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ntfs_compressed_aops - address space operations for compressed inodes
|
||||||
|
*/
|
||||||
|
const struct address_space_operations ntfs_compressed_aops = {
|
||||||
|
.readpage = ntfs_readpage,
|
||||||
|
#ifdef NTFS_RW
|
||||||
|
.writepage = ntfs_writepage,
|
||||||
|
.set_page_dirty = __set_page_dirty_buffers,
|
||||||
|
#endif /* NTFS_RW */
|
||||||
|
.migratepage = buffer_migrate_page,
|
||||||
|
.is_partially_uptodate = block_is_partially_uptodate,
|
||||||
.error_remove_page = generic_error_remove_page,
|
.error_remove_page = generic_error_remove_page,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1564,9 +1704,8 @@ const struct address_space_operations ntfs_mst_aops = {
|
||||||
without touching the buffers
|
without touching the buffers
|
||||||
belonging to the page. */
|
belonging to the page. */
|
||||||
#endif /* NTFS_RW */
|
#endif /* NTFS_RW */
|
||||||
.migratepage = buffer_migrate_page, /* Move a page cache page from
|
.migratepage = buffer_migrate_page,
|
||||||
one physical page to an
|
.is_partially_uptodate = block_is_partially_uptodate,
|
||||||
other. */
|
|
||||||
.error_remove_page = generic_error_remove_page,
|
.error_remove_page = generic_error_remove_page,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/**
|
/**
|
||||||
* inode.c - NTFS kernel inode handling. Part of the Linux-NTFS project.
|
* inode.c - NTFS kernel inode handling.
|
||||||
*
|
*
|
||||||
* Copyright (c) 2001-2007 Anton Altaparmakov
|
* Copyright (c) 2001-2014 Anton Altaparmakov and Tuxera Inc.
|
||||||
*
|
*
|
||||||
* This program/include file is free software; you can redistribute it and/or
|
* This program/include file is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License as published
|
* modify it under the terms of the GNU General Public License as published
|
||||||
|
@ -1012,6 +1012,7 @@ static int ntfs_read_locked_inode(struct inode *vi)
|
||||||
/* Setup the operations for this inode. */
|
/* Setup the operations for this inode. */
|
||||||
vi->i_op = &ntfs_dir_inode_ops;
|
vi->i_op = &ntfs_dir_inode_ops;
|
||||||
vi->i_fop = &ntfs_dir_ops;
|
vi->i_fop = &ntfs_dir_ops;
|
||||||
|
vi->i_mapping->a_ops = &ntfs_mst_aops;
|
||||||
} else {
|
} else {
|
||||||
/* It is a file. */
|
/* It is a file. */
|
||||||
ntfs_attr_reinit_search_ctx(ctx);
|
ntfs_attr_reinit_search_ctx(ctx);
|
||||||
|
@ -1160,11 +1161,12 @@ static int ntfs_read_locked_inode(struct inode *vi)
|
||||||
/* Setup the operations for this inode. */
|
/* Setup the operations for this inode. */
|
||||||
vi->i_op = &ntfs_file_inode_ops;
|
vi->i_op = &ntfs_file_inode_ops;
|
||||||
vi->i_fop = &ntfs_file_ops;
|
vi->i_fop = &ntfs_file_ops;
|
||||||
|
vi->i_mapping->a_ops = &ntfs_normal_aops;
|
||||||
|
if (NInoMstProtected(ni))
|
||||||
|
vi->i_mapping->a_ops = &ntfs_mst_aops;
|
||||||
|
else if (NInoCompressed(ni))
|
||||||
|
vi->i_mapping->a_ops = &ntfs_compressed_aops;
|
||||||
}
|
}
|
||||||
if (NInoMstProtected(ni))
|
|
||||||
vi->i_mapping->a_ops = &ntfs_mst_aops;
|
|
||||||
else
|
|
||||||
vi->i_mapping->a_ops = &ntfs_aops;
|
|
||||||
/*
|
/*
|
||||||
* The number of 512-byte blocks used on disk (for stat). This is in so
|
* The number of 512-byte blocks used on disk (for stat). This is in so
|
||||||
* far inaccurate as it doesn't account for any named streams or other
|
* far inaccurate as it doesn't account for any named streams or other
|
||||||
|
@ -1414,10 +1416,11 @@ static int ntfs_read_locked_attr_inode(struct inode *base_vi, struct inode *vi)
|
||||||
ni->allocated_size = sle64_to_cpu(
|
ni->allocated_size = sle64_to_cpu(
|
||||||
a->data.non_resident.allocated_size);
|
a->data.non_resident.allocated_size);
|
||||||
}
|
}
|
||||||
|
vi->i_mapping->a_ops = &ntfs_normal_aops;
|
||||||
if (NInoMstProtected(ni))
|
if (NInoMstProtected(ni))
|
||||||
vi->i_mapping->a_ops = &ntfs_mst_aops;
|
vi->i_mapping->a_ops = &ntfs_mst_aops;
|
||||||
else
|
else if (NInoCompressed(ni))
|
||||||
vi->i_mapping->a_ops = &ntfs_aops;
|
vi->i_mapping->a_ops = &ntfs_compressed_aops;
|
||||||
if ((NInoCompressed(ni) || NInoSparse(ni)) && ni->type != AT_INDEX_ROOT)
|
if ((NInoCompressed(ni) || NInoSparse(ni)) && ni->type != AT_INDEX_ROOT)
|
||||||
vi->i_blocks = ni->itype.compressed.size >> 9;
|
vi->i_blocks = ni->itype.compressed.size >> 9;
|
||||||
else
|
else
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* ntfs.h - Defines for NTFS Linux kernel driver. Part of the Linux-NTFS
|
* ntfs.h - Defines for NTFS Linux kernel driver.
|
||||||
* project.
|
|
||||||
*
|
*
|
||||||
* Copyright (c) 2001-2005 Anton Altaparmakov
|
* Copyright (c) 2001-2014 Anton Altaparmakov and Tuxera Inc.
|
||||||
* Copyright (C) 2002 Richard Russon
|
* Copyright (C) 2002 Richard Russon
|
||||||
*
|
*
|
||||||
* This program/include file is free software; you can redistribute it and/or
|
* This program/include file is free software; you can redistribute it and/or
|
||||||
|
@ -57,7 +56,8 @@ extern struct kmem_cache *ntfs_attr_ctx_cache;
|
||||||
extern struct kmem_cache *ntfs_index_ctx_cache;
|
extern struct kmem_cache *ntfs_index_ctx_cache;
|
||||||
|
|
||||||
/* The various operations structs defined throughout the driver files. */
|
/* The various operations structs defined throughout the driver files. */
|
||||||
extern const struct address_space_operations ntfs_aops;
|
extern const struct address_space_operations ntfs_normal_aops;
|
||||||
|
extern const struct address_space_operations ntfs_compressed_aops;
|
||||||
extern const struct address_space_operations ntfs_mst_aops;
|
extern const struct address_space_operations ntfs_mst_aops;
|
||||||
|
|
||||||
extern const struct file_operations ntfs_file_ops;
|
extern const struct file_operations ntfs_file_ops;
|
||||||
|
|
Loading…
Add table
Reference in a new issue