GFS2: Don't call file_accessed() with a shared glock
authorBenjamin Marzinski <bmarzins@redhat.com>
Tue, 6 Nov 2012 06:49:28 +0000 (00:49 -0600)
committerSteven Whitehouse <swhiteho@redhat.com>
Wed, 7 Nov 2012 09:42:49 +0000 (09:42 +0000)
commit3d1626889a64bd5a661544d582036a0a02104a60
tree7b5d43873e088346175d982fd8e840be586fcb5e
parent076f0faa764ab3a5a32fc726ae05e2de0e66151d
GFS2: Don't call file_accessed() with a shared glock

file_accessed() was being called by gfs2_mmap() with a shared glock. If it
needed to update the atime, it was crashing because it dirtied the inode in
gfs2_dirty_inode() without holding an exclusive lock. gfs2_dirty_inode()
checked if the caller was already holding a glock, but it didn't make sure that
the glock was in the exclusive state. Now, instead of calling file_accessed()
while holding the shared lock in gfs2_mmap(), file_accessed() is called after
grabbing and releasing the glock to update the inode.  If file_accessed() needs
to update the atime, it will grab an exclusive lock in gfs2_dirty_inode().

gfs2_dirty_inode() now also checks to make sure that if the calling process has
already locked the glock, it has an exclusive lock.

Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
fs/gfs2/file.c
fs/gfs2/super.c