hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/fs/gfs2/dir.c
....@@ -1,10 +1,7 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
34 * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved.
4
- *
5
- * This copyrighted material is made available to anyone wishing to use,
6
- * modify, copy, or redistribute it subject to the terms and conditions
7
- * of the GNU General Public License version 2.
85 */
96
107 /*
....@@ -75,9 +72,6 @@
7572 #include "trans.h"
7673 #include "bmap.h"
7774 #include "util.h"
78
-
79
-#define IS_LEAF 1 /* Hashed (leaf) directory */
80
-#define IS_DINODE 2 /* Linear (stuffed dinode block) directory */
8175
8276 #define MAX_RA_BLOCKS 32 /* max read-ahead blocks */
8377
....@@ -360,7 +354,7 @@
360354
361355 hc = kmalloc(hsize, GFP_NOFS | __GFP_NOWARN);
362356 if (hc == NULL)
363
- hc = __vmalloc(hsize, GFP_NOFS, PAGE_KERNEL);
357
+ hc = __vmalloc(hsize, GFP_NOFS);
364358
365359 if (hc == NULL)
366360 return ERR_PTR(-ENOMEM);
....@@ -506,7 +500,8 @@
506500 * For now the most important thing is to check that the various sizes
507501 * are correct.
508502 */
509
-static int gfs2_check_dirent(struct gfs2_dirent *dent, unsigned int offset,
503
+static int gfs2_check_dirent(struct gfs2_sbd *sdp,
504
+ struct gfs2_dirent *dent, unsigned int offset,
510505 unsigned int size, unsigned int len, int first)
511506 {
512507 const char *msg = "gfs2_dirent too small";
....@@ -528,12 +523,12 @@
528523 goto error;
529524 return 0;
530525 error:
531
- pr_warn("%s: %s (%s)\n",
526
+ fs_warn(sdp, "%s: %s (%s)\n",
532527 __func__, msg, first ? "first in block" : "not first in block");
533528 return -EIO;
534529 }
535530
536
-static int gfs2_dirent_offset(const void *buf)
531
+static int gfs2_dirent_offset(struct gfs2_sbd *sdp, const void *buf)
537532 {
538533 const struct gfs2_meta_header *h = buf;
539534 int offset;
....@@ -552,7 +547,8 @@
552547 }
553548 return offset;
554549 wrong_type:
555
- pr_warn("%s: wrong block type %u\n", __func__, be32_to_cpu(h->mh_type));
550
+ fs_warn(sdp, "%s: wrong block type %u\n", __func__,
551
+ be32_to_cpu(h->mh_type));
556552 return -1;
557553 }
558554
....@@ -566,7 +562,7 @@
566562 unsigned size;
567563 int ret = 0;
568564
569
- ret = gfs2_dirent_offset(buf);
565
+ ret = gfs2_dirent_offset(GFS2_SB(inode), buf);
570566 if (ret < 0)
571567 goto consist_inode;
572568
....@@ -574,7 +570,7 @@
574570 prev = NULL;
575571 dent = buf + offset;
576572 size = be16_to_cpu(dent->de_rec_len);
577
- if (gfs2_check_dirent(dent, offset, size, len, 1))
573
+ if (gfs2_check_dirent(GFS2_SB(inode), dent, offset, size, len, 1))
578574 goto consist_inode;
579575 do {
580576 ret = scan(dent, name, opaque);
....@@ -586,7 +582,8 @@
586582 prev = dent;
587583 dent = buf + offset;
588584 size = be16_to_cpu(dent->de_rec_len);
589
- if (gfs2_check_dirent(dent, offset, size, len, 0))
585
+ if (gfs2_check_dirent(GFS2_SB(inode), dent, offset, size,
586
+ len, 0))
590587 goto consist_inode;
591588 } while(1);
592589
....@@ -750,7 +747,7 @@
750747 struct gfs2_dirent *dent;
751748 dent = gfs2_dirent_scan(inode, bh->b_data, bh->b_size,
752749 gfs2_dirent_find_offset, name, ptr);
753
- if (!dent || IS_ERR(dent))
750
+ if (IS_ERR_OR_NULL(dent))
754751 return dent;
755752 return do_init_dirent(inode, dent, name, bh,
756753 (unsigned)(ptr - (void *)dent));
....@@ -854,7 +851,7 @@
854851 return ERR_PTR(error);
855852 dent = gfs2_dirent_scan(inode, bh->b_data, bh->b_size, scan, name, NULL);
856853 got_dent:
857
- if (unlikely(dent == NULL || IS_ERR(dent))) {
854
+ if (IS_ERR_OR_NULL(dent)) {
858855 brelse(bh);
859856 bh = NULL;
860857 }
....@@ -880,7 +877,7 @@
880877 if (!bh)
881878 return NULL;
882879
883
- gfs2_trans_add_unrevoke(GFS2_SB(inode), bn, 1);
880
+ gfs2_trans_remove_revoke(GFS2_SB(inode), bn, 1);
884881 gfs2_trans_add_meta(ip->i_gl, bh);
885882 gfs2_metatype_set(bh, GFS2_METATYPE_LF, GFS2_FORMAT_LF);
886883 leaf = (struct gfs2_leaf *)bh->b_data;
....@@ -1043,7 +1040,7 @@
10431040 len = BIT(dip->i_depth - be16_to_cpu(oleaf->lf_depth));
10441041 half_len = len >> 1;
10451042 if (!half_len) {
1046
- pr_warn("i_depth %u lf_depth %u index %u\n",
1043
+ fs_warn(GFS2_SB(inode), "i_depth %u lf_depth %u index %u\n",
10471044 dip->i_depth, be16_to_cpu(oleaf->lf_depth), index);
10481045 gfs2_consist_inode(dip);
10491046 error = -EIO;
....@@ -1169,7 +1166,7 @@
11691166
11701167 hc2 = kmalloc_array(hsize_bytes, 2, GFP_NOFS | __GFP_NOWARN);
11711168 if (hc2 == NULL)
1172
- hc2 = __vmalloc(hsize_bytes * 2, GFP_NOFS, PAGE_KERNEL);
1169
+ hc2 = __vmalloc(hsize_bytes * 2, GFP_NOFS);
11731170
11741171 if (!hc2)
11751172 return -ENOMEM;
....@@ -1330,7 +1327,7 @@
13301327 if (size < KMALLOC_MAX_SIZE)
13311328 ptr = kmalloc(size, GFP_NOFS | __GFP_NOWARN);
13321329 if (!ptr)
1333
- ptr = __vmalloc(size, GFP_NOFS, PAGE_KERNEL);
1330
+ ptr = __vmalloc(size, GFP_NOFS);
13341331 return ptr;
13351332 }
13361333
....@@ -1351,7 +1348,7 @@
13511348 if (!sdp->sd_args.ar_loccookie)
13521349 continue;
13531350 offset = (char *)(darr[i]) -
1354
- (bh->b_data + gfs2_dirent_offset(bh->b_data));
1351
+ (bh->b_data + gfs2_dirent_offset(sdp, bh->b_data));
13551352 offset /= GFS2_MIN_DIRENT_SIZE;
13561353 offset += leaf_nr * sdp->sd_max_dents_per_leaf;
13571354 if (offset >= GFS2_USE_HASH_FLAG ||
....@@ -1463,8 +1460,7 @@
14631460 sort_offset : entries, copied);
14641461 out_free:
14651462 for(i = 0; i < leaf; i++)
1466
- if (larr[i])
1467
- brelse(larr[i]);
1463
+ brelse(larr[i]);
14681464 kvfree(larr);
14691465 out:
14701466 return error;
....@@ -1991,8 +1987,7 @@
19911987
19921988 ht = kzalloc(size, GFP_NOFS | __GFP_NOWARN);
19931989 if (ht == NULL)
1994
- ht = __vmalloc(size, GFP_NOFS | __GFP_NOWARN | __GFP_ZERO,
1995
- PAGE_KERNEL);
1990
+ ht = __vmalloc(size, GFP_NOFS | __GFP_NOWARN | __GFP_ZERO);
19961991 if (!ht)
19971992 return -ENOMEM;
19981993
....@@ -2018,7 +2013,7 @@
20182013 l_blocks++;
20192014 }
20202015
2021
- gfs2_rlist_alloc(&rlist, LM_ST_EXCLUSIVE);
2016
+ gfs2_rlist_alloc(&rlist);
20222017
20232018 for (x = 0; x < rlist.rl_rgrps; x++) {
20242019 struct gfs2_rgrpd *rgd = gfs2_glock2rgrp(rlist.rl_ghs[x].gh_gl);
....@@ -2032,13 +2027,16 @@
20322027
20332028 error = gfs2_trans_begin(sdp,
20342029 rg_blocks + (DIV_ROUND_UP(size, sdp->sd_jbsize) + 1) +
2035
- RES_DINODE + RES_STATFS + RES_QUOTA, l_blocks);
2030
+ RES_DINODE + RES_STATFS + RES_QUOTA, RES_DINODE +
2031
+ l_blocks);
20362032 if (error)
20372033 goto out_rg_gunlock;
20382034
20392035 bh = leaf_bh;
20402036
20412037 for (blk = leaf_no; blk; blk = nblk) {
2038
+ struct gfs2_rgrpd *rgd;
2039
+
20422040 if (blk != leaf_no) {
20432041 error = get_leaf(dip, blk, &bh);
20442042 if (error)
....@@ -2049,7 +2047,8 @@
20492047 if (blk != leaf_no)
20502048 brelse(bh);
20512049
2052
- gfs2_free_meta(dip, blk, 1);
2050
+ rgd = gfs2_blk2rgrpd(sdp, blk, true);
2051
+ gfs2_free_meta(dip, rgd, blk, 1);
20532052 gfs2_add_inode_blocks(&dip->i_inode, -1);
20542053 }
20552054