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