Commit 1b6150fe authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-3.0-fixes

Pull GFS2 fixes from Steven Whitehouse

* git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-3.0-fixes:
  GFS2: Allow caching of rindex glock
  GFS2: Make sure rindex is uptodate before starting transactions
  GFS2: use depends instead of select in kconfig
  GFS2: put glock reference in error patch of read_rindex_entry
parents 92ae03f2 ca9248d8
config GFS2_FS config GFS2_FS
tristate "GFS2 file system support" tristate "GFS2 file system support"
depends on (64BIT || LBDAF) depends on (64BIT || LBDAF)
select DLM if GFS2_FS_LOCKING_DLM
select CONFIGFS_FS if GFS2_FS_LOCKING_DLM
select SYSFS if GFS2_FS_LOCKING_DLM
select IP_SCTP if DLM_SCTP
select FS_POSIX_ACL select FS_POSIX_ACL
select CRC32 select CRC32
select QUOTACTL select QUOTACTL
...@@ -29,7 +25,8 @@ config GFS2_FS ...@@ -29,7 +25,8 @@ config GFS2_FS
config GFS2_FS_LOCKING_DLM config GFS2_FS_LOCKING_DLM
bool "GFS2 DLM locking" bool "GFS2 DLM locking"
depends on (GFS2_FS!=n) && NET && INET && (IPV6 || IPV6=n) && HOTPLUG depends on (GFS2_FS!=n) && NET && INET && (IPV6 || IPV6=n) && \
HOTPLUG && DLM && CONFIGFS_FS && SYSFS
help help
Multiple node locking module for GFS2 Multiple node locking module for GFS2
......
...@@ -807,7 +807,7 @@ static int gfs2_stuffed_write_end(struct inode *inode, struct buffer_head *dibh, ...@@ -807,7 +807,7 @@ static int gfs2_stuffed_write_end(struct inode *inode, struct buffer_head *dibh,
if (inode == sdp->sd_rindex) { if (inode == sdp->sd_rindex) {
adjust_fs_space(inode); adjust_fs_space(inode);
ip->i_gh.gh_flags |= GL_NOCACHE; sdp->sd_rindex_uptodate = 0;
} }
brelse(dibh); brelse(dibh);
...@@ -873,7 +873,7 @@ static int gfs2_write_end(struct file *file, struct address_space *mapping, ...@@ -873,7 +873,7 @@ static int gfs2_write_end(struct file *file, struct address_space *mapping,
if (inode == sdp->sd_rindex) { if (inode == sdp->sd_rindex) {
adjust_fs_space(inode); adjust_fs_space(inode);
ip->i_gh.gh_flags |= GL_NOCACHE; sdp->sd_rindex_uptodate = 0;
} }
brelse(dibh); brelse(dibh);
......
...@@ -724,7 +724,11 @@ static int do_strip(struct gfs2_inode *ip, struct buffer_head *dibh, ...@@ -724,7 +724,11 @@ static int do_strip(struct gfs2_inode *ip, struct buffer_head *dibh,
int metadata; int metadata;
unsigned int revokes = 0; unsigned int revokes = 0;
int x; int x;
int error = 0; int error;
error = gfs2_rindex_update(sdp);
if (error)
return error;
if (!*top) if (!*top)
sm->sm_first = 0; sm->sm_first = 0;
......
...@@ -1844,6 +1844,10 @@ static int leaf_dealloc(struct gfs2_inode *dip, u32 index, u32 len, ...@@ -1844,6 +1844,10 @@ static int leaf_dealloc(struct gfs2_inode *dip, u32 index, u32 len,
unsigned int x, size = len * sizeof(u64); unsigned int x, size = len * sizeof(u64);
int error; int error;
error = gfs2_rindex_update(sdp);
if (error)
return error;
memset(&rlist, 0, sizeof(struct gfs2_rgrp_list)); memset(&rlist, 0, sizeof(struct gfs2_rgrp_list));
ht = kzalloc(size, GFP_NOFS); ht = kzalloc(size, GFP_NOFS);
......
...@@ -1031,7 +1031,13 @@ static int gfs2_unlink(struct inode *dir, struct dentry *dentry) ...@@ -1031,7 +1031,13 @@ static int gfs2_unlink(struct inode *dir, struct dentry *dentry)
struct buffer_head *bh; struct buffer_head *bh;
struct gfs2_holder ghs[3]; struct gfs2_holder ghs[3];
struct gfs2_rgrpd *rgd; struct gfs2_rgrpd *rgd;
int error = -EROFS; int error;
error = gfs2_rindex_update(sdp);
if (error)
return error;
error = -EROFS;
gfs2_holder_init(dip->i_gl, LM_ST_EXCLUSIVE, 0, ghs); gfs2_holder_init(dip->i_gl, LM_ST_EXCLUSIVE, 0, ghs);
gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, ghs + 1); gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, ghs + 1);
...@@ -1224,6 +1230,10 @@ static int gfs2_rename(struct inode *odir, struct dentry *odentry, ...@@ -1224,6 +1230,10 @@ static int gfs2_rename(struct inode *odir, struct dentry *odentry,
return 0; return 0;
} }
error = gfs2_rindex_update(sdp);
if (error)
return error;
if (odip != ndip) { if (odip != ndip) {
error = gfs2_glock_nq_init(sdp->sd_rename_gl, LM_ST_EXCLUSIVE, error = gfs2_glock_nq_init(sdp->sd_rename_gl, LM_ST_EXCLUSIVE,
0, &r_gh); 0, &r_gh);
...@@ -1345,7 +1355,6 @@ static int gfs2_rename(struct inode *odir, struct dentry *odentry, ...@@ -1345,7 +1355,6 @@ static int gfs2_rename(struct inode *odir, struct dentry *odentry,
error = alloc_required; error = alloc_required;
if (error < 0) if (error < 0)
goto out_gunlock; goto out_gunlock;
error = 0;
if (alloc_required) { if (alloc_required) {
struct gfs2_qadata *qa = gfs2_qadata_get(ndip); struct gfs2_qadata *qa = gfs2_qadata_get(ndip);
......
...@@ -332,9 +332,6 @@ struct gfs2_rgrpd *gfs2_blk2rgrpd(struct gfs2_sbd *sdp, u64 blk, bool exact) ...@@ -332,9 +332,6 @@ struct gfs2_rgrpd *gfs2_blk2rgrpd(struct gfs2_sbd *sdp, u64 blk, bool exact)
struct rb_node *n, *next; struct rb_node *n, *next;
struct gfs2_rgrpd *cur; struct gfs2_rgrpd *cur;
if (gfs2_rindex_update(sdp))
return NULL;
spin_lock(&sdp->sd_rindex_spin); spin_lock(&sdp->sd_rindex_spin);
n = sdp->sd_rindex_tree.rb_node; n = sdp->sd_rindex_tree.rb_node;
while (n) { while (n) {
...@@ -640,6 +637,7 @@ static int read_rindex_entry(struct gfs2_inode *ip, ...@@ -640,6 +637,7 @@ static int read_rindex_entry(struct gfs2_inode *ip,
return 0; return 0;
error = 0; /* someone else read in the rgrp; free it and ignore it */ error = 0; /* someone else read in the rgrp; free it and ignore it */
gfs2_glock_put(rgd->rd_gl);
fail: fail:
kfree(rgd->rd_bits); kfree(rgd->rd_bits);
...@@ -927,6 +925,10 @@ int gfs2_fitrim(struct file *filp, void __user *argp) ...@@ -927,6 +925,10 @@ int gfs2_fitrim(struct file *filp, void __user *argp)
} else if (copy_from_user(&r, argp, sizeof(r))) } else if (copy_from_user(&r, argp, sizeof(r)))
return -EFAULT; return -EFAULT;
ret = gfs2_rindex_update(sdp);
if (ret)
return ret;
rgd = gfs2_blk2rgrpd(sdp, r.start, 0); rgd = gfs2_blk2rgrpd(sdp, r.start, 0);
rgd_end = gfs2_blk2rgrpd(sdp, r.start + r.len, 0); rgd_end = gfs2_blk2rgrpd(sdp, r.start + r.len, 0);
......
...@@ -238,6 +238,10 @@ static int ea_dealloc_unstuffed(struct gfs2_inode *ip, struct buffer_head *bh, ...@@ -238,6 +238,10 @@ static int ea_dealloc_unstuffed(struct gfs2_inode *ip, struct buffer_head *bh,
unsigned int x; unsigned int x;
int error; int error;
error = gfs2_rindex_update(sdp);
if (error)
return error;
if (GFS2_EA_IS_STUFFED(ea)) if (GFS2_EA_IS_STUFFED(ea))
return 0; return 0;
...@@ -1330,6 +1334,10 @@ static int ea_dealloc_indirect(struct gfs2_inode *ip) ...@@ -1330,6 +1334,10 @@ static int ea_dealloc_indirect(struct gfs2_inode *ip)
unsigned int x; unsigned int x;
int error; int error;
error = gfs2_rindex_update(sdp);
if (error)
return error;
memset(&rlist, 0, sizeof(struct gfs2_rgrp_list)); memset(&rlist, 0, sizeof(struct gfs2_rgrp_list));
error = gfs2_meta_read(ip->i_gl, ip->i_eattr, DIO_WAIT, &indbh); error = gfs2_meta_read(ip->i_gl, ip->i_eattr, DIO_WAIT, &indbh);
...@@ -1439,6 +1447,10 @@ static int ea_dealloc_block(struct gfs2_inode *ip) ...@@ -1439,6 +1447,10 @@ static int ea_dealloc_block(struct gfs2_inode *ip)
struct gfs2_holder gh; struct gfs2_holder gh;
int error; int error;
error = gfs2_rindex_update(sdp);
if (error)
return error;
rgd = gfs2_blk2rgrpd(sdp, ip->i_eattr, 1); rgd = gfs2_blk2rgrpd(sdp, ip->i_eattr, 1);
if (!rgd) { if (!rgd) {
gfs2_consist_inode(ip); gfs2_consist_inode(ip);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment