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

2014-09-15 Thread Steven Whitehouse
Hi,

Here are a number of small fixes for GFS2. There is a fix for FIEMAP
on large sparse files, a negative dentry hashing fix, a fix for
flock, and a bug fix relating to d_splice_alias usage. There are
also (patches 1 and 5) a couple of updates which are less
critical, but small and low risk.

Steve.



[Cluster-devel] [PATCH 1/6] GFS2: fs/gfs2/super.c: replace seq_printf by seq_puts

2014-09-15 Thread Steven Whitehouse
From: Fabian Frederick f...@skynet.be

fix checkpatch warnings:
WARNING: Prefer seq_puts to seq_printf

Cc: cluster-devel@redhat.com
Signed-off-by: Fabian Frederick f...@skynet.be
Signed-off-by: Steven Whitehouse swhit...@redhat.com

diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c
index 2607ff1..a346f56 100644
--- a/fs/gfs2/super.c
+++ b/fs/gfs2/super.c
@@ -1294,7 +1294,7 @@ static int gfs2_show_options(struct seq_file *s, struct 
dentry *root)
int val;
 
if (is_ancestor(root, sdp-sd_master_dir))
-   seq_printf(s, ,meta);
+   seq_puts(s, ,meta);
if (args-ar_lockproto[0])
seq_printf(s, ,lockproto=%s, args-ar_lockproto);
if (args-ar_locktable[0])
@@ -1302,13 +1302,13 @@ static int gfs2_show_options(struct seq_file *s, struct 
dentry *root)
if (args-ar_hostdata[0])
seq_printf(s, ,hostdata=%s, args-ar_hostdata);
if (args-ar_spectator)
-   seq_printf(s, ,spectator);
+   seq_puts(s, ,spectator);
if (args-ar_localflocks)
-   seq_printf(s, ,localflocks);
+   seq_puts(s, ,localflocks);
if (args-ar_debug)
-   seq_printf(s, ,debug);
+   seq_puts(s, ,debug);
if (args-ar_posix_acl)
-   seq_printf(s, ,acl);
+   seq_puts(s, ,acl);
if (args-ar_quota != GFS2_QUOTA_DEFAULT) {
char *state;
switch (args-ar_quota) {
@@ -1328,7 +1328,7 @@ static int gfs2_show_options(struct seq_file *s, struct 
dentry *root)
seq_printf(s, ,quota=%s, state);
}
if (args-ar_suiddir)
-   seq_printf(s, ,suiddir);
+   seq_puts(s, ,suiddir);
if (args-ar_data != GFS2_DATA_DEFAULT) {
char *state;
switch (args-ar_data) {
@@ -1345,7 +1345,7 @@ static int gfs2_show_options(struct seq_file *s, struct 
dentry *root)
seq_printf(s, ,data=%s, state);
}
if (args-ar_discard)
-   seq_printf(s, ,discard);
+   seq_puts(s, ,discard);
val = sdp-sd_tune.gt_logd_secs;
if (val != 30)
seq_printf(s, ,commit=%d, val);
@@ -1376,11 +1376,11 @@ static int gfs2_show_options(struct seq_file *s, struct 
dentry *root)
seq_printf(s, ,errors=%s, state);
}
if (test_bit(SDF_NOBARRIERS, sdp-sd_flags))
-   seq_printf(s, ,nobarrier);
+   seq_puts(s, ,nobarrier);
if (test_bit(SDF_DEMOTE, sdp-sd_flags))
-   seq_printf(s, ,demote_interface_used);
+   seq_puts(s, ,demote_interface_used);
if (args-ar_rgrplvb)
-   seq_printf(s, ,rgrplvb);
+   seq_puts(s, ,rgrplvb);
return 0;
 }
 
-- 
1.8.3.1



[Cluster-devel] [PATCH 4/6] GFS2: Hash the negative dentry during inode lookup

2014-09-15 Thread Steven Whitehouse
From: Benjamin Coddington bcodd...@redhat.com

Fix a regression introduced by:
6d4ade986f9c8df31e68 GFS2: Add atomic_open support
where an early return misses d_splice_alias() which had been
adding the negative dentry.

Signed-off-by: Benjamin Coddington bcodd...@redhat.com
Signed-off-by: Bob Peterson rpete...@redhat.com
Signed-off-by: Steven Whitehouse swhit...@redhat.com

diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c
index e62e594..9317ddc 100644
--- a/fs/gfs2/inode.c
+++ b/fs/gfs2/inode.c
@@ -840,8 +840,10 @@ static struct dentry *__gfs2_lookup(struct inode *dir, 
struct dentry *dentry,
int error;
 
inode = gfs2_lookupi(dir, dentry-d_name, 0);
-   if (!inode)
+   if (inode == NULL) {
+   d_add(dentry, NULL);
return NULL;
+   }
if (IS_ERR(inode))
return ERR_CAST(inode);
 
-- 
1.8.3.1



[Cluster-devel] [PATCH 5/6] GFS2: Don't use MAXQUOTAS value

2014-09-15 Thread Steven Whitehouse
From: Jan Kara j...@suse.cz

MAXQUOTAS value defines maximum number of quota types VFS supports.
This isn't necessarily the number of types gfs2 supports and with
addition of project quotas these two numbers stop matching. So make gfs2
use its private definition.

CC: cluster-devel@redhat.com
Signed-off-by: Jan Kara j...@suse.cz
Signed-off-by: Steven Whitehouse swhit...@redhat.com

diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h
index 67d310c..39e7e99 100644
--- a/fs/gfs2/incore.h
+++ b/fs/gfs2/incore.h
@@ -262,6 +262,9 @@ struct gfs2_holder {
unsigned long gh_ip;
 };
 
+/* Number of quota types we support */
+#define GFS2_MAXQUOTAS 2
+
 /* Resource group multi-block reservation, in order of appearance:
 
Step 1. Function prepares to write, allocates a mb, sets the size hint.
@@ -282,8 +285,8 @@ struct gfs2_blkreserv {
u64 rs_inum;  /* Inode number for reservation */
 
/* ancillary quota stuff */
-   struct gfs2_quota_data *rs_qa_qd[2 * MAXQUOTAS];
-   struct gfs2_holder rs_qa_qd_ghs[2 * MAXQUOTAS];
+   struct gfs2_quota_data *rs_qa_qd[2 * GFS2_MAXQUOTAS];
+   struct gfs2_holder rs_qa_qd_ghs[2 * GFS2_MAXQUOTAS];
unsigned int rs_qa_qd_num;
 };
 
