[patch 01/51] fiemap: fix problem with setting FIEMAP_EXTENT_LAST

2009-05-14 Thread Greg KH
2.6.29-stable review patch.  If anyone has any objections, please let us know.

--

From: Josef Bacik 

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 
Signed-off-by: Josef Bacik 
Cc: 
Cc: 
Cc: 
Cc: Steven Whitehouse 
Cc: Mark Fasheh 
Cc: Joel Becker 
Signed-off-by: Andrew Morton 
Signed-off-by: Linus Torvalds 
Signed-off-by: Greg Kroah-Hartman 

---
 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,
 

GlusterFS 2.0 Release

2009-05-14 Thread Shehjar Tikoo

Greetings!

GlusterFS is a clustered file system that runs on commodity
off-the-shelf hardware, delivering multiple times the scalability and
performance of conventional storage. The architecture is modular,
stackable and kernel-independent, which makes it easy to customize,
install, manage and support different operating systems. Multiple
storage systems can be clustered together, supporting petabytes of
capacity in a single global namespace.  Building a configuration of a
few hundred terabytes can be accomplished in less than thirty minutes.

GlusterFS 2.0 Release:
GlusterFS v2.0 has gone through a major revamp in design and
development since v1.3. Thanks to thousands of initial users who
provided us great feedback and bug reports. There are a number of
production deployments now. GlusterFS uses existing disk file systems
(such as Ext3, XFS, ZFS..) to store your data as regular files and
folders. You can restore the data, even after you uninstall GlusterFS.
So, give it a try and let us know. Please forward this message to
relevant users.

What is in 2.0 release:
http://www.gluster.org/docs/index.php/GlusterFS_Features

Who is using GlusterFS:
http://www.gluster.org/docs/index.php/Who%27s_using_GlusterFS

License: GNU GPLv3

Download: http://www.gluster.org/download.php

Happy Hacking
--
GlusterFS Team
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html