Commit db14fecd authored by Anton Altaparmakov's avatar Anton Altaparmakov

NTFS: Update __ntfs_index_entry_mark_dirty() so it makes sure that the

      page has buffers.  Otherwise we could end up with a dirty page
      without buffers and our set_page_dirty() would not mark the buffers
      dirty when they are created and thus they would not be written out
      and the dirty records would be lost.
Signed-off-by: default avatarAnton Altaparmakov <aia21@cantab.net>
parent a97689d2
...@@ -478,13 +478,15 @@ int ntfs_index_lookup(const void *key, const int key_len, ...@@ -478,13 +478,15 @@ int ntfs_index_lookup(const void *key, const int key_len,
*/ */
void __ntfs_index_entry_mark_dirty(ntfs_index_context *ictx) void __ntfs_index_entry_mark_dirty(ntfs_index_context *ictx)
{ {
struct address_space *mapping;
struct page *page;
ntfs_inode *ni; ntfs_inode *ni;
struct page *page;
struct buffer_head *bh, *head;
unsigned int rec_start, rec_end, bh_size, bh_start, bh_end;
BUG_ON(ictx->is_in_root); BUG_ON(ictx->is_in_root);
ni = ictx->idx_ni; ni = ictx->idx_ni;
page = ictx->page; page = ictx->page;
BUG_ON(!page_has_buffers(page));
/* /*
* If the index block is the same size as the page cache page, set all * If the index block is the same size as the page cache page, set all
* the buffers in the page, as well as the page itself, dirty. * the buffers in the page, as well as the page itself, dirty.
...@@ -494,24 +496,17 @@ void __ntfs_index_entry_mark_dirty(ntfs_index_context *ictx) ...@@ -494,24 +496,17 @@ void __ntfs_index_entry_mark_dirty(ntfs_index_context *ictx)
return; return;
} }
/* Set only the buffers in which the index block is located dirty. */ /* Set only the buffers in which the index block is located dirty. */
mapping = page->mapping; rec_start = (unsigned int)((u8*)ictx->ia - (u8*)page_address(page));
if (page_has_buffers(page)) { rec_end = rec_start + ni->itype.index.block_size;
struct buffer_head *bh, *head; bh_size = ni->vol->sb->s_blocksize;
unsigned int bh_start, bh_end, rec_start, rec_end; bh_start = 0;
unsigned int bh_size = ni->vol->sb->s_blocksize; bh = head = page_buffers(page);
do {
bh = head = page_buffers(page); bh_end = bh_start + bh_size;
bh_start = 0; if ((bh_start >= rec_start) && (bh_end <= rec_end))
rec_start = (unsigned int)((u8*)ictx->ia - set_buffer_dirty(bh);
(u8*)page_address(page)); bh_start = bh_end;
rec_end = rec_start + ni->itype.index.block_size; } while ((bh = bh->b_this_page) != head);
do {
bh_end = bh_start + bh_size;
if ((bh_start >= rec_start) && (bh_end <= rec_end))
set_buffer_dirty(bh);
bh_start = bh_end;
} while ((bh = bh->b_this_page) != head);
}
/* Finally, set the page itself dirty, too. */ /* Finally, set the page itself dirty, too. */
__set_page_dirty_nobuffers(page); __set_page_dirty_nobuffers(page);
} }
......
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