diff options
author | Anton Altaparmakov <aia21@cantab.net> | 2005-09-08 23:04:20 +0200 |
---|---|---|
committer | Anton Altaparmakov <aia21@cantab.net> | 2005-09-08 23:04:20 +0200 |
commit | 311120eca0013083f5eb0aff13ffb8aa9fdd050c (patch) | |
tree | f93f77b4fc129b45d7b72c180e9e30a592959d4e /fs/ntfs/aops.c | |
parent | NTFS: Fix fs/ntfs/aops.c::ntfs_{read,write}_block() to handle the case (diff) | |
download | linux-311120eca0013083f5eb0aff13ffb8aa9fdd050c.tar.xz linux-311120eca0013083f5eb0aff13ffb8aa9fdd050c.zip |
NTFS: Fixup handling of sparse, compressed, and encrypted attributes in
fs/ntfs/aops.c::ntfs_readpage().
Signed-off-by: Anton Altaparmakov <aia21@cantab.net>
Diffstat (limited to 'fs/ntfs/aops.c')
-rw-r--r-- | fs/ntfs/aops.c | 41 |
1 files changed, 24 insertions, 17 deletions
diff --git a/fs/ntfs/aops.c b/fs/ntfs/aops.c index 59389a8801bc..2482b677a82a 100644 --- a/fs/ntfs/aops.c +++ b/fs/ntfs/aops.c @@ -379,31 +379,38 @@ retry_readpage: return 0; } ni = NTFS_I(page->mapping->host); - + /* + * Only $DATA attributes can be encrypted and only unnamed $DATA + * attributes can be compressed. Index root can have the flags set but + * this means to create compressed/encrypted files, not that the + * attribute is compressed/encrypted. + */ + if (ni->type != AT_INDEX_ROOT) { + /* If attribute is encrypted, deny access, just like NT4. */ + if (NInoEncrypted(ni)) { + BUG_ON(ni->type != AT_DATA); + err = -EACCES; + goto err_out; + } + /* Compressed data streams are handled in compress.c. */ + if (NInoNonResident(ni) && NInoCompressed(ni)) { + BUG_ON(ni->type != AT_DATA); + BUG_ON(ni->name_len); + return ntfs_read_compressed_block(page); + } + } /* NInoNonResident() == NInoIndexAllocPresent() */ if (NInoNonResident(ni)) { - /* - * Only unnamed $DATA attributes can be compressed or - * encrypted. - */ - if (ni->type == AT_DATA && !ni->name_len) { - /* If file is encrypted, deny access, just like NT4. */ - if (NInoEncrypted(ni)) { - err = -EACCES; - goto err_out; - } - /* Compressed data streams are handled in compress.c. */ - if (NInoCompressed(ni)) - return ntfs_read_compressed_block(page); - } - /* Normal data stream. */ + /* Normal, non-resident data stream. */ return ntfs_read_block(page); } /* * Attribute is resident, implying it is not compressed or encrypted. * This also means the attribute is smaller than an mft record and * hence smaller than a page, so can simply zero out any pages with - * index above 0. + * index above 0. Note the attribute can actually be marked compressed + * but if it is resident the actual data is not compressed so we are + * ok to ignore the compressed flag here. */ if (unlikely(page->index > 0)) { kaddr = kmap_atomic(page, KM_USER0); |