1
0
Fork 0
alistair23-linux/fs/gfs2
Steven Whitehouse 044b9414c7 GFS2: Fix inode deallocation race
This area of the code has always been a bit delicate due to the
subtleties of lock ordering. The problem is that for "normal"
alloc/dealloc, we always grab the inode locks first and the rgrp lock
later.

In order to ensure no races in looking up the unlinked, but still
allocated inodes, we need to hold the rgrp lock when we do the lookup,
which means that we can't take the inode glock.

The solution is to borrow the technique already used by NFS to solve
what is essentially the same problem (given an inode number, look up
the inode carefully, checking that it really is in the expected
state).

We cannot do that directly from the allocation code (lock ordering
again) so we give the job to the pre-existing delete workqueue and
carry on with the allocation as normal.

If we find there is no space, we do a journal flush (required anyway
if space from a deallocation is to be released) which should block
against the pending deallocations, so we should always get the space
back.

Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
2010-11-15 12:44:42 +00:00
..
Kconfig GFS2: No longer experimental 2010-09-20 11:18:46 +01:00
Makefile GFS2: Rename eattr.[ch] as xattr.[ch] 2009-08-26 18:51:04 +01:00
acl.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-2.6-fixes 2010-05-25 08:17:51 -07:00
acl.h gfs: constify xattr_handler 2010-05-21 18:31:20 -04:00
aops.c fs: kill block_prepare_write 2010-10-25 21:18:20 -04:00
bmap.c GFS2: reserve more blocks for transactions 2010-09-28 09:44:24 +01:00
bmap.h GFS2: New truncate sequence 2010-09-20 11:18:16 +01:00
dentry.c GFS2: Remove localcaching mount option 2010-09-23 14:00:31 +01:00
dir.c GFS2: Make . and .. qstrs constant 2010-09-20 11:21:09 +01:00
dir.h GFS2: Make . and .. qstrs constant 2010-09-20 11:21:09 +01:00
export.c GFS2: Fix inode deallocation race 2010-11-15 12:44:42 +00:00
file.c locks: let the caller free file_lock on ->setlease failure 2010-10-31 06:35:15 -07:00
gfs2.h [GFS2] Remove remote lock dropping code 2008-06-27 09:39:44 +01:00
glock.c GFS2: Fix inode deallocation race 2010-11-15 12:44:42 +00:00
glock.h GFS2: fixed typo 2010-10-18 14:38:07 +01:00
glops.c GFS2: Fix type mapping for demote_rq interface 2010-10-06 09:58:44 +01:00
glops.h GFS2: Add a "demote a glock" interface to sysfs 2009-03-24 11:21:22 +00:00
incore.h GFS2: Improve journal allocation via sysfs 2010-09-29 15:04:18 +01:00
inode.c GFS2: Fix inode deallocation race 2010-11-15 12:44:42 +00:00
inode.h GFS2: Fix inode deallocation race 2010-11-15 12:44:42 +00:00
lock_dlm.c GFS2: Update handling of DLM return codes to match reality 2010-09-20 11:20:12 +01:00
log.c Merge branch 'v2.6.36-rc8' into for-2.6.37/barrier 2010-10-19 09:13:04 +02:00
log.h GFS2: Rework reclaiming unlinked dinodes 2010-05-21 16:11:36 +01:00
lops.c GFS2: Various gfs2_logd improvements 2010-05-05 09:39:18 +01:00
lops.h [GFS2] Only do lo_incore_commit once 2008-03-31 10:39:54 +01:00
main.c Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq 2010-10-22 17:13:10 -07:00
meta_io.c writeback: remove nonblocking/encountered_congestion references 2010-10-26 16:52:05 -07:00
meta_io.h GFS2: Metadata address space clean up 2010-03-01 14:07:37 +00:00
ops_fstype.c convert gfs2 2010-10-29 04:17:16 -04:00
ops_inode.c new helper: ihold() 2010-10-25 21:26:11 -04:00
quota.c GFS2: reserve more blocks for transactions 2010-09-28 09:44:24 +01:00
quota.h mm: add context argument to shrinker callback 2010-07-19 14:56:17 +10:00
recovery.c GFS2: Fix spectator umount issue 2010-09-29 14:20:52 +01:00
recovery.h gfs2: use workqueue instead of slow-work 2010-07-23 13:14:25 +02:00
rgrp.c GFS2: Fix inode deallocation race 2010-11-15 12:44:42 +00:00
rgrp.h GFS2 fatal: filesystem consistency error on rename 2010-09-30 17:23:03 +01:00
super.c gfs2: invalidate_inodes() is no-op there 2010-10-25 21:23:01 -04:00
super.h gfs: constify xattr_handler 2010-05-21 18:31:20 -04:00
sys.c GFS2: Fix type mapping for demote_rq interface 2010-10-06 09:58:44 +01:00
sys.h GFS2: Remove ancient, unused code 2009-01-05 07:39:13 +00:00
trace_gfs2.h GFS2: Don't enforce min hold time when two demotes occur in rapid succession 2010-09-20 11:19:50 +01:00
trans.c GFS2: Various gfs2_logd improvements 2010-05-05 09:39:18 +01:00
trans.h GFS2: reserve more blocks for transactions 2010-09-28 09:44:24 +01:00
util.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
util.h GFS2: Metadata address space clean up 2010-03-01 14:07:37 +00:00
xattr.c GFS2: reserve more blocks for transactions 2010-09-28 09:44:24 +01:00
xattr.h sanitize xattr handler prototypes 2009-12-16 12:16:49 -05:00