All of lore.kernel.org
 help / color / mirror / Atom feed
From: Theodore Ts'o <tytso@mit.edu>
To: torvalds@linux-foundation.org
Cc: linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org
Subject: [GIT PULL] ext4 updates for 4.7
Date: Tue, 24 May 2016 12:29:24 -0400	[thread overview]
Message-ID: <20160524162924.GA23194@thunk.org> (raw)

Note: there are some merge conflicts in the Direct I/O handling code.
The resolution of them is in linux-next, as well as here:

   http://git.kernel.org/cgit/linux/kernel/git/tytso/ext4.git/commit/?h=trial-merge

Also see below for the output of "git show trial-merge".  (I couldn't
figure out a way to generate this from the git web interface --- is
there a way?)

					- Ted


The following changes since commit c3b46c73264b03000d1e18b22f5caf63332547c9:

  Linux 4.6-rc4 (2016-04-17 19:13:32 -0700)

are available in the git repository at:

  git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4.git tags/ext4_for_linus

for you to fetch changes up to 12735f881952c32b31bc4e433768f18489f79ec9:

  ext4: pre-zero allocated blocks for DAX IO (2016-05-13 00:51:15 -0400)

----------------------------------------------------------------
Fix a number of bugs, most notably a potential stale data exposure
after a crash and a potential BUG_ON crash if a file has the data
journalling flag enabled while it has dirty delayed allocation blocks
that haven't been written yet.  Also fix a potential crash in the new
project quota code and a maliciously corrupted file system.

In addition, fix some DAX-specific bugs, including when there is a
transient ENOSPC situation and races between writes via direct I/O and
an mmap'ed segment that could lead to lost I/O.

Finally the usual set of miscellaneous cleanups.

----------------------------------------------------------------
Daeho Jeong (2):
      ext4: handle unwritten or delalloc buffers before enabling data journaling
      ext4: fix races between changing inode journal mode and ext4_writepages

Jakub Wilk (1):
      ext4: remove trailing \n from ext4_warning/ext4_error calls

Jan Kara (10):
      ext4: fix data exposure after a crash
      ext4: remove EXT4_STATE_ORDERED_MODE
      jbd2: add support for avoiding data writes during transaction commits
      ext4: do not ask jbd2 to write data for delalloc buffers
      ext4: fix oops on corrupted filesystem
      dax: call get_blocks() with create == 1 for write faults to unwritten extents
      ext4: handle transient ENOSPC properly for DAX
      ext4: fix race in transient ENOSPC detection
      ext4: refactor direct IO code
      ext4: pre-zero allocated blocks for DAX IO

Jens Axboe (1):
      ext4: remove unnecessary bio get/put

Luis de Bethencourt (1):
      jbd2: remove excess descriptions for handle_s

Nicolai Stange (3):
      ext4: address UBSAN warning in mb_find_order_for_block()
      ext4: silence UBSAN in ext4_mb_init()
      ext4: remove unmeetable inconsisteny check from ext4_find_extent()

Seth Forshee (1):
      ext4: fix check of dqget() return value in ext4_ioctl_setproject()

