[Cluster-devel] [PATCH 4/4] GFS2: Use MAX_LFS_FILESIZE for meta inode size

2010-01-11 Thread Steven Whitehouse
Using ~0ULL was cauing sign issues in filemap_fdatawrite_range, so
use MAX_LFS_FILESIZE instead.

Signed-off-by: Steven Whitehouse swhit...@redhat.com
---
 fs/gfs2/meta_io.c |2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/fs/gfs2/meta_io.c b/fs/gfs2/meta_io.c
index cb8d7a9..6f68a5f 100644
--- a/fs/gfs2/meta_io.c
+++ b/fs/gfs2/meta_io.c
@@ -121,7 +121,7 @@ struct inode *gfs2_aspace_get(struct gfs2_sbd *sdp)
if (aspace) {
mapping_set_gfp_mask(aspace-i_mapping, GFP_NOFS);
aspace-i_mapping-a_ops = aspace_aops;
-   aspace-i_size = ~0ULL;
+   aspace-i_size = MAX_LFS_FILESIZE;
ip = GFS2_I(aspace);
clear_bit(GIF_USER, ip-i_flags);
insert_inode_hash(aspace);
-- 
1.6.2.5



[Cluster-devel] [PATCH 3/4] GFS2: Fix gfs2_xattr_acl_chmod()

2010-01-11 Thread Steven Whitehouse
The ref counting for the bh returned by gfs2_ea_find() was
wrong. This patch ensures that we always drop the ref count
to that bh correctly.

Signed-off-by: Steven Whitehouse swhit...@redhat.com
---
 fs/gfs2/xattr.c |   21 +++--
 1 files changed, 11 insertions(+), 10 deletions(-)

diff --git a/fs/gfs2/xattr.c b/fs/gfs2/xattr.c
index 8a04108..c2ebdf2 100644
--- a/fs/gfs2/xattr.c
+++ b/fs/gfs2/xattr.c
@@ -1296,6 +1296,7 @@ fail:
 
 int gfs2_xattr_acl_chmod(struct gfs2_inode *ip, struct iattr *attr, char *data)
 {
+   struct gfs2_sbd *sdp = GFS2_SB(ip-i_inode);
struct gfs2_ea_location el;
struct buffer_head *dibh;
int error;
@@ -1305,16 +1306,17 @@ int gfs2_xattr_acl_chmod(struct gfs2_inode *ip, struct 
iattr *attr, char *data)
return error;
 
if (GFS2_EA_IS_STUFFED(el.el_ea)) {
-   error = gfs2_trans_begin(GFS2_SB(ip-i_inode), RES_DINODE + 
RES_EATTR, 0);
-   if (error)
-   return error;
-
-   gfs2_trans_add_bh(ip-i_gl, el.el_bh, 1);
-   memcpy(GFS2_EA2DATA(el.el_ea), data,
-  GFS2_EA_DATA_LEN(el.el_ea));
-   } else
+   error = gfs2_trans_begin(sdp, RES_DINODE + RES_EATTR, 0);
+   if (error == 0) {
+   gfs2_trans_add_bh(ip-i_gl, el.el_bh, 1);
+   memcpy(GFS2_EA2DATA(el.el_ea), data,
+  GFS2_EA_DATA_LEN(el.el_ea));
+   }
+   } else {
error = ea_acl_chmod_unstuffed(ip, el.el_ea, data);
+   }
 
+   brelse(el.el_bh);
if (error)
return error;
 
@@ -1327,8 +1329,7 @@ int gfs2_xattr_acl_chmod(struct gfs2_inode *ip, struct 
iattr *attr, char *data)
brelse(dibh);
}
 
-   gfs2_trans_end(GFS2_SB(ip-i_inode));
-
+   gfs2_trans_end(sdp);
return error;
 }
 
-- 
1.6.2.5



[Cluster-devel] [PATCH 1/4] GFS2: Ensure uptodate inode size when using O_APPEND

2010-01-11 Thread Steven Whitehouse
The VFS reads the inode size during generic_file_aio_write() but
with no locking around it. In order to get the expected result
from O_APPEND opens, this patch updated the inode size before
calling generic_file_aio_write()

There is of course still a race here, in that there is nothing to
prevent another node coming in and extending the file in the
mean time. On the other hand, when used with file locking this
will ensure that the expected results are obtained.

Signed-off-by: Steven Whitehouse swhit...@redhat.com
---
 fs/gfs2/file.c |   38 --
 1 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c
index 4eb308a..a6abbae 100644
--- a/fs/gfs2/file.c
+++ b/fs/gfs2/file.c
@@ -569,6 +569,40 @@ static int gfs2_fsync(struct file *file, struct dentry 
*dentry, int datasync)
return ret;
 }
 
