cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

xattr.c (33611B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Copyright (C) Sistina Software, Inc.  1997-2003 All rights reserved.
      4 * Copyright (C) 2004-2006 Red Hat, Inc.  All rights reserved.
      5 */
      6
      7#include <linux/slab.h>
      8#include <linux/spinlock.h>
      9#include <linux/completion.h>
     10#include <linux/buffer_head.h>
     11#include <linux/xattr.h>
     12#include <linux/gfs2_ondisk.h>
     13#include <linux/posix_acl_xattr.h>
     14#include <linux/uaccess.h>
     15
     16#include "gfs2.h"
     17#include "incore.h"
     18#include "acl.h"
     19#include "xattr.h"
     20#include "glock.h"
     21#include "inode.h"
     22#include "meta_io.h"
     23#include "quota.h"
     24#include "rgrp.h"
     25#include "super.h"
     26#include "trans.h"
     27#include "util.h"
     28
     29/*
     30 * ea_calc_size - returns the actual number of bytes the request will take up
     31 *                (not counting any unstuffed data blocks)
     32 *
     33 * Returns: 1 if the EA should be stuffed
     34 */
     35
     36static int ea_calc_size(struct gfs2_sbd *sdp, unsigned int nsize, size_t dsize,
     37			unsigned int *size)
     38{
     39	unsigned int jbsize = sdp->sd_jbsize;
     40
     41	/* Stuffed */
     42	*size = ALIGN(sizeof(struct gfs2_ea_header) + nsize + dsize, 8);
     43
     44	if (*size <= jbsize)
     45		return 1;
     46
     47	/* Unstuffed */
     48	*size = ALIGN(sizeof(struct gfs2_ea_header) + nsize +
     49		      (sizeof(__be64) * DIV_ROUND_UP(dsize, jbsize)), 8);
     50
     51	return 0;
     52}
     53
     54static int ea_check_size(struct gfs2_sbd *sdp, unsigned int nsize, size_t dsize)
     55{
     56	unsigned int size;
     57
     58	if (dsize > GFS2_EA_MAX_DATA_LEN)
     59		return -ERANGE;
     60
     61	ea_calc_size(sdp, nsize, dsize, &size);
     62
     63	/* This can only happen with 512 byte blocks */
     64	if (size > sdp->sd_jbsize)
     65		return -ERANGE;
     66
     67	return 0;
     68}
     69
     70static bool gfs2_eatype_valid(struct gfs2_sbd *sdp, u8 type)
     71{
     72	switch(sdp->sd_sb.sb_fs_format) {
     73	case GFS2_FS_FORMAT_MAX:
     74		return true;
     75
     76	case GFS2_FS_FORMAT_MIN:
     77		return type <= GFS2_EATYPE_SECURITY;
     78
     79	default:
     80		return false;
     81	}
     82}
     83
     84typedef int (*ea_call_t) (struct gfs2_inode *ip, struct buffer_head *bh,
     85			  struct gfs2_ea_header *ea,
     86			  struct gfs2_ea_header *prev, void *private);
     87
     88static int ea_foreach_i(struct gfs2_inode *ip, struct buffer_head *bh,
     89			ea_call_t ea_call, void *data)
     90{
     91	struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
     92	struct gfs2_ea_header *ea, *prev = NULL;
     93	int error = 0;
     94
     95	if (gfs2_metatype_check(GFS2_SB(&ip->i_inode), bh, GFS2_METATYPE_EA))
     96		return -EIO;
     97
     98	for (ea = GFS2_EA_BH2FIRST(bh);; prev = ea, ea = GFS2_EA2NEXT(ea)) {
     99		if (!GFS2_EA_REC_LEN(ea))
    100			goto fail;
    101		if (!(bh->b_data <= (char *)ea && (char *)GFS2_EA2NEXT(ea) <=
    102						  bh->b_data + bh->b_size))
    103			goto fail;
    104		if (!gfs2_eatype_valid(sdp, ea->ea_type))
    105			goto fail;
    106		error = ea_call(ip, bh, ea, prev, data);
    107		if (error)
    108			return error;
    109
    110		if (GFS2_EA_IS_LAST(ea)) {
    111			if ((char *)GFS2_EA2NEXT(ea) !=
    112			    bh->b_data + bh->b_size)
    113				goto fail;
    114			break;
    115		}
    116	}
    117
    118	return error;
    119
    120fail:
    121	gfs2_consist_inode(ip);
    122	return -EIO;
    123}
    124
    125static int ea_foreach(struct gfs2_inode *ip, ea_call_t ea_call, void *data)
    126{
    127	struct buffer_head *bh, *eabh;
    128	__be64 *eablk, *end;
    129	int error;
    130
    131	error = gfs2_meta_read(ip->i_gl, ip->i_eattr, DIO_WAIT, 0, &bh);
    132	if (error)
    133		return error;
    134
    135	if (!(ip->i_diskflags & GFS2_DIF_EA_INDIRECT)) {
    136		error = ea_foreach_i(ip, bh, ea_call, data);
    137		goto out;
    138	}
    139
    140	if (gfs2_metatype_check(GFS2_SB(&ip->i_inode), bh, GFS2_METATYPE_IN)) {
    141		error = -EIO;
    142		goto out;
    143	}
    144
    145	eablk = (__be64 *)(bh->b_data + sizeof(struct gfs2_meta_header));
    146	end = eablk + GFS2_SB(&ip->i_inode)->sd_inptrs;
    147
    148	for (; eablk < end; eablk++) {
    149		u64 bn;
    150
    151		if (!*eablk)
    152			break;
    153		bn = be64_to_cpu(*eablk);
    154
    155		error = gfs2_meta_read(ip->i_gl, bn, DIO_WAIT, 0, &eabh);
    156		if (error)
    157			break;
    158		error = ea_foreach_i(ip, eabh, ea_call, data);
    159		brelse(eabh);
    160		if (error)
    161			break;
    162	}
    163out:
    164	brelse(bh);
    165	return error;
    166}
    167
    168struct ea_find {
    169	int type;
    170	const char *name;
    171	size_t namel;
    172	struct gfs2_ea_location *ef_el;
    173};
    174
    175static int ea_find_i(struct gfs2_inode *ip, struct buffer_head *bh,
    176		     struct gfs2_ea_header *ea, struct gfs2_ea_header *prev,
    177		     void *private)
    178{
    179	struct ea_find *ef = private;
    180
    181	if (ea->ea_type == GFS2_EATYPE_UNUSED)
    182		return 0;
    183
    184	if (ea->ea_type == ef->type) {
    185		if (ea->ea_name_len == ef->namel &&
    186		    !memcmp(GFS2_EA2NAME(ea), ef->name, ea->ea_name_len)) {
    187			struct gfs2_ea_location *el = ef->ef_el;
    188			get_bh(bh);
    189			el->el_bh = bh;
    190			el->el_ea = ea;
    191			el->el_prev = prev;
    192			return 1;
    193		}
    194	}
    195
    196	return 0;
    197}
    198
    199static int gfs2_ea_find(struct gfs2_inode *ip, int type, const char *name,
    200			struct gfs2_ea_location *el)
    201{
    202	struct ea_find ef;
    203	int error;
    204
    205	ef.type = type;
    206	ef.name = name;
    207	ef.namel = strlen(name);
    208	ef.ef_el = el;
    209
    210	memset(el, 0, sizeof(struct gfs2_ea_location));
    211
    212	error = ea_foreach(ip, ea_find_i, &ef);
    213	if (error > 0)
    214		return 0;
    215
    216	return error;
    217}
    218
    219/*
    220 * ea_dealloc_unstuffed
    221 *
    222 * Take advantage of the fact that all unstuffed blocks are
    223 * allocated from the same RG.  But watch, this may not always
    224 * be true.
    225 *
    226 * Returns: errno
    227 */
    228
    229static int ea_dealloc_unstuffed(struct gfs2_inode *ip, struct buffer_head *bh,
    230				struct gfs2_ea_header *ea,
    231				struct gfs2_ea_header *prev, void *private)
    232{
    233	int *leave = private;
    234	struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
    235	struct gfs2_rgrpd *rgd;
    236	struct gfs2_holder rg_gh;
    237	__be64 *dataptrs;
    238	u64 bn = 0;
    239	u64 bstart = 0;
    240	unsigned int blen = 0;
    241	unsigned int blks = 0;
    242	unsigned int x;
    243	int error;
    244
    245	error = gfs2_rindex_update(sdp);
    246	if (error)
    247		return error;
    248
    249	if (GFS2_EA_IS_STUFFED(ea))
    250		return 0;
    251
    252	dataptrs = GFS2_EA2DATAPTRS(ea);
    253	for (x = 0; x < ea->ea_num_ptrs; x++, dataptrs++) {
    254		if (*dataptrs) {
    255			blks++;
    256			bn = be64_to_cpu(*dataptrs);
    257		}
    258	}
    259	if (!blks)
    260		return 0;
    261
    262	rgd = gfs2_blk2rgrpd(sdp, bn, 1);
    263	if (!rgd) {
    264		gfs2_consist_inode(ip);
    265		return -EIO;
    266	}
    267
    268	error = gfs2_glock_nq_init(rgd->rd_gl, LM_ST_EXCLUSIVE,
    269				   LM_FLAG_NODE_SCOPE, &rg_gh);
    270	if (error)
    271		return error;
    272
    273	error = gfs2_trans_begin(sdp, rgd->rd_length + RES_DINODE +
    274				 RES_EATTR + RES_STATFS + RES_QUOTA, blks);
    275	if (error)
    276		goto out_gunlock;
    277
    278	gfs2_trans_add_meta(ip->i_gl, bh);
    279
    280	dataptrs = GFS2_EA2DATAPTRS(ea);
    281	for (x = 0; x < ea->ea_num_ptrs; x++, dataptrs++) {
    282		if (!*dataptrs)
    283			break;
    284		bn = be64_to_cpu(*dataptrs);
    285
    286		if (bstart + blen == bn)
    287			blen++;
    288		else {
    289			if (bstart)
    290				gfs2_free_meta(ip, rgd, bstart, blen);
    291			bstart = bn;
    292			blen = 1;
    293		}
    294
    295		*dataptrs = 0;
    296		gfs2_add_inode_blocks(&ip->i_inode, -1);
    297	}
    298	if (bstart)
    299		gfs2_free_meta(ip, rgd, bstart, blen);
    300
    301	if (prev && !leave) {
    302		u32 len;
    303
    304		len = GFS2_EA_REC_LEN(prev) + GFS2_EA_REC_LEN(ea);
    305		prev->ea_rec_len = cpu_to_be32(len);
    306
    307		if (GFS2_EA_IS_LAST(ea))
    308			prev->ea_flags |= GFS2_EAFLAG_LAST;
    309	} else {
    310		ea->ea_type = GFS2_EATYPE_UNUSED;
    311		ea->ea_num_ptrs = 0;
    312	}
    313
    314	ip->i_inode.i_ctime = current_time(&ip->i_inode);
    315	__mark_inode_dirty(&ip->i_inode, I_DIRTY_DATASYNC);
    316
    317	gfs2_trans_end(sdp);
    318
    319out_gunlock:
    320	gfs2_glock_dq_uninit(&rg_gh);
    321	return error;
    322}
    323
    324static int ea_remove_unstuffed(struct gfs2_inode *ip, struct buffer_head *bh,
    325			       struct gfs2_ea_header *ea,
    326			       struct gfs2_ea_header *prev, int leave)
    327{
    328	int error;
    329
    330	error = gfs2_rindex_update(GFS2_SB(&ip->i_inode));
    331	if (error)
    332		return error;
    333
    334	error = gfs2_quota_hold(ip, NO_UID_QUOTA_CHANGE, NO_GID_QUOTA_CHANGE);
    335	if (error)
    336		goto out_alloc;
    337
    338	error = ea_dealloc_unstuffed(ip, bh, ea, prev, (leave) ? &error : NULL);
    339
    340	gfs2_quota_unhold(ip);
    341out_alloc:
    342	return error;
    343}
    344
    345struct ea_list {
    346	struct gfs2_ea_request *ei_er;
    347	unsigned int ei_size;
    348};
    349
    350static int ea_list_i(struct gfs2_inode *ip, struct buffer_head *bh,
    351		     struct gfs2_ea_header *ea, struct gfs2_ea_header *prev,
    352		     void *private)
    353{
    354	struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
    355	struct ea_list *ei = private;
    356	struct gfs2_ea_request *er = ei->ei_er;
    357	unsigned int ea_size;
    358	char *prefix;
    359	unsigned int l;
    360
    361	if (ea->ea_type == GFS2_EATYPE_UNUSED)
    362		return 0;
    363
    364	BUG_ON(ea->ea_type > GFS2_EATYPE_SECURITY &&
    365	       sdp->sd_sb.sb_fs_format == GFS2_FS_FORMAT_MIN);
    366	switch (ea->ea_type) {
    367	case GFS2_EATYPE_USR:
    368		prefix = "user.";
    369		l = 5;
    370		break;
    371	case GFS2_EATYPE_SYS:
    372		prefix = "system.";
    373		l = 7;
    374		break;
    375	case GFS2_EATYPE_SECURITY:
    376		prefix = "security.";
    377		l = 9;
    378		break;
    379	case GFS2_EATYPE_TRUSTED:
    380		prefix = "trusted.";
    381		l = 8;
    382		break;
    383	default:
    384		return 0;
    385	}
    386
    387	ea_size = l + ea->ea_name_len + 1;
    388	if (er->er_data_len) {
    389		if (ei->ei_size + ea_size > er->er_data_len)
    390			return -ERANGE;
    391
    392		memcpy(er->er_data + ei->ei_size, prefix, l);
    393		memcpy(er->er_data + ei->ei_size + l, GFS2_EA2NAME(ea),
    394		       ea->ea_name_len);
    395		er->er_data[ei->ei_size + ea_size - 1] = 0;
    396	}
    397
    398	ei->ei_size += ea_size;
    399
    400	return 0;
    401}
    402
    403/**
    404 * gfs2_listxattr - List gfs2 extended attributes
    405 * @dentry: The dentry whose inode we are interested in
    406 * @buffer: The buffer to write the results
    407 * @size: The size of the buffer
    408 *
    409 * Returns: actual size of data on success, -errno on error
    410 */
    411
    412ssize_t gfs2_listxattr(struct dentry *dentry, char *buffer, size_t size)
    413{
    414	struct gfs2_inode *ip = GFS2_I(d_inode(dentry));
    415	struct gfs2_ea_request er;
    416	struct gfs2_holder i_gh;
    417	int error;
    418
    419	memset(&er, 0, sizeof(struct gfs2_ea_request));
    420	if (size) {
    421		er.er_data = buffer;
    422		er.er_data_len = size;
    423	}
    424
    425	error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &i_gh);
    426	if (error)
    427		return error;
    428
    429	if (ip->i_eattr) {
    430		struct ea_list ei = { .ei_er = &er, .ei_size = 0 };
    431
    432		error = ea_foreach(ip, ea_list_i, &ei);
    433		if (!error)
    434			error = ei.ei_size;
    435	}
    436
    437	gfs2_glock_dq_uninit(&i_gh);
    438
    439	return error;
    440}
    441
    442/**
    443 * gfs2_iter_unstuffed - copies the unstuffed xattr data to/from the
    444 *                       request buffer
    445 * @ip: The GFS2 inode
    446 * @ea: The extended attribute header structure
    447 * @din: The data to be copied in
    448 * @dout: The data to be copied out (one of din,dout will be NULL)
    449 *
    450 * Returns: errno
    451 */
    452
    453static int gfs2_iter_unstuffed(struct gfs2_inode *ip, struct gfs2_ea_header *ea,
    454			       const char *din, char *dout)
    455{
    456	struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
    457	struct buffer_head **bh;
    458	unsigned int amount = GFS2_EA_DATA_LEN(ea);
    459	unsigned int nptrs = DIV_ROUND_UP(amount, sdp->sd_jbsize);
    460	__be64 *dataptrs = GFS2_EA2DATAPTRS(ea);
    461	unsigned int x;
    462	int error = 0;
    463	unsigned char *pos;
    464	unsigned cp_size;
    465
    466	bh = kcalloc(nptrs, sizeof(struct buffer_head *), GFP_NOFS);
    467	if (!bh)
    468		return -ENOMEM;
    469
    470	for (x = 0; x < nptrs; x++) {
    471		error = gfs2_meta_read(ip->i_gl, be64_to_cpu(*dataptrs), 0, 0,
    472				       bh + x);
    473		if (error) {
    474			while (x--)
    475				brelse(bh[x]);
    476			goto out;
    477		}
    478		dataptrs++;
    479	}
    480
    481	for (x = 0; x < nptrs; x++) {
    482		error = gfs2_meta_wait(sdp, bh[x]);
    483		if (error) {
    484			for (; x < nptrs; x++)
    485				brelse(bh[x]);
    486			goto out;
    487		}
    488		if (gfs2_metatype_check(sdp, bh[x], GFS2_METATYPE_ED)) {
    489			for (; x < nptrs; x++)
    490				brelse(bh[x]);
    491			error = -EIO;
    492			goto out;
    493		}
    494
    495		pos = bh[x]->b_data + sizeof(struct gfs2_meta_header);
    496		cp_size = (sdp->sd_jbsize > amount) ? amount : sdp->sd_jbsize;
    497
    498		if (dout) {
    499			memcpy(dout, pos, cp_size);
    500			dout += sdp->sd_jbsize;
    501		}
    502
    503		if (din) {
    504			gfs2_trans_add_meta(ip->i_gl, bh[x]);
    505			memcpy(pos, din, cp_size);
    506			din += sdp->sd_jbsize;
    507		}
    508
    509		amount -= sdp->sd_jbsize;
    510		brelse(bh[x]);
    511	}
    512
    513out:
    514	kfree(bh);
    515	return error;
    516}
    517
    518static int gfs2_ea_get_copy(struct gfs2_inode *ip, struct gfs2_ea_location *el,
    519			    char *data, size_t size)
    520{
    521	int ret;
    522	size_t len = GFS2_EA_DATA_LEN(el->el_ea);
    523	if (len > size)
    524		return -ERANGE;
    525
    526	if (GFS2_EA_IS_STUFFED(el->el_ea)) {
    527		memcpy(data, GFS2_EA2DATA(el->el_ea), len);
    528		return len;
    529	}
    530	ret = gfs2_iter_unstuffed(ip, el->el_ea, NULL, data);
    531	if (ret < 0)
    532		return ret;
    533	return len;
    534}
    535
    536int gfs2_xattr_acl_get(struct gfs2_inode *ip, const char *name, char **ppdata)
    537{
    538	struct gfs2_ea_location el;
    539	int error;
    540	int len;
    541	char *data;
    542
    543	error = gfs2_ea_find(ip, GFS2_EATYPE_SYS, name, &el);
    544	if (error)
    545		return error;
    546	if (!el.el_ea)
    547		goto out;
    548	if (!GFS2_EA_DATA_LEN(el.el_ea))
    549		goto out;
    550
    551	len = GFS2_EA_DATA_LEN(el.el_ea);
    552	data = kmalloc(len, GFP_NOFS);
    553	error = -ENOMEM;
    554	if (data == NULL)
    555		goto out;
    556
    557	error = gfs2_ea_get_copy(ip, &el, data, len);
    558	if (error < 0)
    559		kfree(data);
    560	else
    561		*ppdata = data;
    562out:
    563	brelse(el.el_bh);
    564	return error;
    565}
    566
    567/**
    568 * __gfs2_xattr_get - Get a GFS2 extended attribute
    569 * @inode: The inode
    570 * @name: The name of the extended attribute
    571 * @buffer: The buffer to write the result into
    572 * @size: The size of the buffer
    573 * @type: The type of extended attribute
    574 *
    575 * Returns: actual size of data on success, -errno on error
    576 */
    577static int __gfs2_xattr_get(struct inode *inode, const char *name,
    578			    void *buffer, size_t size, int type)
    579{
    580	struct gfs2_inode *ip = GFS2_I(inode);
    581	struct gfs2_ea_location el;
    582	int error;
    583
    584	if (!ip->i_eattr)
    585		return -ENODATA;
    586	if (strlen(name) > GFS2_EA_MAX_NAME_LEN)
    587		return -EINVAL;
    588
    589	error = gfs2_ea_find(ip, type, name, &el);
    590	if (error)
    591		return error;
    592	if (!el.el_ea)
    593		return -ENODATA;
    594	if (size)
    595		error = gfs2_ea_get_copy(ip, &el, buffer, size);
    596	else
    597		error = GFS2_EA_DATA_LEN(el.el_ea);
    598	brelse(el.el_bh);
    599
    600	return error;
    601}
    602
    603static int gfs2_xattr_get(const struct xattr_handler *handler,
    604			  struct dentry *unused, struct inode *inode,
    605			  const char *name, void *buffer, size_t size)
    606{
    607	struct gfs2_inode *ip = GFS2_I(inode);
    608	struct gfs2_holder gh;
    609	int ret;
    610
    611	/* During lookup, SELinux calls this function with the glock locked. */
    612
    613	if (!gfs2_glock_is_locked_by_me(ip->i_gl)) {
    614		ret = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &gh);
    615		if (ret)
    616			return ret;
    617	} else {
    618		gfs2_holder_mark_uninitialized(&gh);
    619	}
    620	ret = __gfs2_xattr_get(inode, name, buffer, size, handler->flags);
    621	if (gfs2_holder_initialized(&gh))
    622		gfs2_glock_dq_uninit(&gh);
    623	return ret;
    624}
    625
    626/**
    627 * ea_alloc_blk - allocates a new block for extended attributes.
    628 * @ip: A pointer to the inode that's getting extended attributes
    629 * @bhp: Pointer to pointer to a struct buffer_head
    630 *
    631 * Returns: errno
    632 */
    633
    634static int ea_alloc_blk(struct gfs2_inode *ip, struct buffer_head **bhp)
    635{
    636	struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
    637	struct gfs2_ea_header *ea;
    638	unsigned int n = 1;
    639	u64 block;
    640	int error;
    641
    642	error = gfs2_alloc_blocks(ip, &block, &n, 0, NULL);
    643	if (error)
    644		return error;
    645	gfs2_trans_remove_revoke(sdp, block, 1);
    646	*bhp = gfs2_meta_new(ip->i_gl, block);
    647	gfs2_trans_add_meta(ip->i_gl, *bhp);
    648	gfs2_metatype_set(*bhp, GFS2_METATYPE_EA, GFS2_FORMAT_EA);
    649	gfs2_buffer_clear_tail(*bhp, sizeof(struct gfs2_meta_header));
    650
    651	ea = GFS2_EA_BH2FIRST(*bhp);
    652	ea->ea_rec_len = cpu_to_be32(sdp->sd_jbsize);
    653	ea->ea_type = GFS2_EATYPE_UNUSED;
    654	ea->ea_flags = GFS2_EAFLAG_LAST;
    655	ea->ea_num_ptrs = 0;
    656
    657	gfs2_add_inode_blocks(&ip->i_inode, 1);
    658
    659	return 0;
    660}
    661
    662/**
    663 * ea_write - writes the request info to an ea, creating new blocks if
    664 *            necessary
    665 * @ip: inode that is being modified
    666 * @ea: the location of the new ea in a block
    667 * @er: the write request
    668 *
    669 * Note: does not update ea_rec_len or the GFS2_EAFLAG_LAST bin of ea_flags
    670 *
    671 * returns : errno
    672 */
    673
    674static int ea_write(struct gfs2_inode *ip, struct gfs2_ea_header *ea,
    675		    struct gfs2_ea_request *er)
    676{
    677	struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
    678	int error;
    679
    680	ea->ea_data_len = cpu_to_be32(er->er_data_len);
    681	ea->ea_name_len = er->er_name_len;
    682	ea->ea_type = er->er_type;
    683	ea->__pad = 0;
    684
    685	memcpy(GFS2_EA2NAME(ea), er->er_name, er->er_name_len);
    686
    687	if (GFS2_EAREQ_SIZE_STUFFED(er) <= sdp->sd_jbsize) {
    688		ea->ea_num_ptrs = 0;
    689		memcpy(GFS2_EA2DATA(ea), er->er_data, er->er_data_len);
    690	} else {
    691		__be64 *dataptr = GFS2_EA2DATAPTRS(ea);
    692		const char *data = er->er_data;
    693		unsigned int data_len = er->er_data_len;
    694		unsigned int copy;
    695		unsigned int x;
    696
    697		ea->ea_num_ptrs = DIV_ROUND_UP(er->er_data_len, sdp->sd_jbsize);
    698		for (x = 0; x < ea->ea_num_ptrs; x++) {
    699			struct buffer_head *bh;
    700			u64 block;
    701			int mh_size = sizeof(struct gfs2_meta_header);
    702			unsigned int n = 1;
    703
    704			error = gfs2_alloc_blocks(ip, &block, &n, 0, NULL);
    705			if (error)
    706				return error;
    707			gfs2_trans_remove_revoke(sdp, block, 1);
    708			bh = gfs2_meta_new(ip->i_gl, block);
    709			gfs2_trans_add_meta(ip->i_gl, bh);
    710			gfs2_metatype_set(bh, GFS2_METATYPE_ED, GFS2_FORMAT_ED);
    711
    712			gfs2_add_inode_blocks(&ip->i_inode, 1);
    713
    714			copy = data_len > sdp->sd_jbsize ? sdp->sd_jbsize :
    715							   data_len;
    716			memcpy(bh->b_data + mh_size, data, copy);
    717			if (copy < sdp->sd_jbsize)
    718				memset(bh->b_data + mh_size + copy, 0,
    719				       sdp->sd_jbsize - copy);
    720
    721			*dataptr++ = cpu_to_be64(bh->b_blocknr);
    722			data += copy;
    723			data_len -= copy;
    724
    725			brelse(bh);
    726		}
    727
    728		gfs2_assert_withdraw(sdp, !data_len);
    729	}
    730
    731	return 0;
    732}
    733
    734typedef int (*ea_skeleton_call_t) (struct gfs2_inode *ip,
    735				   struct gfs2_ea_request *er, void *private);
    736
    737static int ea_alloc_skeleton(struct gfs2_inode *ip, struct gfs2_ea_request *er,
    738			     unsigned int blks,
    739			     ea_skeleton_call_t skeleton_call, void *private)
    740{
    741	struct gfs2_alloc_parms ap = { .target = blks };
    742	int error;
    743
    744	error = gfs2_rindex_update(GFS2_SB(&ip->i_inode));
    745	if (error)
    746		return error;
    747
    748	error = gfs2_quota_lock_check(ip, &ap);
    749	if (error)
    750		return error;
    751
    752	error = gfs2_inplace_reserve(ip, &ap);
    753	if (error)
    754		goto out_gunlock_q;
    755
    756	error = gfs2_trans_begin(GFS2_SB(&ip->i_inode),
    757				 blks + gfs2_rg_blocks(ip, blks) +
    758				 RES_DINODE + RES_STATFS + RES_QUOTA, 0);
    759	if (error)
    760		goto out_ipres;
    761
    762	error = skeleton_call(ip, er, private);
    763	if (error)
    764		goto out_end_trans;
    765
    766	ip->i_inode.i_ctime = current_time(&ip->i_inode);
    767	__mark_inode_dirty(&ip->i_inode, I_DIRTY_DATASYNC);
    768
    769out_end_trans:
    770	gfs2_trans_end(GFS2_SB(&ip->i_inode));
    771out_ipres:
    772	gfs2_inplace_release(ip);
    773out_gunlock_q:
    774	gfs2_quota_unlock(ip);
    775	return error;
    776}
    777
    778static int ea_init_i(struct gfs2_inode *ip, struct gfs2_ea_request *er,
    779		     void *private)
    780{
    781	struct buffer_head *bh;
    782	int error;
    783
    784	error = ea_alloc_blk(ip, &bh);
    785	if (error)
    786		return error;
    787
    788	ip->i_eattr = bh->b_blocknr;
    789	error = ea_write(ip, GFS2_EA_BH2FIRST(bh), er);
    790
    791	brelse(bh);
    792
    793	return error;
    794}
    795
    796/*
    797 * ea_init - initializes a new eattr block
    798 *
    799 * Returns: errno
    800 */
    801static int ea_init(struct gfs2_inode *ip, int type, const char *name,
    802		   const void *data, size_t size)
    803{
    804	struct gfs2_ea_request er;
    805	unsigned int jbsize = GFS2_SB(&ip->i_inode)->sd_jbsize;
    806	unsigned int blks = 1;
    807
    808	er.er_type = type;
    809	er.er_name = name;
    810	er.er_name_len = strlen(name);
    811	er.er_data = (void *)data;
    812	er.er_data_len = size;
    813
    814	if (GFS2_EAREQ_SIZE_STUFFED(&er) > jbsize)
    815		blks += DIV_ROUND_UP(er.er_data_len, jbsize);
    816
    817	return ea_alloc_skeleton(ip, &er, blks, ea_init_i, NULL);
    818}
    819
    820static struct gfs2_ea_header *ea_split_ea(struct gfs2_ea_header *ea)
    821{
    822	u32 ea_size = GFS2_EA_SIZE(ea);
    823	struct gfs2_ea_header *new = (struct gfs2_ea_header *)((char *)ea +
    824				     ea_size);
    825	u32 new_size = GFS2_EA_REC_LEN(ea) - ea_size;
    826	int last = ea->ea_flags & GFS2_EAFLAG_LAST;
    827
    828	ea->ea_rec_len = cpu_to_be32(ea_size);
    829	ea->ea_flags ^= last;
    830
    831	new->ea_rec_len = cpu_to_be32(new_size);
    832	new->ea_flags = last;
    833
    834	return new;
    835}
    836
    837static void ea_set_remove_stuffed(struct gfs2_inode *ip,
    838				  struct gfs2_ea_location *el)
    839{
    840	struct gfs2_ea_header *ea = el->el_ea;
    841	struct gfs2_ea_header *prev = el->el_prev;
    842	u32 len;
    843
    844	gfs2_trans_add_meta(ip->i_gl, el->el_bh);
    845
    846	if (!prev || !GFS2_EA_IS_STUFFED(ea)) {
    847		ea->ea_type = GFS2_EATYPE_UNUSED;
    848		return;
    849	} else if (GFS2_EA2NEXT(prev) != ea) {
    850		prev = GFS2_EA2NEXT(prev);
    851		gfs2_assert_withdraw(GFS2_SB(&ip->i_inode), GFS2_EA2NEXT(prev) == ea);
    852	}
    853
    854	len = GFS2_EA_REC_LEN(prev) + GFS2_EA_REC_LEN(ea);
    855	prev->ea_rec_len = cpu_to_be32(len);
    856
    857	if (GFS2_EA_IS_LAST(ea))
    858		prev->ea_flags |= GFS2_EAFLAG_LAST;
    859}
    860
    861struct ea_set {
    862	int ea_split;
    863
    864	struct gfs2_ea_request *es_er;
    865	struct gfs2_ea_location *es_el;
    866
    867	struct buffer_head *es_bh;
    868	struct gfs2_ea_header *es_ea;
    869};
    870
    871static int ea_set_simple_noalloc(struct gfs2_inode *ip, struct buffer_head *bh,
    872				 struct gfs2_ea_header *ea, struct ea_set *es)
    873{
    874	struct gfs2_ea_request *er = es->es_er;
    875	int error;
    876
    877	error = gfs2_trans_begin(GFS2_SB(&ip->i_inode), RES_DINODE + 2 * RES_EATTR, 0);
    878	if (error)
    879		return error;
    880
    881	gfs2_trans_add_meta(ip->i_gl, bh);
    882
    883	if (es->ea_split)
    884		ea = ea_split_ea(ea);
    885
    886	ea_write(ip, ea, er);
    887
    888	if (es->es_el)
    889		ea_set_remove_stuffed(ip, es->es_el);
    890
    891	ip->i_inode.i_ctime = current_time(&ip->i_inode);
    892	__mark_inode_dirty(&ip->i_inode, I_DIRTY_DATASYNC);
    893
    894	gfs2_trans_end(GFS2_SB(&ip->i_inode));
    895	return error;
    896}
    897
    898static int ea_set_simple_alloc(struct gfs2_inode *ip,
    899			       struct gfs2_ea_request *er, void *private)
    900{
    901	struct ea_set *es = private;
    902	struct gfs2_ea_header *ea = es->es_ea;
    903	int error;
    904
    905	gfs2_trans_add_meta(ip->i_gl, es->es_bh);
    906
    907	if (es->ea_split)
    908		ea = ea_split_ea(ea);
    909
    910	error = ea_write(ip, ea, er);
    911	if (error)
    912		return error;
    913
    914	if (es->es_el)
    915		ea_set_remove_stuffed(ip, es->es_el);
    916
    917	return 0;
    918}
    919
    920static int ea_set_simple(struct gfs2_inode *ip, struct buffer_head *bh,
    921			 struct gfs2_ea_header *ea, struct gfs2_ea_header *prev,
    922			 void *private)
    923{
    924	struct ea_set *es = private;
    925	unsigned int size;
    926	int stuffed;
    927	int error;
    928
    929	stuffed = ea_calc_size(GFS2_SB(&ip->i_inode), es->es_er->er_name_len,
    930			       es->es_er->er_data_len, &size);
    931
    932	if (ea->ea_type == GFS2_EATYPE_UNUSED) {
    933		if (GFS2_EA_REC_LEN(ea) < size)
    934			return 0;
    935		if (!GFS2_EA_IS_STUFFED(ea)) {
    936			error = ea_remove_unstuffed(ip, bh, ea, prev, 1);
    937			if (error)
    938				return error;
    939		}
    940		es->ea_split = 0;
    941	} else if (GFS2_EA_REC_LEN(ea) - GFS2_EA_SIZE(ea) >= size)
    942		es->ea_split = 1;
    943	else
    944		return 0;
    945
    946	if (stuffed) {
    947		error = ea_set_simple_noalloc(ip, bh, ea, es);
    948		if (error)
    949			return error;
    950	} else {
    951		unsigned int blks;
    952
    953		es->es_bh = bh;
    954		es->es_ea = ea;
    955		blks = 2 + DIV_ROUND_UP(es->es_er->er_data_len,
    956					GFS2_SB(&ip->i_inode)->sd_jbsize);
    957
    958		error = ea_alloc_skeleton(ip, es->es_er, blks,
    959					  ea_set_simple_alloc, es);
    960		if (error)
    961			return error;
    962	}
    963
    964	return 1;
    965}
    966
    967static int ea_set_block(struct gfs2_inode *ip, struct gfs2_ea_request *er,
    968			void *private)
    969{
    970	struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
    971	struct buffer_head *indbh, *newbh;
    972	__be64 *eablk;
    973	int error;
    974	int mh_size = sizeof(struct gfs2_meta_header);
    975
    976	if (ip->i_diskflags & GFS2_DIF_EA_INDIRECT) {
    977		__be64 *end;
    978
    979		error = gfs2_meta_read(ip->i_gl, ip->i_eattr, DIO_WAIT, 0,
    980				       &indbh);
    981		if (error)
    982			return error;
    983
    984		if (gfs2_metatype_check(sdp, indbh, GFS2_METATYPE_IN)) {
    985			error = -EIO;
    986			goto out;
    987		}
    988
    989		eablk = (__be64 *)(indbh->b_data + mh_size);
    990		end = eablk + sdp->sd_inptrs;
    991
    992		for (; eablk < end; eablk++)
    993			if (!*eablk)
    994				break;
    995
    996		if (eablk == end) {
    997			error = -ENOSPC;
    998			goto out;
    999		}
   1000
   1001		gfs2_trans_add_meta(ip->i_gl, indbh);
   1002	} else {
   1003		u64 blk;
   1004		unsigned int n = 1;
   1005		error = gfs2_alloc_blocks(ip, &blk, &n, 0, NULL);
   1006		if (error)
   1007			return error;
   1008		gfs2_trans_remove_revoke(sdp, blk, 1);
   1009		indbh = gfs2_meta_new(ip->i_gl, blk);
   1010		gfs2_trans_add_meta(ip->i_gl, indbh);
   1011		gfs2_metatype_set(indbh, GFS2_METATYPE_IN, GFS2_FORMAT_IN);
   1012		gfs2_buffer_clear_tail(indbh, mh_size);
   1013
   1014		eablk = (__be64 *)(indbh->b_data + mh_size);
   1015		*eablk = cpu_to_be64(ip->i_eattr);
   1016		ip->i_eattr = blk;
   1017		ip->i_diskflags |= GFS2_DIF_EA_INDIRECT;
   1018		gfs2_add_inode_blocks(&ip->i_inode, 1);
   1019
   1020		eablk++;
   1021	}
   1022
   1023	error = ea_alloc_blk(ip, &newbh);
   1024	if (error)
   1025		goto out;
   1026
   1027	*eablk = cpu_to_be64((u64)newbh->b_blocknr);
   1028	error = ea_write(ip, GFS2_EA_BH2FIRST(newbh), er);
   1029	brelse(newbh);
   1030	if (error)
   1031		goto out;
   1032
   1033	if (private)
   1034		ea_set_remove_stuffed(ip, private);
   1035
   1036out:
   1037	brelse(indbh);
   1038	return error;
   1039}
   1040
   1041static int ea_set_i(struct gfs2_inode *ip, int type, const char *name,
   1042		    const void *value, size_t size, struct gfs2_ea_location *el)
   1043{
   1044	struct gfs2_ea_request er;
   1045	struct ea_set es;
   1046	unsigned int blks = 2;
   1047	int error;
   1048
   1049	er.er_type = type;
   1050	er.er_name = name;
   1051	er.er_data = (void *)value;
   1052	er.er_name_len = strlen(name);
   1053	er.er_data_len = size;
   1054
   1055	memset(&es, 0, sizeof(struct ea_set));
   1056	es.es_er = &er;
   1057	es.es_el = el;
   1058
   1059	error = ea_foreach(ip, ea_set_simple, &es);
   1060	if (error > 0)
   1061		return 0;
   1062	if (error)
   1063		return error;
   1064
   1065	if (!(ip->i_diskflags & GFS2_DIF_EA_INDIRECT))
   1066		blks++;
   1067	if (GFS2_EAREQ_SIZE_STUFFED(&er) > GFS2_SB(&ip->i_inode)->sd_jbsize)
   1068		blks += DIV_ROUND_UP(er.er_data_len, GFS2_SB(&ip->i_inode)->sd_jbsize);
   1069
   1070	return ea_alloc_skeleton(ip, &er, blks, ea_set_block, el);
   1071}
   1072
   1073static int ea_set_remove_unstuffed(struct gfs2_inode *ip,
   1074				   struct gfs2_ea_location *el)
   1075{
   1076	if (el->el_prev && GFS2_EA2NEXT(el->el_prev) != el->el_ea) {
   1077		el->el_prev = GFS2_EA2NEXT(el->el_prev);
   1078		gfs2_assert_withdraw(GFS2_SB(&ip->i_inode),
   1079				     GFS2_EA2NEXT(el->el_prev) == el->el_ea);
   1080	}
   1081
   1082	return ea_remove_unstuffed(ip, el->el_bh, el->el_ea, el->el_prev, 0);
   1083}
   1084
   1085static int ea_remove_stuffed(struct gfs2_inode *ip, struct gfs2_ea_location *el)
   1086{
   1087	struct gfs2_ea_header *ea = el->el_ea;
   1088	struct gfs2_ea_header *prev = el->el_prev;
   1089	int error;
   1090
   1091	error = gfs2_trans_begin(GFS2_SB(&ip->i_inode), RES_DINODE + RES_EATTR, 0);
   1092	if (error)
   1093		return error;
   1094
   1095	gfs2_trans_add_meta(ip->i_gl, el->el_bh);
   1096
   1097	if (prev) {
   1098		u32 len;
   1099
   1100		len = GFS2_EA_REC_LEN(prev) + GFS2_EA_REC_LEN(ea);
   1101		prev->ea_rec_len = cpu_to_be32(len);
   1102
   1103		if (GFS2_EA_IS_LAST(ea))
   1104			prev->ea_flags |= GFS2_EAFLAG_LAST;
   1105	} else {
   1106		ea->ea_type = GFS2_EATYPE_UNUSED;
   1107	}
   1108
   1109	ip->i_inode.i_ctime = current_time(&ip->i_inode);
   1110	__mark_inode_dirty(&ip->i_inode, I_DIRTY_DATASYNC);
   1111
   1112	gfs2_trans_end(GFS2_SB(&ip->i_inode));
   1113
   1114	return error;
   1115}
   1116
   1117/**
   1118 * gfs2_xattr_remove - Remove a GFS2 extended attribute
   1119 * @ip: The inode
   1120 * @type: The type of the extended attribute
   1121 * @name: The name of the extended attribute
   1122 *
   1123 * This is not called directly by the VFS since we use the (common)
   1124 * scheme of making a "set with NULL data" mean a remove request. Note
   1125 * that this is different from a set with zero length data.
   1126 *
   1127 * Returns: 0, or errno on failure
   1128 */
   1129
   1130static int gfs2_xattr_remove(struct gfs2_inode *ip, int type, const char *name)
   1131{
   1132	struct gfs2_ea_location el;
   1133	int error;
   1134
   1135	if (!ip->i_eattr)
   1136		return -ENODATA;
   1137
   1138	error = gfs2_ea_find(ip, type, name, &el);
   1139	if (error)
   1140		return error;
   1141	if (!el.el_ea)
   1142		return -ENODATA;
   1143
   1144	if (GFS2_EA_IS_STUFFED(el.el_ea))
   1145		error = ea_remove_stuffed(ip, &el);
   1146	else
   1147		error = ea_remove_unstuffed(ip, el.el_bh, el.el_ea, el.el_prev, 0);
   1148
   1149	brelse(el.el_bh);
   1150
   1151	return error;
   1152}
   1153
   1154/**
   1155 * __gfs2_xattr_set - Set (or remove) a GFS2 extended attribute
   1156 * @inode: The inode
   1157 * @name: The name of the extended attribute
   1158 * @value: The value of the extended attribute (NULL for remove)
   1159 * @size: The size of the @value argument
   1160 * @flags: Create or Replace
   1161 * @type: The type of the extended attribute
   1162 *
   1163 * See gfs2_xattr_remove() for details of the removal of xattrs.
   1164 *
   1165 * Returns: 0 or errno on failure
   1166 */
   1167
   1168int __gfs2_xattr_set(struct inode *inode, const char *name,
   1169		   const void *value, size_t size, int flags, int type)
   1170{
   1171	struct gfs2_inode *ip = GFS2_I(inode);
   1172	struct gfs2_sbd *sdp = GFS2_SB(inode);
   1173	struct gfs2_ea_location el;
   1174	unsigned int namel = strlen(name);
   1175	int error;
   1176
   1177	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
   1178		return -EPERM;
   1179	if (namel > GFS2_EA_MAX_NAME_LEN)
   1180		return -ERANGE;
   1181
   1182	if (value == NULL) {
   1183		error = gfs2_xattr_remove(ip, type, name);
   1184		if (error == -ENODATA && !(flags & XATTR_REPLACE))
   1185			error = 0;
   1186		return error;
   1187	}
   1188
   1189	if (ea_check_size(sdp, namel, size))
   1190		return -ERANGE;
   1191
   1192	if (!ip->i_eattr) {
   1193		if (flags & XATTR_REPLACE)
   1194			return -ENODATA;
   1195		return ea_init(ip, type, name, value, size);
   1196	}
   1197
   1198	error = gfs2_ea_find(ip, type, name, &el);
   1199	if (error)
   1200		return error;
   1201
   1202	if (el.el_ea) {
   1203		if (ip->i_diskflags & GFS2_DIF_APPENDONLY) {
   1204			brelse(el.el_bh);
   1205			return -EPERM;
   1206		}
   1207
   1208		error = -EEXIST;
   1209		if (!(flags & XATTR_CREATE)) {
   1210			int unstuffed = !GFS2_EA_IS_STUFFED(el.el_ea);
   1211			error = ea_set_i(ip, type, name, value, size, &el);
   1212			if (!error && unstuffed)
   1213				ea_set_remove_unstuffed(ip, &el);
   1214		}
   1215
   1216		brelse(el.el_bh);
   1217		return error;
   1218	}
   1219
   1220	error = -ENODATA;
   1221	if (!(flags & XATTR_REPLACE))
   1222		error = ea_set_i(ip, type, name, value, size, NULL);
   1223
   1224	return error;
   1225}
   1226
   1227static int gfs2_xattr_set(const struct xattr_handler *handler,
   1228			  struct user_namespace *mnt_userns,
   1229			  struct dentry *unused, struct inode *inode,
   1230			  const char *name, const void *value,
   1231			  size_t size, int flags)
   1232{
   1233	struct gfs2_inode *ip = GFS2_I(inode);
   1234	struct gfs2_holder gh;
   1235	int ret;
   1236
   1237	ret = gfs2_qa_get(ip);
   1238	if (ret)
   1239		return ret;
   1240
   1241	/* May be called from gfs_setattr with the glock locked. */
   1242
   1243	if (!gfs2_glock_is_locked_by_me(ip->i_gl)) {
   1244		ret = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh);
   1245		if (ret)
   1246			goto out;
   1247	} else {
   1248		if (WARN_ON_ONCE(ip->i_gl->gl_state != LM_ST_EXCLUSIVE)) {
   1249			ret = -EIO;
   1250			goto out;
   1251		}
   1252		gfs2_holder_mark_uninitialized(&gh);
   1253	}
   1254	ret = __gfs2_xattr_set(inode, name, value, size, flags, handler->flags);
   1255	if (gfs2_holder_initialized(&gh))
   1256		gfs2_glock_dq_uninit(&gh);
   1257out:
   1258	gfs2_qa_put(ip);
   1259	return ret;
   1260}
   1261
   1262static int ea_dealloc_indirect(struct gfs2_inode *ip)
   1263{
   1264	struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
   1265	struct gfs2_rgrp_list rlist;
   1266	struct gfs2_rgrpd *rgd;
   1267	struct buffer_head *indbh, *dibh;
   1268	__be64 *eablk, *end;
   1269	unsigned int rg_blocks = 0;
   1270	u64 bstart = 0;
   1271	unsigned int blen = 0;
   1272	unsigned int blks = 0;
   1273	unsigned int x;
   1274	int error;
   1275
   1276	error = gfs2_rindex_update(sdp);
   1277	if (error)
   1278		return error;
   1279
   1280	memset(&rlist, 0, sizeof(struct gfs2_rgrp_list));
   1281
   1282	error = gfs2_meta_read(ip->i_gl, ip->i_eattr, DIO_WAIT, 0, &indbh);
   1283	if (error)
   1284		return error;
   1285
   1286	if (gfs2_metatype_check(sdp, indbh, GFS2_METATYPE_IN)) {
   1287		error = -EIO;
   1288		goto out;
   1289	}
   1290
   1291	eablk = (__be64 *)(indbh->b_data + sizeof(struct gfs2_meta_header));
   1292	end = eablk + sdp->sd_inptrs;
   1293
   1294	for (; eablk < end; eablk++) {
   1295		u64 bn;
   1296
   1297		if (!*eablk)
   1298			break;
   1299		bn = be64_to_cpu(*eablk);
   1300
   1301		if (bstart + blen == bn)
   1302			blen++;
   1303		else {
   1304			if (bstart)
   1305				gfs2_rlist_add(ip, &rlist, bstart);
   1306			bstart = bn;
   1307			blen = 1;
   1308		}
   1309		blks++;
   1310	}
   1311	if (bstart)
   1312		gfs2_rlist_add(ip, &rlist, bstart);
   1313	else
   1314		goto out;
   1315
   1316	gfs2_rlist_alloc(&rlist);
   1317
   1318	for (x = 0; x < rlist.rl_rgrps; x++) {
   1319		rgd = gfs2_glock2rgrp(rlist.rl_ghs[x].gh_gl);
   1320		rg_blocks += rgd->rd_length;
   1321	}
   1322
   1323	error = gfs2_glock_nq_m(rlist.rl_rgrps, rlist.rl_ghs);
   1324	if (error)
   1325		goto out_rlist_free;
   1326
   1327	error = gfs2_trans_begin(sdp, rg_blocks + RES_DINODE + RES_INDIRECT +
   1328				 RES_STATFS + RES_QUOTA, blks);
   1329	if (error)
   1330		goto out_gunlock;
   1331
   1332	gfs2_trans_add_meta(ip->i_gl, indbh);
   1333
   1334	eablk = (__be64 *)(indbh->b_data + sizeof(struct gfs2_meta_header));
   1335	bstart = 0;
   1336	rgd = NULL;
   1337	blen = 0;
   1338
   1339	for (; eablk < end; eablk++) {
   1340		u64 bn;
   1341
   1342		if (!*eablk)
   1343			break;
   1344		bn = be64_to_cpu(*eablk);
   1345
   1346		if (bstart + blen == bn)
   1347			blen++;
   1348		else {
   1349			if (bstart)
   1350				gfs2_free_meta(ip, rgd, bstart, blen);
   1351			bstart = bn;
   1352			rgd = gfs2_blk2rgrpd(sdp, bstart, true);
   1353			blen = 1;
   1354		}
   1355
   1356		*eablk = 0;
   1357		gfs2_add_inode_blocks(&ip->i_inode, -1);
   1358	}
   1359	if (bstart)
   1360		gfs2_free_meta(ip, rgd, bstart, blen);
   1361
   1362	ip->i_diskflags &= ~GFS2_DIF_EA_INDIRECT;
   1363
   1364	error = gfs2_meta_inode_buffer(ip, &dibh);
   1365	if (!error) {
   1366		gfs2_trans_add_meta(ip->i_gl, dibh);
   1367		gfs2_dinode_out(ip, dibh->b_data);
   1368		brelse(dibh);
   1369	}
   1370
   1371	gfs2_trans_end(sdp);
   1372
   1373out_gunlock:
   1374	gfs2_glock_dq_m(rlist.rl_rgrps, rlist.rl_ghs);
   1375out_rlist_free:
   1376	gfs2_rlist_free(&rlist);
   1377out:
   1378	brelse(indbh);
   1379	return error;
   1380}
   1381
   1382static int ea_dealloc_block(struct gfs2_inode *ip)
   1383{
   1384	struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
   1385	struct gfs2_rgrpd *rgd;
   1386	struct buffer_head *dibh;
   1387	struct gfs2_holder gh;
   1388	int error;
   1389
   1390	error = gfs2_rindex_update(sdp);
   1391	if (error)
   1392		return error;
   1393
   1394	rgd = gfs2_blk2rgrpd(sdp, ip->i_eattr, 1);
   1395	if (!rgd) {
   1396		gfs2_consist_inode(ip);
   1397		return -EIO;
   1398	}
   1399
   1400	error = gfs2_glock_nq_init(rgd->rd_gl, LM_ST_EXCLUSIVE,
   1401				   LM_FLAG_NODE_SCOPE, &gh);
   1402	if (error)
   1403		return error;
   1404
   1405	error = gfs2_trans_begin(sdp, RES_RG_BIT + RES_DINODE + RES_STATFS +
   1406				 RES_QUOTA, 1);
   1407	if (error)
   1408		goto out_gunlock;
   1409
   1410	gfs2_free_meta(ip, rgd, ip->i_eattr, 1);
   1411
   1412	ip->i_eattr = 0;
   1413	gfs2_add_inode_blocks(&ip->i_inode, -1);
   1414
   1415	error = gfs2_meta_inode_buffer(ip, &dibh);
   1416	if (!error) {
   1417		gfs2_trans_add_meta(ip->i_gl, dibh);
   1418		gfs2_dinode_out(ip, dibh->b_data);
   1419		brelse(dibh);
   1420	}
   1421
   1422	gfs2_trans_end(sdp);
   1423
   1424out_gunlock:
   1425	gfs2_glock_dq_uninit(&gh);
   1426	return error;
   1427}
   1428
   1429/**
   1430 * gfs2_ea_dealloc - deallocate the extended attribute fork
   1431 * @ip: the inode
   1432 *
   1433 * Returns: errno
   1434 */
   1435
   1436int gfs2_ea_dealloc(struct gfs2_inode *ip)
   1437{
   1438	int error;
   1439
   1440	error = gfs2_rindex_update(GFS2_SB(&ip->i_inode));
   1441	if (error)
   1442		return error;
   1443
   1444	error = gfs2_quota_hold(ip, NO_UID_QUOTA_CHANGE, NO_GID_QUOTA_CHANGE);
   1445	if (error)
   1446		return error;
   1447
   1448	error = ea_foreach(ip, ea_dealloc_unstuffed, NULL);
   1449	if (error)
   1450		goto out_quota;
   1451
   1452	if (ip->i_diskflags & GFS2_DIF_EA_INDIRECT) {
   1453		error = ea_dealloc_indirect(ip);
   1454		if (error)
   1455			goto out_quota;
   1456	}
   1457
   1458	error = ea_dealloc_block(ip);
   1459
   1460out_quota:
   1461	gfs2_quota_unhold(ip);
   1462	return error;
   1463}
   1464
   1465static const struct xattr_handler gfs2_xattr_user_handler = {
   1466	.prefix = XATTR_USER_PREFIX,
   1467	.flags  = GFS2_EATYPE_USR,
   1468	.get    = gfs2_xattr_get,
   1469	.set    = gfs2_xattr_set,
   1470};
   1471
   1472static const struct xattr_handler gfs2_xattr_security_handler = {
   1473	.prefix = XATTR_SECURITY_PREFIX,
   1474	.flags  = GFS2_EATYPE_SECURITY,
   1475	.get    = gfs2_xattr_get,
   1476	.set    = gfs2_xattr_set,
   1477};
   1478
   1479static bool
   1480gfs2_xattr_trusted_list(struct dentry *dentry)
   1481{
   1482	return capable(CAP_SYS_ADMIN);
   1483}
   1484
   1485static const struct xattr_handler gfs2_xattr_trusted_handler = {
   1486	.prefix = XATTR_TRUSTED_PREFIX,
   1487	.flags  = GFS2_EATYPE_TRUSTED,
   1488	.list	= gfs2_xattr_trusted_list,
   1489	.get    = gfs2_xattr_get,
   1490	.set    = gfs2_xattr_set,
   1491};
   1492
   1493const struct xattr_handler *gfs2_xattr_handlers_max[] = {
   1494	/* GFS2_FS_FORMAT_MAX */
   1495	&gfs2_xattr_trusted_handler,
   1496
   1497	/* GFS2_FS_FORMAT_MIN */
   1498	&gfs2_xattr_user_handler,
   1499	&gfs2_xattr_security_handler,
   1500	&posix_acl_access_xattr_handler,
   1501	&posix_acl_default_xattr_handler,
   1502	NULL,
   1503};
   1504
   1505const struct xattr_handler **gfs2_xattr_handlers_min = gfs2_xattr_handlers_max + 1;