Theodore Ts'o (4):
      ext4: allow readdir()'s of large empty directories to be interrupted
      ext4: fix jbd2 handle extension in ext4_ext_truncate_extend_restart()
      ext4: fix hang when processing corrupted orphaned inode list
      ext4: clean up error handling when orphan list is corrupted

 fs/compat.c                   |   4 ++
 fs/dax.c                      |   2 +-
 fs/ext4/balloc.c              |   3 +-
 fs/ext4/dir.c                 |   5 ++
 fs/ext4/ext4.h                |  21 ++++--
 fs/ext4/ext4_jbd2.h           |  15 +++-
 fs/ext4/extents.c             |  20 +++---
 fs/ext4/extents_status.c      |   2 +-
 fs/ext4/file.c                |   6 +-
 fs/ext4/ialloc.c              |  59 ++++++++--------
 fs/ext4/indirect.c            | 127 ----------------------------------
 fs/ext4/inline.c              |   2 +-
 fs/ext4/inode.c               | 326 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------------
 fs/ext4/ioctl.c               |   2 +-
 fs/ext4/mballoc.c             |  12 ++--
 fs/ext4/mmp.c                 |   4 +-
 fs/ext4/move_extent.c         |   2 +-
 fs/ext4/namei.c               |   9 ++-
 fs/ext4/page-io.c             |   2 -
 fs/ext4/resize.c              |   2 +-
 fs/ext4/super.c               |   4 ++
 fs/jbd2/commit.c              |   4 ++
 fs/jbd2/journal.c             |   3 +-
 fs/jbd2/transaction.c         |  22 ++++--
 fs/ocfs2/journal.h            |   2 +-
 fs/readdir.c                  |   4 ++
 include/linux/jbd2.h          |  16 +++--
 kernel/locking/percpu-rwsem.c |   1 +
 28 files changed, 366 insertions(+), 315 deletions(-)

--------------

commit 49cb72c1e6373ef999ea92aecb5479c3bb1ab654
Merge: f6c658d 12735f8
Author: Theodore Ts'o <tytso@mit.edu>
Date:   Sun May 22 22:19:57 2016 -0400

    Merge branch 'dev' into test

