Patch "orangefs: fix deadlock; do not write i_size in read_iter" has been added to the 4.9-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
orangefs: fix deadlock; do not write i_size in read_iter
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
orangefs-fix-deadlock-do-not-write-i_size-in-read_iter.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
6793f1c450b1533a5e9c2493490de771d38b24f9Mon Sep 17 00:00:00 2001
From: Martin Brandenburg <[email protected]>
Date: Thu, 25 Jan 2018 19:39:44 -0500
Subject: orangefs: fix deadlock; do not write i_size in read_iter
From: Martin Brandenburg <[email protected]>
commit 6793f1c450b1533a5e9c2493490de771d38b24f9 upstream.
After do_readv_writev, the inode cache is invalidated anyway, so i_size will never be read. It will be fetched from the server which will also know about updates from other machines.
Fixes deadlock on 32-bit SMP.
See https://marc.info/?l=linux-fsdevel&m=151268557427760&w=2
--- fs/orangefs/file.c | 7 ++----- fs/orangefs/orangefs-kernel.h | 11 ----------- 2 files changed, 2 insertions(+), 16 deletions(-)
fs/orangefs/file.c +2 -5
@@ -446,7 +446,7 @@ ssize_t orangefs_inode_read(struct inodestatic ssize_t orangefs_file_read_iter (struct kiocb *iocb,struct iov_iter *iter) {struct file *file = iocb->ki_filp; -loff_t pos = *(&iocb->ki_pos); +loff_t pos = iocb->ki_pos;ssize_t rc =0 ;BUG_ON (iocb->private);
@@ -485,9 +485,6 @@ static ssize_t orangefs_file_write_iter( } } -if (file->f_pos >i_size_read (file->f_mapping->host)) -orangefs_i_size_write (file->f_mapping->host, file->f_pos); - rc =generic_write_checks (iocb, iter);if (rc <=0 ) {
@@ -501,7 +498,7 @@ static ssize_t orangefs_file_write_iter(* pos to the end of the file, so we will wait till now to set * pos... */ - pos = *(&iocb->ki_pos); + pos = iocb->ki_pos; rc = do_readv_writev(ORANGEFS_IO_WRITE, file,
fs/orangefs/orangefs-kernel.h +0 -11
@@ -570,17 +570,6 @@ do { \ sys_attr.mask =ORANGEFS_ATTR_SYS_ALL_SETABLE ; \ }while (0 ) -static inline void orangefs_i_size_write(struct inode *inode, loff_t i_size) -{ -#if BITS_PER_LONG ==32 && defined(CONFIG_SMP ) -inode_lock (inode); -#endif -i_size_write (inode, i_size); -#if BITS_PER_LONG ==32 && defined(CONFIG_SMP ) -inode_unlock (inode); -#endif -} - static inline void orangefs_set_timeout(struct dentry *dentry) {unsigned long time = jiffies + orangefs_dcache_timeout_msecs*HZ /1000 ;
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/orangefs-fix-deadlock-do-not-write-i_size-in-read_iter.patch queue-4.9/orangefs-initialize-op-on-loop-restart-in-orangefs_devreq_read.patch queue-4.9/orangefs-use-list_for_each_entry_safe-in-purge_waiting_ops.patch