* [PATCH RESEND] vfs: Return EINVAL for default SEEK_HOLE, SEEK_DATA implementation
@ 2014-03-04 20:43 Jan Kara
0 siblings, 0 replies; 2+ messages in thread
From: Jan Kara @ 2014-03-04 20:43 UTC (permalink / raw)
To: Al Viro; +Cc: linux-fsdevel, Jan Kara
Generic implementation of SEEK_HOLE & SEEK_DATA in
generic_file_llseek_size() and default_llseek() behaved as if everything
within i_size is data and everything beyond i_size is a hole. That makes
sense at the first sight (and definitely is a valid implementation of
the spec) but at the second sight it isn't very useful. If anyone
bothers with looking for holes / data, he should be better told we don't
really know so that he can fall back to his chosen backup strategy
(think of e.g. cp(1)).
This is a userspace API change however the kernel interface is there
only for two years so hopefully userspace is still prepared to handle
EINVAL return value.
Signed-off-by: Jan Kara <jack@suse.cz>
---
fs/read_write.c | 38 ++------------------------------------
1 file changed, 2 insertions(+), 36 deletions(-)
Al, what do you think about this change?
diff --git a/fs/read_write.c b/fs/read_write.c
index edc5746a902a..71525d75742f 100644
--- a/fs/read_write.c
+++ b/fs/read_write.c
@@ -111,22 +111,8 @@ generic_file_llseek_size(struct file *file, loff_t offset, int whence,
spin_unlock(&file->f_lock);
return offset;
case SEEK_DATA:
- /*
- * In the generic case the entire file is data, so as long as
- * offset isn't at the end of the file then the offset is data.
- */
- if (offset >= eof)
- return -ENXIO;
- break;
case SEEK_HOLE:
- /*
- * There is a virtual hole at the end of the file, so as long as
- * offset isn't i_size or larger, return i_size.
- */
- if (offset >= eof)
- return -ENXIO;
- offset = eof;
- break;
+ return -EINVAL;
}
return vfs_setpos(file, offset, maxsize);
@@ -214,28 +200,8 @@ loff_t default_llseek(struct file *file, loff_t offset, int whence)
offset += file->f_pos;
break;
case SEEK_DATA:
- /*
- * In the generic case the entire file is data, so as
- * long as offset isn't at the end of the file then the
- * offset is data.
- */
- if (offset >= inode->i_size) {
- retval = -ENXIO;
- goto out;
- }
- break;
case SEEK_HOLE:
- /*
- * There is a virtual hole at the end of the file, so
- * as long as offset isn't i_size or larger, return
- * i_size.
- */
- if (offset >= inode->i_size) {
- retval = -ENXIO;
- goto out;
- }
- offset = inode->i_size;
- break;
+ return -EINVAL;
}
retval = -EINVAL;
if (offset >= 0 || unsigned_offsets(file)) {
--
1.8.1.4
^ permalink raw reply related [flat|nested] 2+ messages in thread
* [PATCH 0/2 v2] Fix data corruption when blocksize < pagesize for mmapped data
@ 2014-10-10 14:23 Jan Kara
2014-10-10 14:23 ` [PATCH RESEND] vfs: Return EINVAL for default SEEK_HOLE, SEEK_DATA implementation Jan Kara
0 siblings, 1 reply; 2+ messages in thread
From: Jan Kara @ 2014-10-10 14:23 UTC (permalink / raw)
To: linux-fsdevel
Cc: linux-ext4, Dave Chinner, xfs, cluster-devel, Steven Whitehouse,
Mark Fasheh, Joel Becker, ocfs2-devel, reiserfs-devel,
Jeff Mahoney, Dave Kleikamp, jfs-discussion, tytso, viro,
Jan Kara
Hello,
this is a second version of the patches to fix data corruption in mmapped
data when blocksize < pagesize as tested by xfstests generic/030 test.
The patchset fixes XFS and ext4. I've checked and btrfs doesn't need fixing
because it doesn't support blocksize < pagesize. If that's ever going
to change btrfs will likely need a similar treatment. ocfs2, ext2, ext3 are
OK since they happily allocate blocks during writeback. For other filesystems
like gfs2, ubifs, nilfs, ceph,... I'm not sure whether they support blocksize <
pagesize at all. Interesting is also NFS which may care but I don't understand
its ->page_mkwrite() handler good enough to judge.
Changes since v1:
- changed helper function name and moved it to mm/truncate.c - I originally
thought we can make the helper function update i_size to simplify the
interface but it's actually impossible due to generic_write_end() lock
ordering constraints.
- used round_up() instead of ALIGN()
- taught truncate_setsize() to use the helper function
Honza
^ permalink raw reply [flat|nested] 2+ messages in thread
* [PATCH RESEND] vfs: Return EINVAL for default SEEK_HOLE, SEEK_DATA implementation
2014-10-10 14:23 [PATCH 0/2 v2] Fix data corruption when blocksize < pagesize for mmapped data Jan Kara
@ 2014-10-10 14:23 ` Jan Kara
0 siblings, 0 replies; 2+ messages in thread
From: Jan Kara @ 2014-10-10 14:23 UTC (permalink / raw)
To: linux-fsdevel
Cc: Dave Kleikamp, jfs-discussion, tytso, Jeff Mahoney, Mark Fasheh,
Dave Chinner, reiserfs-devel, xfs, cluster-devel, Joel Becker,
Jan Kara, linux-ext4, Steven Whitehouse, ocfs2-devel, viro
Generic implementation of SEEK_HOLE & SEEK_DATA in
generic_file_llseek_size() and default_llseek() behaved as if everything
within i_size is data and everything beyond i_size is a hole. That makes
sense at the first sight (and definitely is a valid implementation of
the spec) but at the second sight it isn't very useful. If anyone
bothers with looking for holes / data, he should be better told we don't
really know so that he can fall back to his chosen backup strategy
(think of e.g. cp(1)).
This is a userspace API change however the kernel interface is there
only for two years so hopefully userspace is still prepared to handle
EINVAL return value.
Signed-off-by: Jan Kara <jack@suse.cz>
---
fs/read_write.c | 38 ++------------------------------------
1 file changed, 2 insertions(+), 36 deletions(-)
Al, what do you think about this change?
diff --git a/fs/read_write.c b/fs/read_write.c
index edc5746a902a..71525d75742f 100644
--- a/fs/read_write.c
+++ b/fs/read_write.c
@@ -111,22 +111,8 @@ generic_file_llseek_size(struct file *file, loff_t offset, int whence,
spin_unlock(&file->f_lock);
return offset;
case SEEK_DATA:
- /*
- * In the generic case the entire file is data, so as long as
- * offset isn't at the end of the file then the offset is data.
- */
- if (offset >= eof)
- return -ENXIO;
- break;
case SEEK_HOLE:
- /*
- * There is a virtual hole at the end of the file, so as long as
- * offset isn't i_size or larger, return i_size.
- */
- if (offset >= eof)
- return -ENXIO;
- offset = eof;
- break;
+ return -EINVAL;
}
return vfs_setpos(file, offset, maxsize);
@@ -214,28 +200,8 @@ loff_t default_llseek(struct file *file, loff_t offset, int whence)
offset += file->f_pos;
break;
case SEEK_DATA:
- /*
- * In the generic case the entire file is data, so as
- * long as offset isn't at the end of the file then the
- * offset is data.
- */
- if (offset >= inode->i_size) {
- retval = -ENXIO;
- goto out;
- }
- break;
case SEEK_HOLE:
- /*
- * There is a virtual hole at the end of the file, so
- * as long as offset isn't i_size or larger, return
- * i_size.
- */
- if (offset >= inode->i_size) {
- retval = -ENXIO;
- goto out;
- }
- offset = inode->i_size;
- break;
+ return -EINVAL;
}
retval = -EINVAL;
if (offset >= 0 || unsigned_offsets(file)) {
--
1.8.1.4
------------------------------------------------------------------------------
Meet PCI DSS 3.0 Compliance Requirements with EventLog Analyzer
Achieve PCI DSS 3.0 Compliant Status with Out-of-the-box PCI DSS Reports
Are you Audit-Ready for PCI DSS 3.0 Compliance? Download White paper
Comply to PCI DSS 3.0 Requirement 10 and 11.5 with EventLog Analyzer
http://pubads.g.doubleclick.net/gampad/clk?id=154622311&iu=/4140/ostg.clktrk
^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2014-10-10 14:23 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-03-04 20:43 [PATCH RESEND] vfs: Return EINVAL for default SEEK_HOLE, SEEK_DATA implementation Jan Kara
-- strict thread matches above, loose matches on Subject: below --
2014-10-10 14:23 [PATCH 0/2 v2] Fix data corruption when blocksize < pagesize for mmapped data Jan Kara
2014-10-10 14:23 ` [PATCH RESEND] vfs: Return EINVAL for default SEEK_HOLE, SEEK_DATA implementation Jan Kara
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).