diff --cc fs/ext4/inode.c
index 79b298d,f9ab1e8..f7140ca
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@@ -3334,12 -3327,13 +3327,13 @@@ static int ext4_end_io_dio(struct kioc
   * if the machine crashes during the write.
   *
   */
- static ssize_t ext4_ext_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
 -static ssize_t ext4_direct_IO_write(struct kiocb *iocb, struct iov_iter *iter,
 -				    loff_t offset)
++static ssize_t ext4_direct_IO_write(struct kiocb *iocb, struct iov_iter *iter)
  {
  	struct file *file = iocb->ki_filp;
  	struct inode *inode = file->f_mapping->host;
+ 	struct ext4_inode_info *ei = EXT4_I(inode);
  	ssize_t ret;
 +	loff_t offset = iocb->ki_pos;
  	size_t count = iov_iter_count(iter);
  	int overwrite = 0;
  	get_block_t *get_block_func = NULL;
@@@ -3399,12 -3423,12 +3423,12 @@@
  #ifdef CONFIG_EXT4_FS_ENCRYPTION
  	BUG_ON(ext4_encrypted_inode(inode) && S_ISREG(inode->i_mode));
  #endif
- 	if (IS_DAX(inode))
+ 	if (IS_DAX(inode)) {
 -		ret = dax_do_io(iocb, inode, iter, offset, get_block_func,
 +		ret = dax_do_io(iocb, inode, iter, get_block_func,
  				ext4_end_io_dio, dio_flags);
- 	else
+ 	} else
  		ret = __blockdev_direct_IO(iocb, inode,
 -					   inode->i_sb->s_bdev, iter, offset,
 +					   inode->i_sb->s_bdev, iter,
  					   get_block_func,
  					   ext4_end_io_dio, NULL, dio_flags);
  
@@@ -3428,6 -3451,82 +3451,81 @@@
  	if (overwrite)
  		inode_lock(inode);
  
+ 	if (ret < 0 && final_size > inode->i_size)
+ 		ext4_truncate_failed_write(inode);
+ 
+ 	/* Handle extending of i_size after direct IO write */
+ 	if (orphan) {
+ 		int err;
+ 
+ 		/* Credits for sb + inode write */
+ 		handle = ext4_journal_start(inode, EXT4_HT_INODE, 2);
+ 		if (IS_ERR(handle)) {
+ 			/* This is really bad luck. We've written the data
+ 			 * but cannot extend i_size. Bail out and pretend
+ 			 * the write failed... */
+ 			ret = PTR_ERR(handle);
+ 			if (inode->i_nlink)
+ 				ext4_orphan_del(NULL, inode);
+ 
+ 			goto out;
+ 		}
+ 		if (inode->i_nlink)
+ 			ext4_orphan_del(handle, inode);
+ 		if (ret > 0) {
+ 			loff_t end = offset + ret;
+ 			if (end > inode->i_size) {
+ 				ei->i_disksize = end;
+ 				i_size_write(inode, end);
+ 				/*
+ 				 * We're going to return a positive `ret'
+ 				 * here due to non-zero-length I/O, so there's
+ 				 * no way of reporting error returns from
+ 				 * ext4_mark_inode_dirty() to userspace.  So
+ 				 * ignore it.
+ 				 */
+ 				ext4_mark_inode_dirty(handle, inode);
+ 			}
+ 		}
+ 		err = ext4_journal_stop(handle);
+ 		if (ret == 0)
+ 			ret = err;
+ 	}
+ out:
+ 	return ret;
+ }
+ 
 -static ssize_t ext4_direct_IO_read(struct kiocb *iocb, struct iov_iter *iter,
 -				   loff_t offset)
++static ssize_t ext4_direct_IO_read(struct kiocb *iocb, struct iov_iter *iter)
+ {
+ 	int unlocked = 0;
+ 	struct inode *inode = iocb->ki_filp->f_mapping->host;
+ 	ssize_t ret;
+ 
+ 	if (ext4_should_dioread_nolock(inode)) {
+ 		/*
+ 		 * Nolock dioread optimization may be dynamically disabled
+ 		 * via ext4_inode_block_unlocked_dio(). Check inode's state
+ 		 * while holding extra i_dio_count ref.
+ 		 */
+ 		inode_dio_begin(inode);
+ 		smp_mb();
+ 		if (unlikely(ext4_test_inode_state(inode,
+ 						    EXT4_STATE_DIOREAD_LOCK)))
+ 			inode_dio_end(inode);
+ 		else
+ 			unlocked = 1;
+ 	}
+ 	if (IS_DAX(inode)) {
 -		ret = dax_do_io(iocb, inode, iter, offset, ext4_dio_get_block,
++		ret = dax_do_io(iocb, inode, iter, ext4_dio_get_block,
+ 				NULL, unlocked ? 0 : DIO_LOCKING);
+ 	} else {
+ 		ret = __blockdev_direct_IO(iocb, inode, inode->i_sb->s_bdev,
 -					   iter, offset, ext4_dio_get_block,
++					   iter, ext4_dio_get_block,
+ 					   NULL, NULL,
+ 					   unlocked ? 0 : DIO_LOCKING);
+ 	}
+ 	if (unlocked)
+ 		inode_dio_end(inode);
  	return ret;
  }
  
@@@ -3455,10 -3554,10 +3553,10 @@@ static ssize_t ext4_direct_IO(struct ki
  		return 0;
  
  	trace_ext4_direct_IO_enter(inode, offset, count, iov_iter_rw(iter));
- 	if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))
- 		ret = ext4_ext_direct_IO(iocb, iter);
+ 	if (iov_iter_rw(iter) == READ)
 -		ret = ext4_direct_IO_read(iocb, iter, offset);
++		ret = ext4_direct_IO_read(iocb, iter);
  	else
- 		ret = ext4_ind_direct_IO(iocb, iter);
 -		ret = ext4_direct_IO_write(iocb, iter, offset);
++		ret = ext4_direct_IO_write(iocb, iter);
  	trace_ext4_direct_IO_exit(inode, offset, count, iov_iter_rw(iter), ret);
  	return ret;
  }

                 reply	other threads:[~2016-05-24 16:29 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160524162924.GA23194@thunk.org \
    --to=tytso@mit.edu \
    --cc=linux-ext4@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=torvalds@linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.