-- 
1.8.3.1



[Cluster-devel] [PATCH 6/6] GFS2: fix d_splice_alias() misuses

2014-09-15 Thread Steven Whitehouse
From: Al Viro v...@zeniv.linux.org.uk

Callers of d_splice_alias(dentry, inode) don't need iput(), neither
on success nor on failure.  Either the reference to inode is stored
in a previously negative dentry, or it's dropped.  In either case
inode reference the caller used to hold is consumed.

__gfs2_lookup() does iput() in case when d_splice_alias() has failed.
Double iput() if we ever hit that.  And gfs2_create_inode() ends up
not only with double iput(), but with link count dropped to zero - on
an inode it has just found in directory.

Cc: sta...@vger.kernel.org # v3.14+
Signed-off-by: Al Viro v...@zeniv.linux.org.uk
Signed-off-by: Steven Whitehouse swhit...@redhat.com

diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c
index 9317ddc..fc8ac2e 100644
--- a/fs/gfs2/inode.c
+++ b/fs/gfs2/inode.c
@@ -626,8 +626,10 @@ static int gfs2_create_inode(struct inode *dir, struct 
dentry *dentry,
if (!IS_ERR(inode)) {
d = d_splice_alias(inode, dentry);
error = PTR_ERR(d);
-   if (IS_ERR(d))
+   if (IS_ERR(d)) {
+   inode = ERR_CAST(d);
goto fail_gunlock;
+   }
error = 0;
if (file) {
if (S_ISREG(inode-i_mode)) {
@@ -856,7 +858,6 @@ static struct dentry *__gfs2_lookup(struct inode *dir, 
struct dentry *dentry,
 
d = d_splice_alias(inode, dentry);
if (IS_ERR(d)) {
-   iput(inode);
gfs2_glock_dq_uninit(gh);
return d;
}
-- 
1.8.3.1



[Cluster-devel] [PATCH 2/6] GFS2: Change maxlen variables to size_t

2014-09-15 Thread Steven Whitehouse
From: Bob Peterson rpete...@redhat.com

This patch changes some variables (especially maxlen in function
gfs2_block_map) from unsigned int to size_t. We need 64-bit arithmetic
for very large files (e.g. 1PB) where the variables otherwise get
shifted to all 0's.

Signed-off-by: Bob Peterson rpete...@redhat.com
Signed-off-by: Steven Whitehouse swhit...@redhat.com

diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c
index e6ee5b6..f0b945a 100644
--- a/fs/gfs2/bmap.c
+++ b/fs/gfs2/bmap.c
@@ -359,7 +359,7 @@ static inline void release_metapath(struct metapath *mp)
  * Returns: The length of the extent (minimum of one block)
  */
 
-static inline unsigned int gfs2_extent_length(void *start, unsigned int len, 
__be64 *ptr, unsigned limit, int *eob)
+static inline unsigned int gfs2_extent_length(void *start, unsigned int len, 
__be64 *ptr, size_t limit, int *eob)
 {
const __be64 *end = (start + len);
const __be64 *first = ptr;
@@ -449,7 +449,7 @@ static int gfs2_bmap_alloc(struct inode *inode, const 
sector_t lblock,
   struct buffer_head *bh_map, struct metapath *mp,
   const unsigned int sheight,
   const unsigned int height,
-  const unsigned int maxlen)
+  const size_t maxlen)
 {
struct gfs2_inode *ip = GFS2_I(inode);
struct gfs2_sbd *sdp = GFS2_SB(inode);
@@ -483,7 +483,8 @@ static int gfs2_bmap_alloc(struct inode *inode, const 
sector_t lblock,
} else {
/* Need to allocate indirect blocks */
ptrs_per_blk = height  1 ? sdp-sd_inptrs : sdp-sd_diptrs;
-   dblks = min(maxlen, ptrs_per_blk - 
mp-mp_list[end_of_metadata]);
+   dblks = min(maxlen, (size_t)(ptrs_per_blk -
+mp-mp_list[end_of_metadata]));
if (height == ip-i_height) {
/* Writing into existing tree, extend tree down */
iblks = height - sheight;
@@ -605,7 +606,7 @@ int gfs2_block_map(struct inode *inode, sector_t lblock,
struct gfs2_inode *ip = GFS2_I(inode);
struct gfs2_sbd *sdp = GFS2_SB(inode);
unsigned int bsize = sdp-sd_sb.sb_bsize;
-   const unsigned int maxlen = bh_map-b_size  inode-i_blkbits;
+   const size_t maxlen = bh_map-b_size  inode-i_blkbits;
const u64 *arr = sdp-sd_heightsize;
__be64 *ptr;
u64 size;
-- 
1.8.3.1