hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/fs/gfs2/xattr.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 #include <linux/slab.h>
....@@ -283,7 +280,7 @@
283280 blen++;
284281 else {
285282 if (bstart)
286
- gfs2_free_meta(ip, bstart, blen);
283
+ gfs2_free_meta(ip, rgd, bstart, blen);
287284 bstart = bn;
288285 blen = 1;
289286 }
....@@ -292,7 +289,7 @@
292289 gfs2_add_inode_blocks(&ip->i_inode, -1);
293290 }
294291 if (bstart)
295
- gfs2_free_meta(ip, bstart, blen);
292
+ gfs2_free_meta(ip, rgd, bstart, blen);
296293
297294 if (prev && !leave) {
298295 u32 len;
....@@ -591,7 +588,8 @@
591588
592589 static int gfs2_xattr_get(const struct xattr_handler *handler,
593590 struct dentry *unused, struct inode *inode,
594
- const char *name, void *buffer, size_t size)
591
+ const char *name, void *buffer, size_t size,
592
+ int flags)
595593 {
596594 struct gfs2_inode *ip = GFS2_I(inode);
597595 struct gfs2_holder gh;
....@@ -631,7 +629,7 @@
631629 error = gfs2_alloc_blocks(ip, &block, &n, 0, NULL);
632630 if (error)
633631 return error;
634
- gfs2_trans_add_unrevoke(sdp, block, 1);
632
+ gfs2_trans_remove_revoke(sdp, block, 1);
635633 *bhp = gfs2_meta_new(ip->i_gl, block);
636634 gfs2_trans_add_meta(ip->i_gl, *bhp);
637635 gfs2_metatype_set(*bhp, GFS2_METATYPE_EA, GFS2_FORMAT_EA);
....@@ -693,7 +691,7 @@
693691 error = gfs2_alloc_blocks(ip, &block, &n, 0, NULL);
694692 if (error)
695693 return error;
696
- gfs2_trans_add_unrevoke(sdp, block, 1);
694
+ gfs2_trans_remove_revoke(sdp, block, 1);
697695 bh = gfs2_meta_new(ip->i_gl, block);
698696 gfs2_trans_add_meta(ip->i_gl, bh);
699697 gfs2_metatype_set(bh, GFS2_METATYPE_ED, GFS2_FORMAT_ED);
....@@ -997,7 +995,7 @@
997995 error = gfs2_alloc_blocks(ip, &blk, &n, 0, NULL);
998996 if (error)
999997 return error;
1000
- gfs2_trans_add_unrevoke(sdp, blk, 1);
998
+ gfs2_trans_remove_revoke(sdp, blk, 1);
1001999 indbh = gfs2_meta_new(ip->i_gl, blk);
10021000 gfs2_trans_add_meta(ip->i_gl, indbh);
10031001 gfs2_metatype_set(indbh, GFS2_METATYPE_IN, GFS2_FORMAT_IN);
....@@ -1225,7 +1223,7 @@
12251223 struct gfs2_holder gh;
12261224 int ret;
12271225
1228
- ret = gfs2_rsqa_alloc(ip);
1226
+ ret = gfs2_qa_get(ip);
12291227 if (ret)
12301228 return ret;
12311229
....@@ -1234,15 +1232,19 @@
12341232 if (!gfs2_glock_is_locked_by_me(ip->i_gl)) {
12351233 ret = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh);
12361234 if (ret)
1237
- return ret;
1235
+ goto out;
12381236 } else {
1239
- if (WARN_ON_ONCE(ip->i_gl->gl_state != LM_ST_EXCLUSIVE))
1240
- return -EIO;
1237
+ if (WARN_ON_ONCE(ip->i_gl->gl_state != LM_ST_EXCLUSIVE)) {
1238
+ ret = -EIO;
1239
+ goto out;
1240
+ }
12411241 gfs2_holder_mark_uninitialized(&gh);
12421242 }
12431243 ret = __gfs2_xattr_set(inode, name, value, size, flags, handler->flags);
12441244 if (gfs2_holder_initialized(&gh))
12451245 gfs2_glock_dq_uninit(&gh);
1246
+out:
1247
+ gfs2_qa_put(ip);
12461248 return ret;
12471249 }
12481250
....@@ -1250,6 +1252,7 @@
12501252 {
12511253 struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
12521254 struct gfs2_rgrp_list rlist;
1255
+ struct gfs2_rgrpd *rgd;
12531256 struct buffer_head *indbh, *dibh;
12541257 __be64 *eablk, *end;
12551258 unsigned int rg_blocks = 0;
....@@ -1299,11 +1302,10 @@
12991302 else
13001303 goto out;
13011304
1302
- gfs2_rlist_alloc(&rlist, LM_ST_EXCLUSIVE);
1305
+ gfs2_rlist_alloc(&rlist);
13031306
13041307 for (x = 0; x < rlist.rl_rgrps; x++) {
1305
- struct gfs2_rgrpd *rgd = gfs2_glock2rgrp(rlist.rl_ghs[x].gh_gl);
1306
-
1308
+ rgd = gfs2_glock2rgrp(rlist.rl_ghs[x].gh_gl);
13071309 rg_blocks += rgd->rd_length;
13081310 }
13091311
....@@ -1320,6 +1322,7 @@
13201322
13211323 eablk = (__be64 *)(indbh->b_data + sizeof(struct gfs2_meta_header));
13221324 bstart = 0;
1325
+ rgd = NULL;
13231326 blen = 0;
13241327
13251328 for (; eablk < end; eablk++) {
....@@ -1333,8 +1336,9 @@
13331336 blen++;
13341337 else {
13351338 if (bstart)
1336
- gfs2_free_meta(ip, bstart, blen);
1339
+ gfs2_free_meta(ip, rgd, bstart, blen);
13371340 bstart = bn;
1341
+ rgd = gfs2_blk2rgrpd(sdp, bstart, true);
13381342 blen = 1;
13391343 }
13401344
....@@ -1342,7 +1346,7 @@
13421346 gfs2_add_inode_blocks(&ip->i_inode, -1);
13431347 }
13441348 if (bstart)
1345
- gfs2_free_meta(ip, bstart, blen);
1349
+ gfs2_free_meta(ip, rgd, bstart, blen);
13461350
13471351 ip->i_diskflags &= ~GFS2_DIF_EA_INDIRECT;
13481352
....@@ -1391,7 +1395,7 @@
13911395 if (error)
13921396 goto out_gunlock;
13931397
1394
- gfs2_free_meta(ip, ip->i_eattr, 1);
1398
+ gfs2_free_meta(ip, rgd, ip->i_eattr, 1);
13951399
13961400 ip->i_eattr = 0;
13971401 gfs2_add_inode_blocks(&ip->i_inode, -1);