From f36e5ee266e8a6273cfd580b45e44efef86468a1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Arkadiusz=20Mi=C5=9Bkiewicz?= Date: Tue, 6 May 2014 23:58:35 +0200 Subject: [PATCH] - fix systemd-readahead: Failed to read event: File too large --- kernel-small_fixes.patch | 42 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/kernel-small_fixes.patch b/kernel-small_fixes.patch index 740b2867..ab5a074b 100644 --- a/kernel-small_fixes.patch +++ b/kernel-small_fixes.patch @@ -177,3 +177,45 @@ To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ +From 1e2ee49f7f1b79f0b14884fe6a602f0411b39552 Mon Sep 17 00:00:00 2001 +From: Will Woods +Date: Tue, 6 May 2014 12:50:10 -0700 +Subject: fanotify: fix -EOVERFLOW with large files on 64-bit + +On 64-bit systems, O_LARGEFILE is automatically added to flags inside +the open() syscall (also openat(), blkdev_open(), etc). Userspace +therefore defines O_LARGEFILE to be 0 - you can use it, but it's a +no-op. Everything should be O_LARGEFILE by default. + +But: when fanotify does create_fd() it uses dentry_open(), which skips +all that. And userspace can't set O_LARGEFILE in fanotify_init() +because it's defined to 0. So if fanotify gets an event regarding a +large file, the read() will just fail with -EOVERFLOW. + +This patch adds O_LARGEFILE to fanotify_init()'s event_f_flags on 64-bit +systems, using the same test as open()/openat()/etc. + +Addresses https://bugzilla.redhat.com/show_bug.cgi?id=696821 + +Signed-off-by: Will Woods +Acked-by: Eric Paris +Reviewed-by: Jan Kara +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds + +diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c +index 4e565c8..732648b 100644 +--- a/fs/notify/fanotify/fanotify_user.c ++++ b/fs/notify/fanotify/fanotify_user.c +@@ -698,6 +698,8 @@ SYSCALL_DEFINE2(fanotify_init, unsigned int, flags, unsigned int, event_f_flags) + } + group->overflow_event = &oevent->fse; + ++ if (force_o_largefile()) ++ event_f_flags |= O_LARGEFILE; + group->fanotify_data.f_flags = event_f_flags; + #ifdef CONFIG_FANOTIFY_ACCESS_PERMISSIONS + spin_lock_init(&group->fanotify_data.access_lock); +-- +cgit v0.10.1 + -- 2.44.0