]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
dax: don't abuse get_block mapping for endio callbacks
authorDave Chinner <dchinner@redhat.com>
Wed, 3 Jun 2015 23:18:18 +0000 (09:18 +1000)
committerDan Duval <dan.duval@oracle.com>
Wed, 12 Oct 2016 13:46:17 +0000 (09:46 -0400)
Orabug: 22913653

dax_fault() currently relies on the get_block callback to attach an
io completion callback to the mapping buffer head so that it can
run unwritten extent conversion after zeroing allocated blocks.

Instead of this hack, pass the conversion callback directly into
dax_fault() similar to the get_block callback. When the filesystem
allocates unwritten extents, it will set the buffer_unwritten()
flag, and hence the dax_fault code can call the completion function
in the contexts where it is necessary without overloading the
mapping buffer head.

Note: The changes to ext4 to use this interface are suspect at best.
In fact, the way ext4 did this end_io assignment in the first place
looks suspect because it only set a completion callback when there
wasn't already some other write() call taking place on the same
inode. The ext4 end_io code looks rather intricate and fragile with
all it's reference counting and passing to different contexts for
modification via inode private pointers that aren't protected by
locks...

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Acked-by: Jan Kara <jack@suse.cz>
Signed-off-by: Dave Chinner <david@fromorbit.com>
Signed-off-by: Dan Duval <dan.duval@oracle.com>
(cherry picked from commit e842f2903908934187af7232fb5b21da527d1757)

Conflict:

fs/ext4/inode.c

fs/ext4/inode.c

index ab9dfc8eb54ea59204b20ce972f91a78bfdf1ef4..d79d85ae1aa689e67e27628730dc606d19cdf4cf 100644 (file)
@@ -720,7 +720,7 @@ static int _ext4_get_block(struct inode *inode, sector_t iblock,
                ext4_io_end_t *io_end = ext4_inode_aio(inode);
 
                map_bh(bh, inode->i_sb, map.m_pblk);
-               ext4_update_bh_state(bh, map.m_flags);
+               bh->b_state = (bh->b_state & ~EXT4_MAP_FLAGS) | map.m_flags;
                if (IS_DAX(inode) && buffer_unwritten(bh)) {
                        /*
                         * dgc: I suspect unwritten conversion on ext4+DAX is