]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blobdiff - fs/ext4/inode.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf-next
[mirror_ubuntu-jammy-kernel.git] / fs / ext4 / inode.c
index b32a57bc5d5d602ffcb8536ef28ae2684317ed7d..c7f77c643008558938ed0cf5d23698863d1ca931 100644 (file)
@@ -399,6 +399,10 @@ static int __check_block_validity(struct inode *inode, const char *func,
                                unsigned int line,
                                struct ext4_map_blocks *map)
 {
+       if (ext4_has_feature_journal(inode->i_sb) &&
+           (inode->i_ino ==
+            le32_to_cpu(EXT4_SB(inode->i_sb)->s_es->s_journal_inum)))
+               return 0;
        if (!ext4_data_block_valid(EXT4_SB(inode->i_sb), map->m_pblk,
                                   map->m_len)) {
                ext4_error_inode(inode, func, line, map->m_pblk,
@@ -541,7 +545,7 @@ int ext4_map_blocks(handle_t *handle, struct inode *inode,
                        map->m_len = retval;
                        retval = 0;
                } else {
-                       BUG_ON(1);
+                       BUG();
                }
 #ifdef ES_AGGRESSIVE_TEST
                ext4_map_blocks_es_recheck(handle, inode, map,
@@ -1876,7 +1880,7 @@ static int ext4_da_map_blocks(struct inode *inode, sector_t iblock,
                else if (ext4_es_is_unwritten(&es))
                        map->m_flags |= EXT4_MAP_UNWRITTEN;
                else
-                       BUG_ON(1);
+                       BUG();
 
 #ifdef ES_AGGRESSIVE_TEST
                ext4_map_blocks_es_recheck(NULL, inode, map, &orig_map, 0);
@@ -4738,9 +4742,11 @@ void ext4_set_inode_flags(struct inode *inode)
                new_fl |= S_DAX;
        if (flags & EXT4_ENCRYPT_FL)
                new_fl |= S_ENCRYPTED;
+       if (flags & EXT4_CASEFOLD_FL)
+               new_fl |= S_CASEFOLD;
        inode_set_flags(inode, new_fl,
                        S_SYNC|S_APPEND|S_IMMUTABLE|S_NOATIME|S_DIRSYNC|S_DAX|
-                       S_ENCRYPTED);
+                       S_ENCRYPTED|S_CASEFOLD);
 }
 
 static blkcnt_t ext4_inode_blocks(struct ext4_inode *raw_inode,
@@ -5619,25 +5625,22 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr)
                        up_write(&EXT4_I(inode)->i_data_sem);
                        ext4_journal_stop(handle);
                        if (error) {
-                               if (orphan)
+                               if (orphan && inode->i_nlink)
                                        ext4_orphan_del(NULL, inode);
                                goto err_out;
                        }
                }
-               if (!shrink)
+               if (!shrink) {
                        pagecache_isize_extended(inode, oldsize, inode->i_size);
-
-               /*
-                * Blocks are going to be removed from the inode. Wait
-                * for dio in flight.  Temporarily disable
-                * dioread_nolock to prevent livelock.
-                */
-               if (orphan) {
-                       if (!ext4_should_journal_data(inode)) {
-                               inode_dio_wait(inode);
-                       } else
-                               ext4_wait_for_tail_page_commit(inode);
+               } else {
+                       /*
+                        * Blocks are going to be removed from the inode. Wait
+                        * for dio in flight.
+                        */
+                       inode_dio_wait(inode);
                }
+               if (orphan && ext4_should_journal_data(inode))
+                       ext4_wait_for_tail_page_commit(inode);
                down_write(&EXT4_I(inode)->i_mmap_sem);
 
                rc = ext4_break_layouts(inode);