diff options
author | Josef Bacik <jbacik@redhat.com> | 2008-04-09 09:33:41 -0400 |
---|---|---|
committer | Steven Whitehouse <swhiteho@redhat.com> | 2008-04-10 04:55:26 -0400 |
commit | 16c5f06f15ad4e5a5d6e90b78ffb1ac14319e445 (patch) | |
tree | 84204e44e0246e9a3f4db23223a5209105fde368 | |
parent | 773adff8e983cba1f5844c3be3be224ca6645f26 (diff) |
[GFS2] fix GFP_KERNEL misuses
There are several places where GFP_KERNEL allocations happen under a glock,
which will result in hangs if we're under memory pressure and go to re-enter the
fs in order to flush stuff out. This patch changes the culprits to GFS_NOFS to
keep this problem from happening. Thank you,
Signed-off-by: Josef Bacik <jbacik@redhat.com>
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
-rw-r--r-- | fs/gfs2/acl.c | 6 | ||||
-rw-r--r-- | fs/gfs2/dir.c | 10 | ||||
-rw-r--r-- | fs/gfs2/eattr.c | 4 | ||||
-rw-r--r-- | fs/gfs2/inode.c | 2 | ||||
-rw-r--r-- | fs/gfs2/locking/dlm/lock.c | 4 | ||||
-rw-r--r-- | fs/gfs2/locking/nolock/main.c | 2 | ||||
-rw-r--r-- | fs/gfs2/quota.c | 8 | ||||
-rw-r--r-- | fs/gfs2/recovery.c | 2 | ||||
-rw-r--r-- | fs/gfs2/super.c | 4 |
9 files changed, 21 insertions, 21 deletions
diff --git a/fs/gfs2/acl.c b/fs/gfs2/acl.c index 1047a8c7226a..3e9bd46f27e3 100644 --- a/fs/gfs2/acl.c +++ b/fs/gfs2/acl.c | |||
@@ -116,7 +116,7 @@ static int acl_get(struct gfs2_inode *ip, int access, struct posix_acl **acl, | |||
116 | goto out; | 116 | goto out; |
117 | 117 | ||
118 | er.er_data_len = GFS2_EA_DATA_LEN(el->el_ea); | 118 | er.er_data_len = GFS2_EA_DATA_LEN(el->el_ea); |
119 | er.er_data = kmalloc(er.er_data_len, GFP_KERNEL); | 119 | er.er_data = kmalloc(er.er_data_len, GFP_NOFS); |
120 | error = -ENOMEM; | 120 | error = -ENOMEM; |
121 | if (!er.er_data) | 121 | if (!er.er_data) |
122 | goto out; | 122 | goto out; |
@@ -222,7 +222,7 @@ int gfs2_acl_create(struct gfs2_inode *dip, struct gfs2_inode *ip) | |||
222 | return error; | 222 | return error; |
223 | } | 223 | } |
224 | 224 | ||
225 | clone = posix_acl_clone(acl, GFP_KERNEL); | 225 | clone = posix_acl_clone(acl, GFP_NOFS); |
226 | error = -ENOMEM; | 226 | error = -ENOMEM; |
227 | if (!clone) | 227 | if (!clone) |
228 | goto out; | 228 | goto out; |
@@ -272,7 +272,7 @@ int gfs2_acl_chmod(struct gfs2_inode *ip, struct iattr *attr) | |||
272 | if (!acl) | 272 | if (!acl) |
273 | return gfs2_setattr_simple(ip, attr); | 273 | return gfs2_setattr_simple(ip, attr); |
274 | 274 | ||
275 | clone = posix_acl_clone(acl, GFP_KERNEL); | 275 | clone = posix_acl_clone(acl, GFP_NOFS); |
276 | error = -ENOMEM; | 276 | error = -ENOMEM; |
277 | if (!clone) | 277 | if (!clone) |
278 | goto out; | 278 | goto out; |
diff --git a/fs/gfs2/dir.c b/fs/gfs2/dir.c index 94070ad8826b..eed040d8ba3a 100644 --- a/fs/gfs2/dir.c +++ b/fs/gfs2/dir.c | |||
@@ -1089,7 +1089,7 @@ static int dir_double_exhash(struct gfs2_inode *dip) | |||
1089 | 1089 | ||
1090 | /* Allocate both the "from" and "to" buffers in one big chunk */ | 1090 | /* Allocate both the "from" and "to" buffers in one big chunk */ |
1091 | 1091 | ||
1092 | buf = kcalloc(3, sdp->sd_hash_bsize, GFP_KERNEL | __GFP_NOFAIL); | 1092 | buf = kcalloc(3, sdp->sd_hash_bsize, GFP_NOFS | __GFP_NOFAIL); |
1093 | 1093 | ||
1094 | for (block = dip->i_di.di_size >> sdp->sd_hash_bsize_shift; block--;) { | 1094 | for (block = dip->i_di.di_size >> sdp->sd_hash_bsize_shift; block--;) { |
1095 | error = gfs2_dir_read_data(dip, (char *)buf, | 1095 | error = gfs2_dir_read_data(dip, (char *)buf, |
@@ -1378,7 +1378,7 @@ static int dir_e_read(struct inode *inode, u64 *offset, void *opaque, | |||
1378 | hash = gfs2_dir_offset2hash(*offset); | 1378 | hash = gfs2_dir_offset2hash(*offset); |
1379 | index = hash >> (32 - dip->i_depth); | 1379 | index = hash >> (32 - dip->i_depth); |
1380 | 1380 | ||
1381 | lp = kmalloc(sdp->sd_hash_bsize, GFP_KERNEL); | 1381 | lp = kmalloc(sdp->sd_hash_bsize, GFP_NOFS); |
1382 | if (!lp) | 1382 | if (!lp) |
1383 | return -ENOMEM; | 1383 | return -ENOMEM; |
1384 | 1384 | ||
@@ -1443,7 +1443,7 @@ int gfs2_dir_read(struct inode *inode, u64 *offset, void *opaque, | |||
1443 | 1443 | ||
1444 | error = -ENOMEM; | 1444 | error = -ENOMEM; |
1445 | /* 96 is max number of dirents which can be stuffed into an inode */ | 1445 | /* 96 is max number of dirents which can be stuffed into an inode */ |
1446 | darr = kmalloc(96 * sizeof(struct gfs2_dirent *), GFP_KERNEL); | 1446 | darr = kmalloc(96 * sizeof(struct gfs2_dirent *), GFP_NOFS); |
1447 | if (darr) { | 1447 | if (darr) { |
1448 | g.pdent = darr; | 1448 | g.pdent = darr; |
1449 | g.offset = 0; | 1449 | g.offset = 0; |
@@ -1789,7 +1789,7 @@ static int foreach_leaf(struct gfs2_inode *dip, leaf_call_t lc, void *data) | |||
1789 | return -EIO; | 1789 | return -EIO; |
1790 | } | 1790 | } |
1791 | 1791 | ||
1792 | lp = kmalloc(sdp->sd_hash_bsize, GFP_KERNEL); | 1792 | lp = kmalloc(sdp->sd_hash_bsize, GFP_NOFS); |
1793 | if (!lp) | 1793 | if (!lp) |
1794 | return -ENOMEM; | 1794 | return -ENOMEM; |
1795 | 1795 | ||
@@ -1864,7 +1864,7 @@ static int leaf_dealloc(struct gfs2_inode *dip, u32 index, u32 len, | |||
1864 | 1864 | ||
1865 | memset(&rlist, 0, sizeof(struct gfs2_rgrp_list)); | 1865 | memset(&rlist, 0, sizeof(struct gfs2_rgrp_list)); |
1866 | 1866 | ||
1867 | ht = kzalloc(size, GFP_KERNEL); | 1867 | ht = kzalloc(size, GFP_NOFS); |
1868 | if (!ht) | 1868 | if (!ht) |
1869 | return -ENOMEM; | 1869 | return -ENOMEM; |
1870 | 1870 | ||
diff --git a/fs/gfs2/eattr.c b/fs/gfs2/eattr.c index 81755925a755..e3f76f451b0a 100644 --- a/fs/gfs2/eattr.c +++ b/fs/gfs2/eattr.c | |||
@@ -448,7 +448,7 @@ static int ea_get_unstuffed(struct gfs2_inode *ip, struct gfs2_ea_header *ea, | |||
448 | unsigned int x; | 448 | unsigned int x; |
449 | int error = 0; | 449 | int error = 0; |
450 | 450 | ||
451 | bh = kcalloc(nptrs, sizeof(struct buffer_head *), GFP_KERNEL); | 451 | bh = kcalloc(nptrs, sizeof(struct buffer_head *), GFP_NOFS); |
452 | if (!bh) | 452 | if (!bh) |
453 | return -ENOMEM; | 453 | return -ENOMEM; |
454 | 454 | ||
@@ -1206,7 +1206,7 @@ static int ea_acl_chmod_unstuffed(struct gfs2_inode *ip, | |||
1206 | unsigned int x; | 1206 | unsigned int x; |
1207 | int error; | 1207 | int error; |
1208 | 1208 | ||
1209 | bh = kcalloc(nptrs, sizeof(struct buffer_head *), GFP_KERNEL); | 1209 | bh = kcalloc(nptrs, sizeof(struct buffer_head *), GFP_NOFS); |
1210 | if (!bh) | 1210 | if (!bh) |
1211 | return -ENOMEM; | 1211 | return -ENOMEM; |
1212 | 1212 | ||
diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c index dcae2aa83f13..3a9ef526c308 100644 --- a/fs/gfs2/inode.c +++ b/fs/gfs2/inode.c | |||
@@ -1231,7 +1231,7 @@ int gfs2_readlinki(struct gfs2_inode *ip, char **buf, unsigned int *len) | |||
1231 | 1231 | ||
1232 | x = ip->i_di.di_size + 1; | 1232 | x = ip->i_di.di_size + 1; |
1233 | if (x > *len) { | 1233 | if (x > *len) { |
1234 | *buf = kmalloc(x, GFP_KERNEL); | 1234 | *buf = kmalloc(x, GFP_NOFS); |
1235 | if (!*buf) { | 1235 | if (!*buf) { |
1236 | error = -ENOMEM; | 1236 | error = -ENOMEM; |
1237 | goto out_brelse; | 1237 | goto out_brelse; |
diff --git a/fs/gfs2/locking/dlm/lock.c b/fs/gfs2/locking/dlm/lock.c index 53a6ab3c0919..cf7ea8abec87 100644 --- a/fs/gfs2/locking/dlm/lock.c +++ b/fs/gfs2/locking/dlm/lock.c | |||
@@ -165,7 +165,7 @@ static int gdlm_create_lp(struct gdlm_ls *ls, struct lm_lockname *name, | |||
165 | { | 165 | { |
166 | struct gdlm_lock *lp; | 166 | struct gdlm_lock *lp; |
167 | 167 | ||
168 | lp = kzalloc(sizeof(struct gdlm_lock), GFP_KERNEL); | 168 | lp = kzalloc(sizeof(struct gdlm_lock), GFP_NOFS); |
169 | if (!lp) | 169 | if (!lp) |
170 | return -ENOMEM; | 170 | return -ENOMEM; |
171 | 171 | ||
@@ -383,7 +383,7 @@ static int gdlm_add_lvb(struct gdlm_lock *lp) | |||
383 | { | 383 | { |
384 | char *lvb; | 384 | char *lvb; |
385 | 385 | ||
386 | lvb = kzalloc(GDLM_LVB_SIZE, GFP_KERNEL); | 386 | lvb = kzalloc(GDLM_LVB_SIZE, GFP_NOFS); |
387 | if (!lvb) | 387 | if (!lvb) |
388 | return -ENOMEM; | 388 | return -ENOMEM; |
389 | 389 | ||
diff --git a/fs/gfs2/locking/nolock/main.c b/fs/gfs2/locking/nolock/main.c index d3b8ce6fbbe3..284a5ece8d94 100644 --- a/fs/gfs2/locking/nolock/main.c +++ b/fs/gfs2/locking/nolock/main.c | |||
@@ -140,7 +140,7 @@ static int nolock_hold_lvb(void *lock, char **lvbp) | |||
140 | struct nolock_lockspace *nl = lock; | 140 | struct nolock_lockspace *nl = lock; |
141 | int error = 0; | 141 | int error = 0; |
142 | 142 | ||
143 | *lvbp = kzalloc(nl->nl_lvb_size, GFP_KERNEL); | 143 | *lvbp = kzalloc(nl->nl_lvb_size, GFP_NOFS); |
144 | if (!*lvbp) | 144 | if (!*lvbp) |
145 | error = -ENOMEM; | 145 | error = -ENOMEM; |
146 | 146 | ||
diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c index c71f781db5d7..56aaf915c59a 100644 --- a/fs/gfs2/quota.c +++ b/fs/gfs2/quota.c | |||
@@ -94,7 +94,7 @@ static int qd_alloc(struct gfs2_sbd *sdp, int user, u32 id, | |||
94 | struct gfs2_quota_data *qd; | 94 | struct gfs2_quota_data *qd; |
95 | int error; | 95 | int error; |
96 | 96 | ||
97 | qd = kzalloc(sizeof(struct gfs2_quota_data), GFP_KERNEL); | 97 | qd = kzalloc(sizeof(struct gfs2_quota_data), GFP_NOFS); |
98 | if (!qd) | 98 | if (!qd) |
99 | return -ENOMEM; | 99 | return -ENOMEM; |
100 | 100 | ||
@@ -690,7 +690,7 @@ static int do_sync(unsigned int num_qd, struct gfs2_quota_data **qda) | |||
690 | gfs2_write_calc_reserv(ip, sizeof(struct gfs2_quota), | 690 | gfs2_write_calc_reserv(ip, sizeof(struct gfs2_quota), |
691 | &data_blocks, &ind_blocks); | 691 | &data_blocks, &ind_blocks); |
692 | 692 | ||
693 | ghs = kcalloc(num_qd, sizeof(struct gfs2_holder), GFP_KERNEL); | 693 | ghs = kcalloc(num_qd, sizeof(struct gfs2_holder), GFP_NOFS); |
694 | if (!ghs) | 694 | if (!ghs) |
695 | return -ENOMEM; | 695 | return -ENOMEM; |
696 | 696 | ||
@@ -1118,12 +1118,12 @@ int gfs2_quota_init(struct gfs2_sbd *sdp) | |||
1118 | error = -ENOMEM; | 1118 | error = -ENOMEM; |
1119 | 1119 | ||
1120 | sdp->sd_quota_bitmap = kcalloc(sdp->sd_quota_chunks, | 1120 | sdp->sd_quota_bitmap = kcalloc(sdp->sd_quota_chunks, |
1121 | sizeof(unsigned char *), GFP_KERNEL); | 1121 | sizeof(unsigned char *), GFP_NOFS); |
1122 | if (!sdp->sd_quota_bitmap) | 1122 | if (!sdp->sd_quota_bitmap) |
1123 | return error; | 1123 | return error; |
1124 | 1124 | ||
1125 | for (x = 0; x < sdp->sd_quota_chunks; x++) { | 1125 | for (x = 0; x < sdp->sd_quota_chunks; x++) { |
1126 | sdp->sd_quota_bitmap[x] = kzalloc(PAGE_SIZE, GFP_KERNEL); | 1126 | sdp->sd_quota_bitmap[x] = kzalloc(PAGE_SIZE, GFP_NOFS); |
1127 | if (!sdp->sd_quota_bitmap[x]) | 1127 | if (!sdp->sd_quota_bitmap[x]) |
1128 | goto fail; | 1128 | goto fail; |
1129 | } | 1129 | } |
diff --git a/fs/gfs2/recovery.c b/fs/gfs2/recovery.c index 06dcdc04627d..2888e4b4b1c5 100644 --- a/fs/gfs2/recovery.c +++ b/fs/gfs2/recovery.c | |||
@@ -68,7 +68,7 @@ int gfs2_revoke_add(struct gfs2_sbd *sdp, u64 blkno, unsigned int where) | |||
68 | return 0; | 68 | return 0; |
69 | } | 69 | } |
70 | 70 | ||
71 | rr = kmalloc(sizeof(struct gfs2_revoke_replay), GFP_KERNEL); | 71 | rr = kmalloc(sizeof(struct gfs2_revoke_replay), GFP_NOFS); |
72 | if (!rr) | 72 | if (!rr) |
73 | return -ENOMEM; | 73 | return -ENOMEM; |
74 | 74 | ||
diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c index 88497b0b7339..7aeacbc65f35 100644 --- a/fs/gfs2/super.c +++ b/fs/gfs2/super.c | |||
@@ -210,7 +210,7 @@ int gfs2_read_super(struct gfs2_sbd *sdp, sector_t sector) | |||
210 | struct page *page; | 210 | struct page *page; |
211 | struct bio *bio; | 211 | struct bio *bio; |
212 | 212 | ||
213 | page = alloc_page(GFP_KERNEL); | 213 | page = alloc_page(GFP_NOFS); |
214 | if (unlikely(!page)) | 214 | if (unlikely(!page)) |
215 | return -ENOBUFS; | 215 | return -ENOBUFS; |
216 | 216 | ||
@@ -218,7 +218,7 @@ int gfs2_read_super(struct gfs2_sbd *sdp, sector_t sector) | |||
218 | ClearPageDirty(page); | 218 | ClearPageDirty(page); |
219 | lock_page(page); | 219 | lock_page(page); |
220 | 220 | ||
221 | bio = bio_alloc(GFP_KERNEL, 1); | 221 | bio = bio_alloc(GFP_NOFS, 1); |
222 | if (unlikely(!bio)) { | 222 | if (unlikely(!bio)) { |
223 | __free_page(page); | 223 | __free_page(page); |
224 | return -ENOBUFS; | 224 | return -ENOBUFS; |