]> git.karo-electronics.de Git - karo-tx-linux.git/blob - fs/gfs2/xattr.c
arm: imx6: defconfig: update tx6 defconfigs
[karo-tx-linux.git] / fs / gfs2 / xattr.c
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
40 static 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
58 static 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
74 typedef 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
78 static 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
110 fail:
111         gfs2_consist_inode(ip);
112         return -EIO;
113 }
114
115 static 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         }
153 out:
154         brelse(bh);
155         return error;
156 }
157
158 struct ea_find {
159         int type;
160         const char *name;
161         size_t namel;
162         struct gfs2_ea_location *ef_el;
163 };
164
165 static 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
189 static 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
224 static 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_meta(ip->i_gl, bh);
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_meta(ip->i_gl, dibh);
313                 gfs2_dinode_out(ip, dibh->b_data);
314                 brelse(dibh);
315         }
316
317         gfs2_trans_end(sdp);
318
319 out_gunlock:
320         gfs2_glock_dq_uninit(&rg_gh);
321         return error;
322 }
323
324 static 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);
341 out_alloc:
342         return error;
343 }
344
345 struct ea_list {
346         struct gfs2_ea_request *ei_er;
347         unsigned int ei_size;
348 };
349
350 static inline unsigned int gfs2_ea_strlen(struct gfs2_ea_header *ea)
351 {
352         switch (ea->ea_type) {
353         case GFS2_EATYPE_USR:
354                 return 5 + ea->ea_name_len + 1;
355         case GFS2_EATYPE_SYS:
356                 return 7 + ea->ea_name_len + 1;
357         case GFS2_EATYPE_SECURITY:
358                 return 9 + ea->ea_name_len + 1;
359         default:
360                 return 0;
361         }
362 }
363
364 static int ea_list_i(struct gfs2_inode *ip, struct buffer_head *bh,
365                      struct gfs2_ea_header *ea, struct gfs2_ea_header *prev,
366                      void *private)
367 {
368         struct ea_list *ei = private;
369         struct gfs2_ea_request *er = ei->ei_er;
370         unsigned int ea_size = gfs2_ea_strlen(ea);
371
372         if (ea->ea_type == GFS2_EATYPE_UNUSED)
373                 return 0;
374
375         if (er->er_data_len) {
376                 char *prefix = NULL;
377                 unsigned int l = 0;
378                 char c = 0;
379
380                 if (ei->ei_size + ea_size > er->er_data_len)
381                         return -ERANGE;
382
383                 switch (ea->ea_type) {
384                 case GFS2_EATYPE_USR:
385                         prefix = "user.";
386                         l = 5;
387                         break;
388                 case GFS2_EATYPE_SYS:
389                         prefix = "system.";
390                         l = 7;
391                         break;
392                 case GFS2_EATYPE_SECURITY:
393                         prefix = "security.";
394                         l = 9;
395                         break;
396                 }
397
398                 BUG_ON(l == 0);
399
400                 memcpy(er->er_data + ei->ei_size, prefix, l);
401                 memcpy(er->er_data + ei->ei_size + l, GFS2_EA2NAME(ea),
402                        ea->ea_name_len);
403                 memcpy(er->er_data + ei->ei_size + ea_size - 1, &c, 1);
404         }
405
406         ei->ei_size += ea_size;
407
408         return 0;
409 }
410
411 /**
412  * gfs2_listxattr - List gfs2 extended attributes
413  * @dentry: The dentry whose inode we are interested in
414  * @buffer: The buffer to write the results
415  * @size: The size of the buffer
416  *
417  * Returns: actual size of data on success, -errno on error
418  */
419
420 ssize_t gfs2_listxattr(struct dentry *dentry, char *buffer, size_t size)
421 {
422         struct gfs2_inode *ip = GFS2_I(dentry->d_inode);
423         struct gfs2_ea_request er;
424         struct gfs2_holder i_gh;
425         int error;
426
427         memset(&er, 0, sizeof(struct gfs2_ea_request));
428         if (size) {
429                 er.er_data = buffer;
430                 er.er_data_len = size;
431         }
432
433         error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &i_gh);
434         if (error)
435                 return error;
436
437         if (ip->i_eattr) {
438                 struct ea_list ei = { .ei_er = &er, .ei_size = 0 };
439
440                 error = ea_foreach(ip, ea_list_i, &ei);
441                 if (!error)
442                         error = ei.ei_size;
443         }
444
445         gfs2_glock_dq_uninit(&i_gh);
446
447         return error;
448 }
449
450 /**
451  * ea_iter_unstuffed - copies the unstuffed xattr data to/from the
452  *                     request buffer
453  * @ip: The GFS2 inode
454  * @ea: The extended attribute header structure
455  * @din: The data to be copied in
456  * @dout: The data to be copied out (one of din,dout will be NULL)
457  *
458  * Returns: errno
459  */
460
461 static int gfs2_iter_unstuffed(struct gfs2_inode *ip, struct gfs2_ea_header *ea,
462                                const char *din, char *dout)
463 {
464         struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
465         struct buffer_head **bh;
466         unsigned int amount = GFS2_EA_DATA_LEN(ea);
467         unsigned int nptrs = DIV_ROUND_UP(amount, sdp->sd_jbsize);
468         __be64 *dataptrs = GFS2_EA2DATAPTRS(ea);
469         unsigned int x;
470         int error = 0;
471         unsigned char *pos;
472         unsigned cp_size;
473
474         bh = kcalloc(nptrs, sizeof(struct buffer_head *), GFP_NOFS);
475         if (!bh)
476                 return -ENOMEM;
477
478         for (x = 0; x < nptrs; x++) {
479                 error = gfs2_meta_read(ip->i_gl, be64_to_cpu(*dataptrs), 0,
480                                        bh + x);
481                 if (error) {
482                         while (x--)
483                                 brelse(bh[x]);
484                         goto out;
485                 }
486                 dataptrs++;
487         }
488
489         for (x = 0; x < nptrs; x++) {
490                 error = gfs2_meta_wait(sdp, bh[x]);
491                 if (error) {
492                         for (; x < nptrs; x++)
493                                 brelse(bh[x]);
494                         goto out;
495                 }
496                 if (gfs2_metatype_check(sdp, bh[x], GFS2_METATYPE_ED)) {
497                         for (; x < nptrs; x++)
498                                 brelse(bh[x]);
499                         error = -EIO;
500                         goto out;
501                 }
502
503                 pos = bh[x]->b_data + sizeof(struct gfs2_meta_header);
504                 cp_size = (sdp->sd_jbsize > amount) ? amount : sdp->sd_jbsize;
505
506                 if (dout) {
507                         memcpy(dout, pos, cp_size);
508                         dout += sdp->sd_jbsize;
509                 }
510
511                 if (din) {
512                         gfs2_trans_add_meta(ip->i_gl, bh[x]);
513                         memcpy(pos, din, cp_size);
514                         din += sdp->sd_jbsize;
515                 }
516
517                 amount -= sdp->sd_jbsize;
518                 brelse(bh[x]);
519         }
520
521 out:
522         kfree(bh);
523         return error;
524 }
525
526 static int gfs2_ea_get_copy(struct gfs2_inode *ip, struct gfs2_ea_location *el,
527                             char *data, size_t size)
528 {
529         int ret;
530         size_t len = GFS2_EA_DATA_LEN(el->el_ea);
531         if (len > size)
532                 return -ERANGE;
533
534         if (GFS2_EA_IS_STUFFED(el->el_ea)) {
535                 memcpy(data, GFS2_EA2DATA(el->el_ea), len);
536                 return len;
537         }
538         ret = gfs2_iter_unstuffed(ip, el->el_ea, NULL, data);
539         if (ret < 0)
540                 return ret;
541         return len;
542 }
543
544 int gfs2_xattr_acl_get(struct gfs2_inode *ip, const char *name, char **ppdata)
545 {
546         struct gfs2_ea_location el;
547         int error;
548         int len;
549         char *data;
550
551         error = gfs2_ea_find(ip, GFS2_EATYPE_SYS, name, &el);
552         if (error)
553                 return error;
554         if (!el.el_ea)
555                 goto out;
556         if (!GFS2_EA_DATA_LEN(el.el_ea))
557                 goto out;
558
559         len = GFS2_EA_DATA_LEN(el.el_ea);
560         data = kmalloc(len, GFP_NOFS);
561         error = -ENOMEM;
562         if (data == NULL)
563                 goto out;
564
565         error = gfs2_ea_get_copy(ip, &el, data, len);
566         if (error < 0)
567                 kfree(data);
568         else
569                 *ppdata = data;
570 out:
571         brelse(el.el_bh);
572         return error;
573 }
574
575 /**
576  * gfs2_xattr_get - Get a GFS2 extended attribute
577  * @inode: The inode
578  * @name: The name of the extended attribute
579  * @buffer: The buffer to write the result into
580  * @size: The size of the buffer
581  * @type: The type of extended attribute
582  *
583  * Returns: actual size of data on success, -errno on error
584  */
585 static int gfs2_xattr_get(struct dentry *dentry, const char *name,
586                 void *buffer, size_t size, int type)
587 {
588         struct gfs2_inode *ip = GFS2_I(dentry->d_inode);
589         struct gfs2_ea_location el;
590         int error;
591
592         if (!ip->i_eattr)
593                 return -ENODATA;
594         if (strlen(name) > GFS2_EA_MAX_NAME_LEN)
595                 return -EINVAL;
596
597         error = gfs2_ea_find(ip, type, name, &el);
598         if (error)
599                 return error;
600         if (!el.el_ea)
601                 return -ENODATA;
602         if (size)
603                 error = gfs2_ea_get_copy(ip, &el, buffer, size);
604         else
605                 error = GFS2_EA_DATA_LEN(el.el_ea);
606         brelse(el.el_bh);
607
608         return error;
609 }
610
611 /**
612  * ea_alloc_blk - allocates a new block for extended attributes.
613  * @ip: A pointer to the inode that's getting extended attributes
614  * @bhp: Pointer to pointer to a struct buffer_head
615  *
616  * Returns: errno
617  */
618
619 static int ea_alloc_blk(struct gfs2_inode *ip, struct buffer_head **bhp)
620 {
621         struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
622         struct gfs2_ea_header *ea;
623         unsigned int n = 1;
624         u64 block;
625         int error;
626
627         error = gfs2_alloc_blocks(ip, &block, &n, 0, NULL);
628         if (error)
629                 return error;
630         gfs2_trans_add_unrevoke(sdp, block, 1);
631         *bhp = gfs2_meta_new(ip->i_gl, block);
632         gfs2_trans_add_meta(ip->i_gl, *bhp);
633         gfs2_metatype_set(*bhp, GFS2_METATYPE_EA, GFS2_FORMAT_EA);
634         gfs2_buffer_clear_tail(*bhp, sizeof(struct gfs2_meta_header));
635
636         ea = GFS2_EA_BH2FIRST(*bhp);
637         ea->ea_rec_len = cpu_to_be32(sdp->sd_jbsize);
638         ea->ea_type = GFS2_EATYPE_UNUSED;
639         ea->ea_flags = GFS2_EAFLAG_LAST;
640         ea->ea_num_ptrs = 0;
641
642         gfs2_add_inode_blocks(&ip->i_inode, 1);
643
644         return 0;
645 }
646
647 /**
648  * ea_write - writes the request info to an ea, creating new blocks if
649  *            necessary
650  * @ip: inode that is being modified
651  * @ea: the location of the new ea in a block
652  * @er: the write request
653  *
654  * Note: does not update ea_rec_len or the GFS2_EAFLAG_LAST bin of ea_flags
655  *
656  * returns : errno
657  */
658
659 static int ea_write(struct gfs2_inode *ip, struct gfs2_ea_header *ea,
660                     struct gfs2_ea_request *er)
661 {
662         struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
663         int error;
664
665         ea->ea_data_len = cpu_to_be32(er->er_data_len);
666         ea->ea_name_len = er->er_name_len;
667         ea->ea_type = er->er_type;
668         ea->__pad = 0;
669
670         memcpy(GFS2_EA2NAME(ea), er->er_name, er->er_name_len);
671
672         if (GFS2_EAREQ_SIZE_STUFFED(er) <= sdp->sd_jbsize) {
673                 ea->ea_num_ptrs = 0;
674                 memcpy(GFS2_EA2DATA(ea), er->er_data, er->er_data_len);
675         } else {
676                 __be64 *dataptr = GFS2_EA2DATAPTRS(ea);
677                 const char *data = er->er_data;
678                 unsigned int data_len = er->er_data_len;
679                 unsigned int copy;
680                 unsigned int x;
681
682                 ea->ea_num_ptrs = DIV_ROUND_UP(er->er_data_len, sdp->sd_jbsize);
683                 for (x = 0; x < ea->ea_num_ptrs; x++) {
684                         struct buffer_head *bh;
685                         u64 block;
686                         int mh_size = sizeof(struct gfs2_meta_header);
687                         unsigned int n = 1;
688
689                         error = gfs2_alloc_blocks(ip, &block, &n, 0, NULL);
690                         if (error)
691                                 return error;
692                         gfs2_trans_add_unrevoke(sdp, block, 1);
693                         bh = gfs2_meta_new(ip->i_gl, block);
694                         gfs2_trans_add_meta(ip->i_gl, bh);
695                         gfs2_metatype_set(bh, GFS2_METATYPE_ED, GFS2_FORMAT_ED);
696
697                         gfs2_add_inode_blocks(&ip->i_inode, 1);
698
699                         copy = data_len > sdp->sd_jbsize ? sdp->sd_jbsize :
700                                                            data_len;
701                         memcpy(bh->b_data + mh_size, data, copy);
702                         if (copy < sdp->sd_jbsize)
703                                 memset(bh->b_data + mh_size + copy, 0,
704                                        sdp->sd_jbsize - copy);
705
706                         *dataptr++ = cpu_to_be64(bh->b_blocknr);
707                         data += copy;
708                         data_len -= copy;
709
710                         brelse(bh);
711                 }
712
713                 gfs2_assert_withdraw(sdp, !data_len);
714         }
715
716         return 0;
717 }
718
719 typedef int (*ea_skeleton_call_t) (struct gfs2_inode *ip,
720                                    struct gfs2_ea_request *er, void *private);
721
722 static int ea_alloc_skeleton(struct gfs2_inode *ip, struct gfs2_ea_request *er,
723                              unsigned int blks,
724                              ea_skeleton_call_t skeleton_call, void *private)
725 {
726         struct gfs2_alloc_parms ap = { .target = blks };
727         struct buffer_head *dibh;
728         int error;
729
730         error = gfs2_rindex_update(GFS2_SB(&ip->i_inode));
731         if (error)
732                 return error;
733
734         error = gfs2_quota_lock_check(ip);
735         if (error)
736                 return error;
737
738         error = gfs2_inplace_reserve(ip, &ap);
739         if (error)
740                 goto out_gunlock_q;
741
742         error = gfs2_trans_begin(GFS2_SB(&ip->i_inode),
743                                  blks + gfs2_rg_blocks(ip, blks) +
744                                  RES_DINODE + RES_STATFS + RES_QUOTA, 0);
745         if (error)
746                 goto out_ipres;
747
748         error = skeleton_call(ip, er, private);
749         if (error)
750                 goto out_end_trans;
751
752         error = gfs2_meta_inode_buffer(ip, &dibh);
753         if (!error) {
754                 ip->i_inode.i_ctime = CURRENT_TIME;
755                 gfs2_trans_add_meta(ip->i_gl, dibh);
756                 gfs2_dinode_out(ip, dibh->b_data);
757                 brelse(dibh);
758         }
759
760 out_end_trans:
761         gfs2_trans_end(GFS2_SB(&ip->i_inode));
762 out_ipres:
763         gfs2_inplace_release(ip);
764 out_gunlock_q:
765         gfs2_quota_unlock(ip);
766         return error;
767 }
768
769 static int ea_init_i(struct gfs2_inode *ip, struct gfs2_ea_request *er,
770                      void *private)
771 {
772         struct buffer_head *bh;
773         int error;
774
775         error = ea_alloc_blk(ip, &bh);
776         if (error)
777                 return error;
778
779         ip->i_eattr = bh->b_blocknr;
780         error = ea_write(ip, GFS2_EA_BH2FIRST(bh), er);
781
782         brelse(bh);
783
784         return error;
785 }
786
787 /**
788  * ea_init - initializes a new eattr block
789  * @ip:
790  * @er:
791  *
792  * Returns: errno
793  */
794
795 static int ea_init(struct gfs2_inode *ip, int type, const char *name,
796                    const void *data, size_t size)
797 {
798         struct gfs2_ea_request er;
799         unsigned int jbsize = GFS2_SB(&ip->i_inode)->sd_jbsize;
800         unsigned int blks = 1;
801
802         er.er_type = type;
803         er.er_name = name;
804         er.er_name_len = strlen(name);
805         er.er_data = (void *)data;
806         er.er_data_len = size;
807
808         if (GFS2_EAREQ_SIZE_STUFFED(&er) > jbsize)
809                 blks += DIV_ROUND_UP(er.er_data_len, jbsize);
810
811         return ea_alloc_skeleton(ip, &er, blks, ea_init_i, NULL);
812 }
813
814 static struct gfs2_ea_header *ea_split_ea(struct gfs2_ea_header *ea)
815 {
816         u32 ea_size = GFS2_EA_SIZE(ea);
817         struct gfs2_ea_header *new = (struct gfs2_ea_header *)((char *)ea +
818                                      ea_size);
819         u32 new_size = GFS2_EA_REC_LEN(ea) - ea_size;
820         int last = ea->ea_flags & GFS2_EAFLAG_LAST;
821
822         ea->ea_rec_len = cpu_to_be32(ea_size);
823         ea->ea_flags ^= last;
824
825         new->ea_rec_len = cpu_to_be32(new_size);
826         new->ea_flags = last;
827
828         return new;
829 }
830
831 static void ea_set_remove_stuffed(struct gfs2_inode *ip,
832                                   struct gfs2_ea_location *el)
833 {
834         struct gfs2_ea_header *ea = el->el_ea;
835         struct gfs2_ea_header *prev = el->el_prev;
836         u32 len;
837
838         gfs2_trans_add_meta(ip->i_gl, el->el_bh);
839
840         if (!prev || !GFS2_EA_IS_STUFFED(ea)) {
841                 ea->ea_type = GFS2_EATYPE_UNUSED;
842                 return;
843         } else if (GFS2_EA2NEXT(prev) != ea) {
844                 prev = GFS2_EA2NEXT(prev);
845                 gfs2_assert_withdraw(GFS2_SB(&ip->i_inode), GFS2_EA2NEXT(prev) == ea);
846         }
847
848         len = GFS2_EA_REC_LEN(prev) + GFS2_EA_REC_LEN(ea);
849         prev->ea_rec_len = cpu_to_be32(len);
850
851         if (GFS2_EA_IS_LAST(ea))
852                 prev->ea_flags |= GFS2_EAFLAG_LAST;
853 }
854
855 struct ea_set {
856         int ea_split;
857
858         struct gfs2_ea_request *es_er;
859         struct gfs2_ea_location *es_el;
860
861         struct buffer_head *es_bh;
862         struct gfs2_ea_header *es_ea;
863 };
864
865 static int ea_set_simple_noalloc(struct gfs2_inode *ip, struct buffer_head *bh,
866                                  struct gfs2_ea_header *ea, struct ea_set *es)
867 {
868         struct gfs2_ea_request *er = es->es_er;
869         struct buffer_head *dibh;
870         int error;
871
872         error = gfs2_trans_begin(GFS2_SB(&ip->i_inode), RES_DINODE + 2 * RES_EATTR, 0);
873         if (error)
874                 return error;
875
876         gfs2_trans_add_meta(ip->i_gl, bh);
877
878         if (es->ea_split)
879                 ea = ea_split_ea(ea);
880
881         ea_write(ip, ea, er);
882
883         if (es->es_el)
884                 ea_set_remove_stuffed(ip, es->es_el);
885
886         error = gfs2_meta_inode_buffer(ip, &dibh);
887         if (error)
888                 goto out;
889         ip->i_inode.i_ctime = CURRENT_TIME;
890         gfs2_trans_add_meta(ip->i_gl, dibh);
891         gfs2_dinode_out(ip, dibh->b_data);
892         brelse(dibh);
893 out:
894         gfs2_trans_end(GFS2_SB(&ip->i_inode));
895         return error;
896 }
897
898 static 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
920 static 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
967 static 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,
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_add_unrevoke(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
1036 out:
1037         brelse(indbh);
1038         return error;
1039 }
1040
1041 static 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
1073 static 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
1085 static 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         struct buffer_head *dibh;
1090         int error;
1091
1092         error = gfs2_trans_begin(GFS2_SB(&ip->i_inode), RES_DINODE + RES_EATTR, 0);
1093         if (error)
1094                 return error;
1095
1096         gfs2_trans_add_meta(ip->i_gl, el->el_bh);
1097
1098         if (prev) {
1099                 u32 len;
1100
1101                 len = GFS2_EA_REC_LEN(prev) + GFS2_EA_REC_LEN(ea);
1102                 prev->ea_rec_len = cpu_to_be32(len);
1103
1104                 if (GFS2_EA_IS_LAST(ea))
1105                         prev->ea_flags |= GFS2_EAFLAG_LAST;
1106         } else {
1107                 ea->ea_type = GFS2_EATYPE_UNUSED;
1108         }
1109
1110         error = gfs2_meta_inode_buffer(ip, &dibh);
1111         if (!error) {
1112                 ip->i_inode.i_ctime = CURRENT_TIME;
1113                 gfs2_trans_add_meta(ip->i_gl, dibh);
1114                 gfs2_dinode_out(ip, dibh->b_data);
1115                 brelse(dibh);
1116         }
1117
1118         gfs2_trans_end(GFS2_SB(&ip->i_inode));
1119
1120         return error;
1121 }
1122
1123 /**
1124  * gfs2_xattr_remove - Remove a GFS2 extended attribute
1125  * @ip: The inode
1126  * @type: The type of the extended attribute
1127  * @name: The name of the extended attribute
1128  *
1129  * This is not called directly by the VFS since we use the (common)
1130  * scheme of making a "set with NULL data" mean a remove request. Note
1131  * that this is different from a set with zero length data.
1132  *
1133  * Returns: 0, or errno on failure
1134  */
1135
1136 static int gfs2_xattr_remove(struct gfs2_inode *ip, int type, const char *name)
1137 {
1138         struct gfs2_ea_location el;
1139         int error;
1140
1141         if (!ip->i_eattr)
1142                 return -ENODATA;
1143
1144         error = gfs2_ea_find(ip, type, name, &el);
1145         if (error)
1146                 return error;
1147         if (!el.el_ea)
1148                 return -ENODATA;
1149
1150         if (GFS2_EA_IS_STUFFED(el.el_ea))
1151                 error = ea_remove_stuffed(ip, &el);
1152         else
1153                 error = ea_remove_unstuffed(ip, el.el_bh, el.el_ea, el.el_prev, 0);
1154
1155         brelse(el.el_bh);
1156
1157         return error;
1158 }
1159
1160 /**
1161  * __gfs2_xattr_set - Set (or remove) a GFS2 extended attribute
1162  * @ip: The inode
1163  * @name: The name of the extended attribute
1164  * @value: The value of the extended attribute (NULL for remove)
1165  * @size: The size of the @value argument
1166  * @flags: Create or Replace
1167  * @type: The type of the extended attribute
1168  *
1169  * See gfs2_xattr_remove() for details of the removal of xattrs.
1170  *
1171  * Returns: 0 or errno on failure
1172  */
1173
1174 int __gfs2_xattr_set(struct inode *inode, const char *name,
1175                    const void *value, size_t size, int flags, int type)
1176 {
1177         struct gfs2_inode *ip = GFS2_I(inode);
1178         struct gfs2_sbd *sdp = GFS2_SB(inode);
1179         struct gfs2_ea_location el;
1180         unsigned int namel = strlen(name);
1181         int error;
1182
1183         if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
1184                 return -EPERM;
1185         if (namel > GFS2_EA_MAX_NAME_LEN)
1186                 return -ERANGE;
1187
1188         if (value == NULL)
1189                 return gfs2_xattr_remove(ip, type, name);
1190
1191         if (ea_check_size(sdp, namel, size))
1192                 return -ERANGE;
1193
1194         if (!ip->i_eattr) {
1195                 if (flags & XATTR_REPLACE)
1196                         return -ENODATA;
1197                 return ea_init(ip, type, name, value, size);
1198         }
1199
1200         error = gfs2_ea_find(ip, type, name, &el);
1201         if (error)
1202                 return error;
1203
1204         if (el.el_ea) {
1205                 if (ip->i_diskflags & GFS2_DIF_APPENDONLY) {
1206                         brelse(el.el_bh);
1207                         return -EPERM;
1208                 }
1209
1210                 error = -EEXIST;
1211                 if (!(flags & XATTR_CREATE)) {
1212                         int unstuffed = !GFS2_EA_IS_STUFFED(el.el_ea);
1213                         error = ea_set_i(ip, type, name, value, size, &el);
1214                         if (!error && unstuffed)
1215                                 ea_set_remove_unstuffed(ip, &el);
1216                 }
1217
1218                 brelse(el.el_bh);
1219                 return error;
1220         }
1221
1222         error = -ENODATA;
1223         if (!(flags & XATTR_REPLACE))
1224                 error = ea_set_i(ip, type, name, value, size, NULL);
1225
1226         return error;
1227 }
1228
1229 static int gfs2_xattr_set(struct dentry *dentry, const char *name,
1230                 const void *value, size_t size, int flags, int type)
1231 {
1232         return __gfs2_xattr_set(dentry->d_inode, name, value,
1233                                 size, flags, type);
1234 }
1235
1236
1237 static int ea_acl_chmod_unstuffed(struct gfs2_inode *ip,
1238                                   struct gfs2_ea_header *ea, char *data)
1239 {
1240         struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
1241         unsigned int amount = GFS2_EA_DATA_LEN(ea);
1242         unsigned int nptrs = DIV_ROUND_UP(amount, sdp->sd_jbsize);
1243         int ret;
1244
1245         ret = gfs2_trans_begin(sdp, nptrs + RES_DINODE, 0);
1246         if (ret)
1247                 return ret;
1248
1249         ret = gfs2_iter_unstuffed(ip, ea, data, NULL);
1250         gfs2_trans_end(sdp);
1251
1252         return ret;
1253 }
1254
1255 int gfs2_xattr_acl_chmod(struct gfs2_inode *ip, struct iattr *attr, char *data)
1256 {
1257         struct inode *inode = &ip->i_inode;
1258         struct gfs2_sbd *sdp = GFS2_SB(inode);
1259         struct gfs2_ea_location el;
1260         int error;
1261
1262         error = gfs2_ea_find(ip, GFS2_EATYPE_SYS, GFS2_POSIX_ACL_ACCESS, &el);
1263         if (error)
1264                 return error;
1265
1266         if (GFS2_EA_IS_STUFFED(el.el_ea)) {
1267                 error = gfs2_trans_begin(sdp, RES_DINODE + RES_EATTR, 0);
1268                 if (error == 0) {
1269                         gfs2_trans_add_meta(ip->i_gl, el.el_bh);
1270                         memcpy(GFS2_EA2DATA(el.el_ea), data,
1271                                GFS2_EA_DATA_LEN(el.el_ea));
1272                 }
1273         } else {
1274                 error = ea_acl_chmod_unstuffed(ip, el.el_ea, data);
1275         }
1276
1277         brelse(el.el_bh);
1278         if (error)
1279                 return error;
1280
1281         error = gfs2_setattr_simple(inode, attr);
1282         gfs2_trans_end(sdp);
1283         return error;
1284 }
1285
1286 static int ea_dealloc_indirect(struct gfs2_inode *ip)
1287 {
1288         struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
1289         struct gfs2_rgrp_list rlist;
1290         struct buffer_head *indbh, *dibh;
1291         __be64 *eablk, *end;
1292         unsigned int rg_blocks = 0;
1293         u64 bstart = 0;
1294         unsigned int blen = 0;
1295         unsigned int blks = 0;
1296         unsigned int x;
1297         int error;
1298
1299         error = gfs2_rindex_update(sdp);
1300         if (error)
1301                 return error;
1302
1303         memset(&rlist, 0, sizeof(struct gfs2_rgrp_list));
1304
1305         error = gfs2_meta_read(ip->i_gl, ip->i_eattr, DIO_WAIT, &indbh);
1306         if (error)
1307                 return error;
1308
1309         if (gfs2_metatype_check(sdp, indbh, GFS2_METATYPE_IN)) {
1310                 error = -EIO;
1311                 goto out;
1312         }
1313
1314         eablk = (__be64 *)(indbh->b_data + sizeof(struct gfs2_meta_header));
1315         end = eablk + sdp->sd_inptrs;
1316
1317         for (; eablk < end; eablk++) {
1318                 u64 bn;
1319
1320                 if (!*eablk)
1321                         break;
1322                 bn = be64_to_cpu(*eablk);
1323
1324                 if (bstart + blen == bn)
1325                         blen++;
1326                 else {
1327                         if (bstart)
1328                                 gfs2_rlist_add(ip, &rlist, bstart);
1329                         bstart = bn;
1330                         blen = 1;
1331                 }
1332                 blks++;
1333         }
1334         if (bstart)
1335                 gfs2_rlist_add(ip, &rlist, bstart);
1336         else
1337                 goto out;
1338
1339         gfs2_rlist_alloc(&rlist, LM_ST_EXCLUSIVE);
1340
1341         for (x = 0; x < rlist.rl_rgrps; x++) {
1342                 struct gfs2_rgrpd *rgd;
1343                 rgd = rlist.rl_ghs[x].gh_gl->gl_object;
1344                 rg_blocks += rgd->rd_length;
1345         }
1346
1347         error = gfs2_glock_nq_m(rlist.rl_rgrps, rlist.rl_ghs);
1348         if (error)
1349                 goto out_rlist_free;
1350
1351         error = gfs2_trans_begin(sdp, rg_blocks + RES_DINODE + RES_INDIRECT +
1352                                  RES_STATFS + RES_QUOTA, blks);
1353         if (error)
1354                 goto out_gunlock;
1355
1356         gfs2_trans_add_meta(ip->i_gl, indbh);
1357
1358         eablk = (__be64 *)(indbh->b_data + sizeof(struct gfs2_meta_header));
1359         bstart = 0;
1360         blen = 0;
1361
1362         for (; eablk < end; eablk++) {
1363                 u64 bn;
1364
1365                 if (!*eablk)
1366                         break;
1367                 bn = be64_to_cpu(*eablk);
1368
1369                 if (bstart + blen == bn)
1370                         blen++;
1371                 else {
1372                         if (bstart)
1373                                 gfs2_free_meta(ip, bstart, blen);
1374                         bstart = bn;
1375                         blen = 1;
1376                 }
1377
1378                 *eablk = 0;
1379                 gfs2_add_inode_blocks(&ip->i_inode, -1);
1380         }
1381         if (bstart)
1382                 gfs2_free_meta(ip, bstart, blen);
1383
1384         ip->i_diskflags &= ~GFS2_DIF_EA_INDIRECT;
1385
1386         error = gfs2_meta_inode_buffer(ip, &dibh);
1387         if (!error) {
1388                 gfs2_trans_add_meta(ip->i_gl, dibh);
1389                 gfs2_dinode_out(ip, dibh->b_data);
1390                 brelse(dibh);
1391         }
1392
1393         gfs2_trans_end(sdp);
1394
1395 out_gunlock:
1396         gfs2_glock_dq_m(rlist.rl_rgrps, rlist.rl_ghs);
1397 out_rlist_free:
1398         gfs2_rlist_free(&rlist);
1399 out:
1400         brelse(indbh);
1401         return error;
1402 }
1403
1404 static int ea_dealloc_block(struct gfs2_inode *ip)
1405 {
1406         struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
1407         struct gfs2_rgrpd *rgd;
1408         struct buffer_head *dibh;
1409         struct gfs2_holder gh;
1410         int error;
1411
1412         error = gfs2_rindex_update(sdp);
1413         if (error)
1414                 return error;
1415
1416         rgd = gfs2_blk2rgrpd(sdp, ip->i_eattr, 1);
1417         if (!rgd) {
1418                 gfs2_consist_inode(ip);
1419                 return -EIO;
1420         }
1421
1422         error = gfs2_glock_nq_init(rgd->rd_gl, LM_ST_EXCLUSIVE, 0, &gh);
1423         if (error)
1424                 return error;
1425
1426         error = gfs2_trans_begin(sdp, RES_RG_BIT + RES_DINODE + RES_STATFS +
1427                                  RES_QUOTA, 1);
1428         if (error)
1429                 goto out_gunlock;
1430
1431         gfs2_free_meta(ip, ip->i_eattr, 1);
1432
1433         ip->i_eattr = 0;
1434         gfs2_add_inode_blocks(&ip->i_inode, -1);
1435
1436         error = gfs2_meta_inode_buffer(ip, &dibh);
1437         if (!error) {
1438                 gfs2_trans_add_meta(ip->i_gl, dibh);
1439                 gfs2_dinode_out(ip, dibh->b_data);
1440                 brelse(dibh);
1441         }
1442
1443         gfs2_trans_end(sdp);
1444
1445 out_gunlock:
1446         gfs2_glock_dq_uninit(&gh);
1447         return error;
1448 }
1449
1450 /**
1451  * gfs2_ea_dealloc - deallocate the extended attribute fork
1452  * @ip: the inode
1453  *
1454  * Returns: errno
1455  */
1456
1457 int gfs2_ea_dealloc(struct gfs2_inode *ip)
1458 {
1459         int error;
1460
1461         error = gfs2_rindex_update(GFS2_SB(&ip->i_inode));
1462         if (error)
1463                 return error;
1464
1465         error = gfs2_quota_hold(ip, NO_UID_QUOTA_CHANGE, NO_GID_QUOTA_CHANGE);
1466         if (error)
1467                 return error;
1468
1469         error = ea_foreach(ip, ea_dealloc_unstuffed, NULL);
1470         if (error)
1471                 goto out_quota;
1472
1473         if (ip->i_diskflags & GFS2_DIF_EA_INDIRECT) {
1474                 error = ea_dealloc_indirect(ip);
1475                 if (error)
1476                         goto out_quota;
1477         }
1478
1479         error = ea_dealloc_block(ip);
1480
1481 out_quota:
1482         gfs2_quota_unhold(ip);
1483         return error;
1484 }
1485
1486 static const struct xattr_handler gfs2_xattr_user_handler = {
1487         .prefix = XATTR_USER_PREFIX,
1488         .flags  = GFS2_EATYPE_USR,
1489         .get    = gfs2_xattr_get,
1490         .set    = gfs2_xattr_set,
1491 };
1492
1493 static const struct xattr_handler gfs2_xattr_security_handler = {
1494         .prefix = XATTR_SECURITY_PREFIX,
1495         .flags  = GFS2_EATYPE_SECURITY,
1496         .get    = gfs2_xattr_get,
1497         .set    = gfs2_xattr_set,
1498 };
1499
1500 const struct xattr_handler *gfs2_xattr_handlers[] = {
1501         &gfs2_xattr_user_handler,
1502         &gfs2_xattr_security_handler,
1503         &gfs2_xattr_system_handler,
1504         NULL,
1505 };
1506