diff options
Diffstat (limited to 'fs/gfs2/super.c')
| -rw-r--r-- | fs/gfs2/super.c | 34 | 
1 files changed, 13 insertions, 21 deletions
| diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c index b9dd3da22c0a..50aac606b990 100644 --- a/fs/gfs2/super.c +++ b/fs/gfs2/super.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/crc32.h> | 22 | #include <linux/crc32.h> | 
| 23 | #include <linux/time.h> | 23 | #include <linux/time.h> | 
| 24 | #include <linux/wait.h> | 24 | #include <linux/wait.h> | 
| 25 | #include <linux/writeback.h> | ||
| 25 | 26 | ||
| 26 | #include "gfs2.h" | 27 | #include "gfs2.h" | 
| 27 | #include "incore.h" | 28 | #include "incore.h" | 
| @@ -711,7 +712,7 @@ void gfs2_unfreeze_fs(struct gfs2_sbd *sdp) | |||
| 711 | * Returns: errno | 712 | * Returns: errno | 
| 712 | */ | 713 | */ | 
| 713 | 714 | ||
| 714 | static int gfs2_write_inode(struct inode *inode, int sync) | 715 | static int gfs2_write_inode(struct inode *inode, struct writeback_control *wbc) | 
| 715 | { | 716 | { | 
| 716 | struct gfs2_inode *ip = GFS2_I(inode); | 717 | struct gfs2_inode *ip = GFS2_I(inode); | 
| 717 | struct gfs2_sbd *sdp = GFS2_SB(inode); | 718 | struct gfs2_sbd *sdp = GFS2_SB(inode); | 
| @@ -722,8 +723,7 @@ static int gfs2_write_inode(struct inode *inode, int sync) | |||
| 722 | int ret = 0; | 723 | int ret = 0; | 
| 723 | 724 | ||
| 724 | /* Check this is a "normal" inode, etc */ | 725 | /* Check this is a "normal" inode, etc */ | 
| 725 | if (!test_bit(GIF_USER, &ip->i_flags) || | 726 | if (current->flags & PF_MEMALLOC) | 
| 726 | (current->flags & PF_MEMALLOC)) | ||
| 727 | return 0; | 727 | return 0; | 
| 728 | ret = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh); | 728 | ret = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh); | 
| 729 | if (ret) | 729 | if (ret) | 
| @@ -746,7 +746,7 @@ static int gfs2_write_inode(struct inode *inode, int sync) | |||
| 746 | do_unlock: | 746 | do_unlock: | 
| 747 | gfs2_glock_dq_uninit(&gh); | 747 | gfs2_glock_dq_uninit(&gh); | 
| 748 | do_flush: | 748 | do_flush: | 
| 749 | if (sync != 0) | 749 | if (wbc->sync_mode == WB_SYNC_ALL) | 
| 750 | gfs2_log_flush(GFS2_SB(inode), ip->i_gl); | 750 | gfs2_log_flush(GFS2_SB(inode), ip->i_gl); | 
| 751 | return ret; | 751 | return ret; | 
| 752 | } | 752 | } | 
| @@ -764,7 +764,7 @@ static int gfs2_make_fs_ro(struct gfs2_sbd *sdp) | |||
| 764 | int error; | 764 | int error; | 
| 765 | 765 | ||
| 766 | flush_workqueue(gfs2_delete_workqueue); | 766 | flush_workqueue(gfs2_delete_workqueue); | 
| 767 | gfs2_quota_sync(sdp->sd_vfs, 0); | 767 | gfs2_quota_sync(sdp->sd_vfs, 0, 1); | 
| 768 | gfs2_statfs_sync(sdp->sd_vfs, 0); | 768 | gfs2_statfs_sync(sdp->sd_vfs, 0); | 
| 769 | 769 | ||
| 770 | error = gfs2_glock_nq_init(sdp->sd_trans_gl, LM_ST_SHARED, GL_NOCACHE, | 770 | error = gfs2_glock_nq_init(sdp->sd_trans_gl, LM_ST_SHARED, GL_NOCACHE, | 
| @@ -860,6 +860,7 @@ restart: | |||
| 860 | gfs2_clear_rgrpd(sdp); | 860 | gfs2_clear_rgrpd(sdp); | 
| 861 | gfs2_jindex_free(sdp); | 861 | gfs2_jindex_free(sdp); | 
| 862 | /* Take apart glock structures and buffer lists */ | 862 | /* Take apart glock structures and buffer lists */ | 
| 863 | invalidate_inodes(sdp->sd_vfs); | ||
| 863 | gfs2_gl_hash_clear(sdp); | 864 | gfs2_gl_hash_clear(sdp); | 
| 864 | /* Unmount the locking protocol */ | 865 | /* Unmount the locking protocol */ | 
| 865 | gfs2_lm_unmount(sdp); | 866 | gfs2_lm_unmount(sdp); | 
| @@ -1194,7 +1195,7 @@ static void gfs2_drop_inode(struct inode *inode) | |||
| 1194 | { | 1195 | { | 
| 1195 | struct gfs2_inode *ip = GFS2_I(inode); | 1196 | struct gfs2_inode *ip = GFS2_I(inode); | 
| 1196 | 1197 | ||
| 1197 | if (test_bit(GIF_USER, &ip->i_flags) && inode->i_nlink) { | 1198 | if (inode->i_nlink) { | 
| 1198 | struct gfs2_glock *gl = ip->i_iopen_gh.gh_gl; | 1199 | struct gfs2_glock *gl = ip->i_iopen_gh.gh_gl; | 
| 1199 | if (gl && test_bit(GLF_DEMOTE, &gl->gl_flags)) | 1200 | if (gl && test_bit(GLF_DEMOTE, &gl->gl_flags)) | 
| 1200 | clear_nlink(inode); | 1201 | clear_nlink(inode); | 
| @@ -1212,18 +1213,12 @@ static void gfs2_clear_inode(struct inode *inode) | |||
| 1212 | { | 1213 | { | 
| 1213 | struct gfs2_inode *ip = GFS2_I(inode); | 1214 | struct gfs2_inode *ip = GFS2_I(inode); | 
| 1214 | 1215 | ||
| 1215 | /* This tells us its a "real" inode and not one which only | 1216 | ip->i_gl->gl_object = NULL; | 
| 1216 | * serves to contain an address space (see rgrp.c, meta_io.c) | 1217 | gfs2_glock_put(ip->i_gl); | 
| 1217 | * which therefore doesn't have its own glocks. | 1218 | ip->i_gl = NULL; | 
| 1218 | */ | 1219 | if (ip->i_iopen_gh.gh_gl) { | 
| 1219 | if (test_bit(GIF_USER, &ip->i_flags)) { | 1220 | ip->i_iopen_gh.gh_gl->gl_object = NULL; | 
| 1220 | ip->i_gl->gl_object = NULL; | 1221 | gfs2_glock_dq_uninit(&ip->i_iopen_gh); | 
| 1221 | gfs2_glock_put(ip->i_gl); | ||
| 1222 | ip->i_gl = NULL; | ||
| 1223 | if (ip->i_iopen_gh.gh_gl) { | ||
| 1224 | ip->i_iopen_gh.gh_gl->gl_object = NULL; | ||
| 1225 | gfs2_glock_dq_uninit(&ip->i_iopen_gh); | ||
| 1226 | } | ||
| 1227 | } | 1222 | } | 
| 1228 | } | 1223 | } | 
| 1229 | 1224 | ||
| @@ -1358,9 +1353,6 @@ static void gfs2_delete_inode(struct inode *inode) | |||
| 1358 | struct gfs2_holder gh; | 1353 | struct gfs2_holder gh; | 
| 1359 | int error; | 1354 | int error; | 
| 1360 | 1355 | ||
| 1361 | if (!test_bit(GIF_USER, &ip->i_flags)) | ||
| 1362 | goto out; | ||
| 1363 | |||
| 1364 | error = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh); | 1356 | error = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh); | 
| 1365 | if (unlikely(error)) { | 1357 | if (unlikely(error)) { | 
| 1366 | gfs2_glock_dq_uninit(&ip->i_iopen_gh); | 1358 | gfs2_glock_dq_uninit(&ip->i_iopen_gh); | 
