]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - fs/ext2/inode.c
Merge tag 'libnvdimm-for-4.12' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdim...
[karo-tx-linux.git] / fs / ext2 / inode.c
index 128cce5406455716172a88a50cbeddd6edf046f2..26d77f9f8c12e69f48bc6cc1c4f47bb6fab27ebd 100644 (file)
@@ -799,6 +799,7 @@ int ext2_get_block(struct inode *inode, sector_t iblock,
 static int ext2_iomap_begin(struct inode *inode, loff_t offset, loff_t length,
                unsigned flags, struct iomap *iomap)
 {
+       struct block_device *bdev;
        unsigned int blkbits = inode->i_blkbits;
        unsigned long first_block = offset >> blkbits;
        unsigned long max_blocks = (length + (1 << blkbits) - 1) >> blkbits;
@@ -812,8 +813,13 @@ static int ext2_iomap_begin(struct inode *inode, loff_t offset, loff_t length,
                return ret;
 
        iomap->flags = 0;
-       iomap->bdev = inode->i_sb->s_bdev;
+       bdev = inode->i_sb->s_bdev;
+       iomap->bdev = bdev;
        iomap->offset = (u64)first_block << blkbits;
+       if (blk_queue_dax(bdev->bd_queue))
+               iomap->dax_dev = dax_get_by_host(bdev->bd_disk->disk_name);
+       else
+               iomap->dax_dev = NULL;
 
        if (ret == 0) {
                iomap->type = IOMAP_HOLE;
@@ -835,6 +841,7 @@ static int
 ext2_iomap_end(struct inode *inode, loff_t offset, loff_t length,
                ssize_t written, unsigned flags, struct iomap *iomap)
 {
+       put_dax(iomap->dax_dev);
        if (iomap->type == IOMAP_MAPPED &&
            written < length &&
            (flags & IOMAP_WRITE))
@@ -1384,25 +1391,6 @@ void ext2_set_inode_flags(struct inode *inode)
                inode->i_flags |= S_DAX;
 }
 
-/* Propagate flags from i_flags to EXT2_I(inode)->i_flags */
-void ext2_get_inode_flags(struct ext2_inode_info *ei)
-{
-       unsigned int flags = ei->vfs_inode.i_flags;
-
-       ei->i_flags &= ~(EXT2_SYNC_FL|EXT2_APPEND_FL|
-                       EXT2_IMMUTABLE_FL|EXT2_NOATIME_FL|EXT2_DIRSYNC_FL);
-       if (flags & S_SYNC)
-               ei->i_flags |= EXT2_SYNC_FL;
-       if (flags & S_APPEND)
-               ei->i_flags |= EXT2_APPEND_FL;
-       if (flags & S_IMMUTABLE)
-               ei->i_flags |= EXT2_IMMUTABLE_FL;
-       if (flags & S_NOATIME)
-               ei->i_flags |= EXT2_NOATIME_FL;
-       if (flags & S_DIRSYNC)
-               ei->i_flags |= EXT2_DIRSYNC_FL;
-}
-
 struct inode *ext2_iget (struct super_block *sb, unsigned long ino)
 {
        struct ext2_inode_info *ei;
@@ -1563,7 +1551,6 @@ static int __ext2_write_inode(struct inode *inode, int do_sync)
        if (ei->i_state & EXT2_STATE_NEW)
                memset(raw_inode, 0, EXT2_SB(sb)->s_inode_size);
 
-       ext2_get_inode_flags(ei);
        raw_inode->i_mode = cpu_to_le16(inode->i_mode);
        if (!(test_opt(sb, NO_UID32))) {
                raw_inode->i_uid_low = cpu_to_le16(low_16_bits(uid));
@@ -1615,7 +1602,7 @@ static int __ext2_write_inode(struct inode *inode, int do_sync)
                                EXT2_SET_RO_COMPAT_FEATURE(sb,
                                        EXT2_FEATURE_RO_COMPAT_LARGE_FILE);
                                spin_unlock(&EXT2_SB(sb)->s_lock);
-                               ext2_write_super(sb);
+                               ext2_sync_super(sb, EXT2_SB(sb)->s_es, 1);
                        }
                }
        }