]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - fs/gfs2/aops.c
GFS2: dirty inode correctly in gfs2_write_end
[karo-tx-linux.git] / fs / gfs2 / aops.c
index ee48ad37d9c0109dfd81bcca983c13a29492f0cb..1f7d8057ea68d1c7214d3db0a6446aa248888eea 100644 (file)
@@ -122,14 +122,13 @@ out:
 }
 
 /**
- * gfs2_writeback_writepage - Write page for writeback mappings
+ * gfs2_writepage - Write page for writeback mappings
  * @page: The page
  * @wbc: The writeback control
  *
  */
 
-static int gfs2_writeback_writepage(struct page *page,
-                                   struct writeback_control *wbc)
+static int gfs2_writepage(struct page *page, struct writeback_control *wbc)
 {
        int ret;
 
@@ -140,32 +139,6 @@ static int gfs2_writeback_writepage(struct page *page,
        return nobh_writepage(page, gfs2_get_block_noalloc, wbc);
 }
 
-/**
- * gfs2_ordered_writepage - Write page for ordered data files
- * @page: The page to write
- * @wbc: The writeback control
- *
- */
-
-static int gfs2_ordered_writepage(struct page *page,
-                                 struct writeback_control *wbc)
-{
-       struct inode *inode = page->mapping->host;
-       struct gfs2_inode *ip = GFS2_I(inode);
-       int ret;
-
-       ret = gfs2_writepage_common(page, wbc);
-       if (ret <= 0)
-               return ret;
-
-       if (!page_has_buffers(page)) {
-               create_empty_buffers(page, inode->i_sb->s_blocksize,
-                                    (1 << BH_Dirty)|(1 << BH_Uptodate));
-       }
-       gfs2_page_add_databufs(ip, page, 0, inode->i_sb->s_blocksize-1);
-       return block_write_full_page(page, gfs2_get_block_noalloc, wbc);
-}
-
 /**
  * __gfs2_jdata_writepage - The core of jdata writepage
  * @page: The page to write
@@ -842,6 +815,8 @@ static int gfs2_write_end(struct file *file, struct address_space *mapping,
        unsigned int from = pos & (PAGE_CACHE_SIZE - 1);
        unsigned int to = from + len;
        int ret;
+       struct gfs2_trans *tr = current->journal_info;
+       BUG_ON(!tr);
 
        BUG_ON(gfs2_glock_is_locked_by_me(ip->i_gl) == NULL);
 
@@ -852,8 +827,6 @@ static int gfs2_write_end(struct file *file, struct address_space *mapping,
                goto failed;
        }
 
-       gfs2_trans_add_meta(ip->i_gl, dibh);
-
        if (gfs2_is_stuffed(ip))
                return gfs2_stuffed_write_end(inode, dibh, pos, len, copied, page);
 
@@ -861,6 +834,11 @@ static int gfs2_write_end(struct file *file, struct address_space *mapping,
                gfs2_page_add_databufs(ip, page, from, to);
 
        ret = generic_write_end(file, mapping, pos, len, copied, page, fsdata);
+       if (tr->tr_num_buf_new)
+               __mark_inode_dirty(inode, I_DIRTY_DATASYNC);
+       else
+               gfs2_trans_add_meta(ip->i_gl, dibh);
+
 
        if (inode == sdp->sd_rindex) {
                adjust_fs_space(inode);
@@ -1107,7 +1085,7 @@ cannot_release:
 }
 
 static const struct address_space_operations gfs2_writeback_aops = {
-       .writepage = gfs2_writeback_writepage,
+       .writepage = gfs2_writepage,
        .writepages = gfs2_writepages,
        .readpage = gfs2_readpage,
        .readpages = gfs2_readpages,
@@ -1123,7 +1101,7 @@ static const struct address_space_operations gfs2_writeback_aops = {
 };
 
 static const struct address_space_operations gfs2_ordered_aops = {
-       .writepage = gfs2_ordered_writepage,
+       .writepage = gfs2_writepage,
        .writepages = gfs2_writepages,
        .readpage = gfs2_readpage,
        .readpages = gfs2_readpages,