+/**
+ * gfs2_file_aio_write - Perform a write to a file
+ * @iocb: The io context
+ * @iov: The data to write
+ * @nr_segs: Number of @iov segments
+ * @pos: The file position
+ *
+ * We have to do a lock/unlock here to refresh the inode size for
+ * O_APPEND writes, otherwise we can land up writing at the wrong
+ * offset. There is still a race, but provided the app is using its
+ * own file locking, this will make O_APPEND work as expected.
+ *
+ */
+
+static ssize_t gfs2_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
+  unsigned long nr_segs, loff_t pos)
+{
+   struct file *file = iocb-ki_filp;
+
+   if (file-f_flags  O_APPEND) {
+   struct dentry *dentry = file-f_dentry;
+   struct gfs2_inode *ip = GFS2_I(dentry-d_inode);
+   struct gfs2_holder gh;
+   int ret;
+
+   ret = gfs2_glock_nq_init(ip-i_gl, LM_ST_SHARED, 0, gh);
+   if (ret)
+   return ret;
+   gfs2_glock_dq_uninit(gh);
+   }
+
+   return generic_file_aio_write(iocb, iov, nr_segs, pos);
+}
+
 #ifdef CONFIG_GFS2_FS_LOCKING_DLM
 
 /**
@@ -711,7 +745,7 @@ const struct file_operations gfs2_file_fops = {
.read   = do_sync_read,
.aio_read   = generic_file_aio_read,
.write  = do_sync_write,
-   .aio_write  = generic_file_aio_write,
+   .aio_write  = gfs2_file_aio_write,
.unlocked_ioctl = gfs2_ioctl,
.mmap   = gfs2_mmap,
.open   = gfs2_open,
@@ -741,7 +775,7 @@ const struct file_operations gfs2_file_fops_nolock = {
.read   = do_sync_read,
.aio_read   = generic_file_aio_read,
.write  = do_sync_write,
-   .aio_write  = generic_file_aio_write,
+   .aio_write  = gfs2_file_aio_write,
.unlocked_ioctl = gfs2_ioctl,
.mmap   = gfs2_mmap,
.open   = gfs2_open,
-- 
1.6.2.5



[Cluster-devel] [PATCH 2/4] GFS2: Fix locking bug in rename

2010-01-11 Thread Steven Whitehouse
The rename code was taking a resource group lock in cases where
it wasn't actually needed, this caused problems if the rename
was resulting in an inode being unlinked. The patch ensures that
we only take the rgrp lock early if it is really needed.

Signed-off-by: Steven Whitehouse swhit...@redhat.com
---
 fs/gfs2/ops_inode.c |6 --
 1 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/fs/gfs2/ops_inode.c b/fs/gfs2/ops_inode.c
index 247436c..78f73ca 100644
--- a/fs/gfs2/ops_inode.c
+++ b/fs/gfs2/ops_inode.c
@@ -748,7 +748,7 @@ static int gfs2_rename(struct inode *odir, struct dentry 
*odentry,
struct gfs2_rgrpd *nrgd;
unsigned int num_gh;
int dir_rename = 0;
-   int alloc_required;
+   int alloc_required = 0;
unsigned int x;
int error;
 
@@ -867,7 +867,9 @@ static int gfs2_rename(struct inode *odir, struct dentry 
*odentry,
goto out_gunlock;
}
 
-   alloc_required = error = gfs2_diradd_alloc_required(ndir, 
ndentry-d_name);
+   if (nip == NULL)
+   alloc_required = gfs2_diradd_alloc_required(ndir, 
ndentry-d_name);
+   error = alloc_required;
if (error  0)
goto out_gunlock;
error = 0;
-- 
1.6.2.5



[Cluster-devel] GFS2: Pre-pull patch posting (fixes)

2010-01-11 Thread Steven Whitehouse
Here are four small fixes for GFS2. Assuming that nobody spots
any errors, I'll be sending a pull request for these shortly,

Steve.



[Cluster-devel] GFS2: Pull request (fixes)

2010-01-11 Thread Steven Whitehouse
Hi,

Please consider pulling the following GFS2 bug fixes,

Steve.


The following changes since commit 74d2e4f8d79ae0c4b6ec027958d5b18058662eea:
  Linus Torvalds (1):
Linux 2.6.33-rc3

are available in the git repository at:

  git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-2.6-fixes.git master

Steven Whitehouse (4):
  GFS2: Ensure uptodate inode size when using O_APPEND
  GFS2: Fix locking bug in rename
  GFS2: Fix gfs2_xattr_acl_chmod()
  GFS2: Use MAX_LFS_FILESIZE for meta inode size

 fs/gfs2/file.c  |   38 --
 fs/gfs2/meta_io.c   |2 +-
 fs/gfs2/ops_inode.c |6 --
 fs/gfs2/xattr.c |   21 +++--
 4 files changed, 52 insertions(+), 15 deletions(-)




[Cluster-devel] [PATCH] gfs2: Fix refcnt leak on gfs2_follow_link() error path

2010-01-11 Thread OGAWA Hirofumi

If -follow_link handler return the error, it should decrement
nd-path refcnt.

This patch fix it.

Signed-off-by: OGAWA Hirofumi hirof...@mail.parknet.co.jp
---

 fs/gfs2/ops_inode.c |3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff -puN fs/gfs2/ops_inode.c~namei-gfs2-follow_link-fix fs/gfs2/ops_inode.c
--- linux-2.6/fs/gfs2/ops_inode.c~namei-gfs2-follow_link-fix2010-01-12 
00:15:12.0 +0900
+++ linux-2.6-hirofumi/fs/gfs2/ops_inode.c  2010-01-12 00:15:12.0 
+0900
@@ -1086,7 +1086,8 @@ static void *gfs2_follow_link(struct den
error = vfs_follow_link(nd, buf);
if (buf != array)
kfree(buf);
-   }
+   } else
+   path_put(nd-path);
 
return ERR_PTR(error);
 }
_

-- 
OGAWA Hirofumi hirof...@mail.parknet.co.jp