btrfs: remove btrfs_inode::dio_sem
authorGoldwyn Rodrigues <rgoldwyn@suse.com>
Thu, 24 Sep 2020 16:39:19 +0000 (11:39 -0500)
committerDavid Sterba <dsterba@suse.com>
Tue, 8 Dec 2020 14:53:48 +0000 (15:53 +0100)
The inode dio_sem can be eliminated because all DIO synchronization is
now performed through inode->i_rwsem that provides the same guarantees.

This reduces btrfs_inode size by 40 bytes.

Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/btrfs_inode.h
fs/btrfs/file.c
fs/btrfs/inode.c

index 92dd86bceae310197f66f13cc790c4bc17c5e480..16c50a438f70c4df03a50fea89e3796cd4a91382 100644 (file)
@@ -203,16 +203,6 @@ struct btrfs_inode {
        /* Hook into fs_info->delayed_iputs */
        struct list_head delayed_iput;
 
-       /*
-        * To avoid races between lockless (i_mutex not held) direct IO writes
-        * and concurrent fsync requests. Direct IO writes must acquire read
-        * access on this semaphore for creating an extent map and its
-        * corresponding ordered extent. The fast fsync path must acquire write
-        * access on this semaphore before it collects ordered extents and
-        * extent maps.
-        */
-       struct rw_semaphore dio_sem;
-
        struct inode vfs_inode;
 };
 
index dc54b2b38d145de23cc4c9caded7c93dff02578c..93191ea5d1fd0c4952bda6a2231d2808daa227f0 100644 (file)
@@ -1948,8 +1948,6 @@ relock:
                goto buffered;
        }
 
-       down_read(&BTRFS_I(inode)->dio_sem);
-
        /*
         * This is actually a sync iocb, so we need our fancy endio to know if
         * we need to sync.
@@ -1964,7 +1962,6 @@ relock:
        if (written == -ENOTBLK)
                written = 0;
 
-       up_read(&BTRFS_I(inode)->dio_sem);
        btrfs_inode_unlock(inode, ilock_flags);
 
        if (written < 0 || !iov_iter_count(from)) {
@@ -2172,13 +2169,6 @@ int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
 
        inode_lock(inode);
 
-       /*
-        * We take the dio_sem here because the tree log stuff can race with
-        * lockless dio writes and get an extent map logged for an extent we
-        * never waited on.  We need it this high up for lockdep reasons.
-        */
-       down_write(&BTRFS_I(inode)->dio_sem);
-
        atomic_inc(&root->log_batch);
 
        /*
@@ -2209,7 +2199,6 @@ int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
         */
        ret = start_ordered_ops(inode, start, end);
        if (ret) {
-               up_write(&BTRFS_I(inode)->dio_sem);
                inode_unlock(inode);
                goto out;
        }
@@ -2306,7 +2295,6 @@ int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
         * file again, but that will end up using the synchronization
         * inside btrfs_sync_log to keep things safe.
         */
-       up_write(&BTRFS_I(inode)->dio_sem);
        inode_unlock(inode);
 
        if (ret != BTRFS_NO_LOG_SYNC) {
@@ -2337,7 +2325,6 @@ out:
 
 out_release_extents:
        btrfs_release_log_ctx_extents(&ctx);
-       up_write(&BTRFS_I(inode)->dio_sem);
        inode_unlock(inode);
        goto out;
 }
index 3eea0d0be8a0d4c6c6739877c8f2ef800a7d160e..c4e00027f0f836966e664a2f1497fa0c2a8ce11a 100644 (file)
@@ -8650,7 +8650,6 @@ struct inode *btrfs_alloc_inode(struct super_block *sb)
        INIT_LIST_HEAD(&ei->delalloc_inodes);
        INIT_LIST_HEAD(&ei->delayed_iput);
        RB_CLEAR_NODE(&ei->rb_node);
-       init_rwsem(&ei->dio_sem);
 
        return inode;
 }