]> Pileus Git - ~andy/linux/blobdiff - fs/gfs2/aops.c
GFS2: dirty inode correctly in gfs2_write_end
[~andy/linux] / fs / gfs2 / aops.c
index a9ea6f07774b6f835b1baedc9d5339d9bae566c2..1f7d8057ea68d1c7214d3db0a6446aa248888eea 100644 (file)
@@ -815,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);
 
@@ -825,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);
 
@@ -834,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);