From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@kernel.org
Cc: Justin Forbes <jmforbes@linuxtx.org>,
Zwane Mwaikambo <zwane@arm.linux.org.uk>,
"Theodore Ts'o" <tytso@mit.edu>,
Randy Dunlap <rdunlap@xenotime.net>,
Dave Jones <davej@redhat.com>,
Chuck Wolber <chuckw@quantumlinux.com>,
Chris Wedgwood <reviews@ml.cw.f00f.org>,
Michael Krufky <mkrufky@linuxtv.org>,
Chuck Ebbert <cebbert@redhat.com>,
Domenico Andreoli <cavokz@gmail.com>, Willy Tarreau <w@1wt.eu>,
Rodrigo Rubira Branco <rbranco@la.checkpoint.com>,
Jake Edge <jake@lwn.net>, Eugene Teo <eteo@redhat.com>,
torvalds@linux-foundation.org, akpm@linux-foundation.org,
alan@lxorguk.ukuu.org.uk, Josef Bacik <jbacik@redhat.com>,
<linux-ext4@vger.kernel.org>, <xfs-masters@oss.sgi.com>,
<linux-btrfs@vger.kernel.org>,
Steven Whitehouse <swhiteho@redhat.com>,
Mark Fasheh <mfasheh@suse.com>,
Joel Becker <Joel.Becker@oracle.com>
Subject: [patch 01/51] fiemap: fix problem with setting FIEMAP_EXTENT_LAST
Date: Thu, 14 May 2009 15:32:36 -0700 [thread overview]
Message-ID: <20090514223520.343106419@mini.kroah.org> (raw)
In-Reply-To: <20090514223755.GA27019@kroah.com>
[-- Attachment #1: fiemap-fix-problem-with-setting-fiemap_extent_last.patch --]
[-- Type: text/plain, Size: 4723 bytes --]
2.6.29-stable review patch. If anyone has any objections, please let us know.
------------------
From: Josef Bacik <jbacik@redhat.com>
commit df3935ffd6166fdd00702cf548fb5bb55737758b upstream.
Fix a problem where the generic block based fiemap stuff would not
properly set FIEMAP_EXTENT_LAST on the last extent. I've reworked things
to keep track if we go past the EOF, and mark the last extent properly.
The problem was reported by and tested by Eric Sandeen.
Tested-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Josef Bacik <jbacik@redhat.com>
Cc: <linux-ext4@vger.kernel.org>
Cc: <xfs-masters@oss.sgi.com>
Cc: <linux-btrfs@vger.kernel.org>
Cc: Steven Whitehouse <swhiteho@redhat.com>
Cc: Mark Fasheh <mfasheh@suse.com>
Cc: Joel Becker <Joel.Becker@oracle.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
fs/ioctl.c | 75 ++++++++++++++++++++++++++++++++++++++++++++-----------------
1 file changed, 55 insertions(+), 20 deletions(-)
--- a/fs/ioctl.c
+++ b/fs/ioctl.c
@@ -258,7 +258,7 @@ int __generic_block_fiemap(struct inode
long long length = 0, map_len = 0;
u64 logical = 0, phys = 0, size = 0;
u32 flags = FIEMAP_EXTENT_MERGED;
- int ret = 0;
+ int ret = 0, past_eof = 0, whole_file = 0;
if ((ret = fiemap_check_flags(fieinfo, FIEMAP_FLAG_SYNC)))
return ret;
@@ -266,6 +266,9 @@ int __generic_block_fiemap(struct inode
start_blk = logical_to_blk(inode, start);
length = (long long)min_t(u64, len, i_size_read(inode));
+ if (length < len)
+ whole_file = 1;
+
map_len = length;
do {
@@ -282,11 +285,26 @@ int __generic_block_fiemap(struct inode
/* HOLE */
if (!buffer_mapped(&tmp)) {
+ length -= blk_to_logical(inode, 1);
+ start_blk++;
+
+ /*
+ * we want to handle the case where there is an
+ * allocated block at the front of the file, and then
+ * nothing but holes up to the end of the file properly,
+ * to make sure that extent at the front gets properly
+ * marked with FIEMAP_EXTENT_LAST
+ */
+ if (!past_eof &&
+ blk_to_logical(inode, start_blk) >=
+ blk_to_logical(inode, 0)+i_size_read(inode))
+ past_eof = 1;
+
/*
* first hole after going past the EOF, this is our
* last extent
*/
- if (length <= 0) {
+ if (past_eof && size) {
flags = FIEMAP_EXTENT_MERGED|FIEMAP_EXTENT_LAST;
ret = fiemap_fill_next_extent(fieinfo, logical,
phys, size,
@@ -294,15 +312,37 @@ int __generic_block_fiemap(struct inode
break;
}
- length -= blk_to_logical(inode, 1);
-
/* if we have holes up to/past EOF then we're done */
- if (length <= 0)
+ if (length <= 0 || past_eof)
break;
-
- start_blk++;
} else {
- if (length <= 0 && size) {
+ /*
+ * we have gone over the length of what we wanted to
+ * map, and it wasn't the entire file, so add the extent
+ * we got last time and exit.
+ *
+ * This is for the case where say we want to map all the
+ * way up to the second to the last block in a file, but
+ * the last block is a hole, making the second to last
+ * block FIEMAP_EXTENT_LAST. In this case we want to
+ * see if there is a hole after the second to last block
+ * so we can mark it properly. If we found data after
+ * we exceeded the length we were requesting, then we
+ * are good to go, just add the extent to the fieinfo
+ * and break
+ */
+ if (length <= 0 && !whole_file) {
+ ret = fiemap_fill_next_extent(fieinfo, logical,
+ phys, size,
+ flags);
+ break;
+ }
+
+ /*
+ * if size != 0 then we know we already have an extent
+ * to add, so add it.
+ */
+ if (size) {
ret = fiemap_fill_next_extent(fieinfo, logical,
phys, size,
flags);
@@ -319,19 +359,14 @@ int __generic_block_fiemap(struct inode
start_blk += logical_to_blk(inode, size);
/*
- * if we are past the EOF we need to loop again to see
- * if there is a hole so we can mark this extent as the
- * last one, and if not keep mapping things until we
- * find a hole, or we run out of slots in the extent
- * array
+ * If we are past the EOF, then we need to make sure as
+ * soon as we find a hole that the last extent we found
+ * is marked with FIEMAP_EXTENT_LAST
*/
- if (length <= 0)
- continue;
-
- ret = fiemap_fill_next_extent(fieinfo, logical, phys,
- size, flags);
- if (ret)
- break;
+ if (!past_eof &&
+ logical+size >=
+ blk_to_logical(inode, 0)+i_size_read(inode))
+ past_eof = 1;
}
cond_resched();
} while (1);
next prev parent reply other threads:[~2009-05-14 22:42 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20090514223235.348540705@mini.kroah.org>
2009-05-14 22:37 ` [patch 00/51] 2.6.29-stable review Greg KH
2009-05-14 22:32 ` Greg KH [this message]
2009-05-14 22:32 ` [patch 02/51] md: remove ability to explicit set an inactive array to clean Greg KH
2009-05-14 22:32 ` [patch 03/51] md: fix some (more) errors with bitmaps on devices larger than 2TB Greg KH
2009-05-14 22:32 ` [patch 04/51] md/raid10: dont clear bitmap during recovery if array will still be degraded Greg KH
2009-05-14 22:32 ` [patch 05/51] md: fix loading of out-of-date bitmap Greg KH
2009-05-14 22:32 ` [patch 06/51] usb-serial: ftdi_sio: fix reference counting of ftdi_private Greg KH
2009-05-18 12:46 ` David Woodhouse
2009-05-18 23:33 ` [stable] " Greg KH
2009-05-14 22:32 ` [patch 07/51] USB: Gadget: fix UTF conversion in the usbstring library Greg KH
2009-05-14 22:32 ` [patch 08/51] ALSA: hda - Fix line-in on Mac Mini Core2 Duo Greg KH
2009-05-14 22:32 ` [patch 09/51] ASoC: Fix errors in WM8990 Greg KH
2009-05-14 22:32 ` [patch 10/51] e1000: fix virtualization bug Greg KH
2009-05-14 22:32 ` [patch 11/51] hwmon: (w83781d) Fix W83782D support (NULL pointer dereference) Greg KH
2009-05-14 22:32 ` [patch 12/51] Fix for enabling branch profiling makes sparse unusable Greg KH
2009-05-14 22:32 ` [patch 13/51] i2c-algo-bit: Fix timeout test Greg KH
2009-05-14 22:32 ` [patch 14/51] i2c-algo-pca: Let PCA9564 recover from unacked data byte (state 0x30) Greg KH
2009-05-14 22:32 ` [patch 15/51] dup2: Fix return value with oldfd == newfd and invalid fd Greg KH
2009-05-14 22:32 ` [patch 16/51] ne2k-pci: Do not register device until initialized Greg KH
2009-05-14 22:32 ` [patch 17/51] lsm: Relocate the IPv4 security_inet_conn_request() hooks Greg KH
2009-05-14 22:32 ` [patch 18/51] netlabel: Add CIPSO {set, del}attr request_sock functions Greg KH
2009-05-14 22:32 ` [patch 19/51] netlabel: Add new NetLabel KAPI interfaces for request_sock security attributes Greg KH
2009-05-14 22:32 ` [patch 20/51] selinux: Add new NetLabel glue code to handle labeling of connection requests Greg KH
2009-05-14 22:32 ` [patch 21/51] selinux: Set the proper NetLabel security attributes for " Greg KH
2009-05-14 22:32 ` [patch 22/51] selinux: Remove dead code labeled networking code Greg KH
2009-05-14 22:32 ` [patch 23/51] smack: Set the proper NetLabel security attributes for connection requests Greg KH
2009-05-14 22:32 ` [patch 24/51] cifs: Fix buffer size for tcon->nativeFileSystem field Greg KH
2009-05-14 22:33 ` [patch 25/51] cifs: Increase size of tmp_buf in cifs_readdir to avoid potential overflows Greg KH
2009-05-14 22:33 ` [patch 26/51] cifs: Fix incorrect destination buffer size in cifs_strncpy_to_host Greg KH
2009-05-14 22:33 ` [patch 27/51] cifs: Fix buffer size in cifs_convertUCSpath Greg KH
2009-05-14 22:33 ` [patch 28/51] cifs: Fix unicode string area word alignment in session setup Greg KH
2009-05-14 22:33 ` [patch 29/51] mac80211: pid, fix memory corruption Greg KH
2009-05-15 6:23 ` Jiri Slaby
2009-05-15 14:49 ` Greg KH
2009-05-15 15:09 ` Jiri Slaby
2009-05-18 23:33 ` [stable] " Greg KH
2009-05-15 21:49 ` Jiri Slaby
2009-06-09 8:18 ` [stable] " Greg KH
2009-05-14 22:33 ` [patch 30/51] mm: page_mkwrite change prototype to match fault Greg KH
2009-05-14 22:33 ` [patch 31/51] fs: fix page_mkwrite error cases in core code and btrfs Greg KH
2009-05-14 22:33 ` [patch 32/51] mm: close page_mkwrite races Greg KH
2009-05-14 22:33 ` [patch 33/51] GFS2: Fix page_mkwrite() return code Greg KH
2009-05-14 22:33 ` [patch 34/51] NFS: Fix the return value in nfs_page_mkwrite() Greg KH
2009-05-14 22:33 ` [patch 35/51] NFS: Close page_mkwrite() races Greg KH
2009-05-14 22:33 ` [patch 36/51] CIFS: Fix endian conversion of vcnum field Greg KH
2009-05-14 22:33 ` [patch 37/51] epoll: fix size check in epoll_create() Greg KH
2009-05-14 22:33 ` [patch 38/51] nfsd4: check for negative dentry before use in nfsv4 readdir Greg KH
2009-05-14 22:33 ` [patch 39/51] NFS: Fix the notifications when renaming onto an existing file Greg KH
2009-05-14 22:33 ` [patch 40/51] lockd: fix list corruption on lockd restart Greg KH
2009-05-14 22:33 ` [patch 41/51] dmatest: fix max channels handling Greg KH
2009-05-14 22:33 ` [patch 42/51] HID: add NOGET quirk for devices from CH Products Greg KH
2009-05-14 22:33 ` [patch 43/51] KVM: SVM: Remove port 80 passthrough Greg KH
2009-05-14 22:33 ` [patch 44/51] KVM: Make EFER reads safe when EFER does not exist Greg KH
2009-05-14 22:33 ` [patch 45/51] fuse: destroy bdi on error Greg KH
2009-05-14 22:33 ` [patch 46/51] splice: split up __splice_from_pipe() Greg KH
2009-05-14 22:33 ` [patch 47/51] splice: remove i_mutex locking in splice_from_pipe() Greg KH
2009-05-14 22:33 ` [patch 48/51] splice: fix i_mutex locking in generic_splice_write() Greg KH
2009-05-14 22:33 ` [patch 49/51] ocfs2: fix i_mutex locking in ocfs2_splice_to_file() Greg KH
2009-05-14 22:33 ` [patch 50/51] ehea: fix invalid pointer access Greg KH
2009-05-14 22:33 ` [patch 51/51] powerpc/5200: Dont specify IRQF_SHARED in PSC UART driver Greg KH
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=20090514223520.343106419@mini.kroah.org \
--to=gregkh@suse.de \
--cc=Joel.Becker@oracle.com \
--cc=akpm@linux-foundation.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=cavokz@gmail.com \
--cc=cebbert@redhat.com \
--cc=chuckw@quantumlinux.com \
--cc=davej@redhat.com \
--cc=eteo@redhat.com \
--cc=jake@lwn.net \
--cc=jbacik@redhat.com \
--cc=jmforbes@linuxtx.org \
--cc=linux-btrfs@vger.kernel.org \
--cc=linux-ext4@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mfasheh@suse.com \
--cc=mkrufky@linuxtv.org \
--cc=rbranco@la.checkpoint.com \
--cc=rdunlap@xenotime.net \
--cc=reviews@ml.cw.f00f.org \
--cc=stable@kernel.org \
--cc=swhiteho@redhat.com \
--cc=torvalds@linux-foundation.org \
--cc=tytso@mit.edu \
--cc=w@1wt.eu \
--cc=xfs-masters@oss.sgi.com \
--cc=zwane@arm.linux.org.uk \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®