diff --git a/fs/jfs/file.c b/fs/jfs/file.c index 01b6912e60f8..8535bd15395c 100644 --- a/fs/jfs/file.c +++ b/fs/jfs/file.c @@ -18,26 +18,18 @@ int jfs_fsync(struct file *file, loff_t start, loff_t end, int datasync) { - struct inode *inode = file->f_mapping->host; - int rc = 0; + struct inode *inode = file->f_mapping->host; - rc = file_write_and_wait_range(file, start, end); - if (rc) - return rc; - - inode_lock(inode); - if (!(inode->i_state & I_DIRTY_ALL) || - (datasync && !(inode->i_state & I_DIRTY_DATASYNC))) { - /* Make sure committed changes hit the disk */ - jfs_flush_journal(JFS_SBI(inode->i_sb)->log, 1); - inode_unlock(inode); - return rc; - } + if (in_softirq() || in_atomic()) { + pr_warn("jfs_fsync() called in softirq/atomic context, skipping execution.\n"); + return -EWOULDBLOCK; // Defer execution to user-space or retry later + } - rc |= jfs_commit_inode(inode, 1); - inode_unlock(inode); + inode_lock(inode); + generic_file_fsync(inode); + inode_unlock(inode); - return rc ? -EIO : 0; + return 0; } static int jfs_open(struct inode *inode, struct file *file)