Commit f40661be authored by Anton Altaparmakov's avatar Anton Altaparmakov

NTFS: Optimise/reorganise some error handling code in fs/ntfs/aops.c.

Signed-off-by: default avatarAnton Altaparmakov <aia21@cantab.net>
parent 946929d8
...@@ -1392,14 +1392,11 @@ static int ntfs_writepage(struct page *page, struct writeback_control *wbc) ...@@ -1392,14 +1392,11 @@ static int ntfs_writepage(struct page *page, struct writeback_control *wbc)
attr_len = le32_to_cpu(ctx->attr->data.resident.value_length); attr_len = le32_to_cpu(ctx->attr->data.resident.value_length);
i_size = i_size_read(vi); i_size = i_size_read(vi);
kaddr = kmap_atomic(page, KM_USER0);
if (unlikely(attr_len > i_size)) { if (unlikely(attr_len > i_size)) {
/* Zero out of bounds area in the mft record. */
memset((u8*)ctx->attr + le16_to_cpu(
ctx->attr->data.resident.value_offset) +
i_size, 0, attr_len - i_size);
attr_len = i_size; attr_len = i_size;
ctx->attr->data.resident.value_length = cpu_to_le32(attr_len);
} }
kaddr = kmap_atomic(page, KM_USER0);
/* Copy the data from the page to the mft record. */ /* Copy the data from the page to the mft record. */
memcpy((u8*)ctx->attr + memcpy((u8*)ctx->attr +
le16_to_cpu(ctx->attr->data.resident.value_offset), le16_to_cpu(ctx->attr->data.resident.value_offset),
...@@ -1831,7 +1828,7 @@ static int ntfs_prepare_write(struct file *file, struct page *page, ...@@ -1831,7 +1828,7 @@ static int ntfs_prepare_write(struct file *file, struct page *page,
unsigned from, unsigned to) unsigned from, unsigned to)
{ {
s64 new_size; s64 new_size;
unsigned long flags; loff_t i_size;
struct inode *vi = page->mapping->host; struct inode *vi = page->mapping->host;
ntfs_inode *base_ni = NULL, *ni = NTFS_I(vi); ntfs_inode *base_ni = NULL, *ni = NTFS_I(vi);
ntfs_volume *vol = ni->vol; ntfs_volume *vol = ni->vol;
...@@ -1934,13 +1931,11 @@ static int ntfs_prepare_write(struct file *file, struct page *page, ...@@ -1934,13 +1931,11 @@ static int ntfs_prepare_write(struct file *file, struct page *page,
/* The total length of the attribute value. */ /* The total length of the attribute value. */
attr_len = le32_to_cpu(a->data.resident.value_length); attr_len = le32_to_cpu(a->data.resident.value_length);
/* Fix an eventual previous failure of ntfs_commit_write(). */ /* Fix an eventual previous failure of ntfs_commit_write(). */
read_lock_irqsave(&ni->size_lock, flags); i_size = i_size_read(vi);
if (unlikely(ni->initialized_size < attr_len)) { if (unlikely(attr_len > i_size)) {
attr_len = ni->initialized_size; attr_len = i_size;
a->data.resident.value_length = cpu_to_le32(attr_len); a->data.resident.value_length = cpu_to_le32(attr_len);
BUG_ON(attr_len < i_size_read(vi));
} }
read_unlock_irqrestore(&ni->size_lock, flags);
/* If we do not need to resize the attribute allocation we are done. */ /* If we do not need to resize the attribute allocation we are done. */
if (new_size <= attr_len) if (new_size <= attr_len)
goto done_unm; goto done_unm;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment