Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 913e027c authored by Dmitry Monakhov's avatar Dmitry Monakhov Committed by Linus Torvalds
Browse files

fsioctl.c: make generic_block_fiemap() signal-tolerant



__generic_block_fiemap may spin very long time for large sparse files.

Without this patch an unprivileged user may abuse system resources simply
by spawning a vast number of unkilable busyloops (works on ext2/ext3):

  truncate --size 1T test
  for ((i=0;i<1024;i++))
  do
         filefrag test > /dev/null &
  done

Signed-off-by: default avatarDmitry Monakhov <dmonakhov@openvz.org>
Cc: Theodore Ts'o <tytso@mit.edu>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Michael Kerrisk <mtk.manpages@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 99b8874e
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -196,7 +196,8 @@ struct fiemap_extent_info {
};

It is intended that the file system should not need to access any of this
structure directly.
structure directly. Filesystem handlers should be tolerant to signals and return
EINTR once fatal signal received.


Flag checking should be done at the beginning of the ->fiemap callback via the
+5 −0
Original line number Diff line number Diff line
@@ -379,6 +379,11 @@ int __generic_block_fiemap(struct inode *inode,
				past_eof = true;
		}
		cond_resched();
		if (fatal_signal_pending(current)) {
			ret = -EINTR;
			break;
		}

	} while (1);

	/* If ret is 1 then we just hit the end of the extent array */