lkml.org 
[lkml]   [2005]   [Sep]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 22/25] NTFS: Fixup handling of sparse, compressed, and encrypted attributes in
    [PATCH 22/25] NTFS: Fixup handling of sparse, compressed, and encrypted attributes in
    fs/ntfs/aops.c::ntfs_readpage().

    Signed-off-by: Anton Altaparmakov <aia21@cantab.net>

    ---

    fs/ntfs/ChangeLog | 5 ++---
    fs/ntfs/aops.c | 41 ++++++++++++++++++++++++-----------------
    2 files changed, 26 insertions(+), 20 deletions(-)

    311120eca0013083f5eb0aff13ffb8aa9fdd050c
    diff --git a/fs/ntfs/ChangeLog b/fs/ntfs/ChangeLog
    --- a/fs/ntfs/ChangeLog
    +++ b/fs/ntfs/ChangeLog
    @@ -76,11 +76,10 @@ ToDo/Notes:
    - Truncate {a,c,m}time to the ntfs supported time granularity when
    updating the times in the inode in ntfs_setattr().
    - 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(),
    + fs/ntfs/aops.c::ntfs_{read,write}page().
    - Make ntfs_write_block() not instantiate sparse blocks if they contain
    only zeroes.
    - - Fixup handling of sparse, compressed, and encrypted attributes in
    - fs/ntfs/aops.c::ntfs_writepage().
    - Optimize fs/ntfs/aops.c::ntfs_write_block() by extending the page
    lock protection over the buffer submission for i/o which allows the
    removal of the get_bh()/put_bh() pairs for each buffer.
    diff --git a/fs/ntfs/aops.c b/fs/ntfs/aops.c
    --- 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);
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-09-09 11:33    [W:0.046 / U:1.412 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site