blob: f2709ea887da9ef164ab28a8857625f495cbc8fc [file] [log] [blame]
David Teiglandb3b94fa2006-01-16 16:50:04 +00001/*
2 * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
Steven Whitehousef2741d92011-05-13 12:11:17 +01003 * Copyright (C) 2004-2011 Red Hat, Inc. All rights reserved.
David Teiglandb3b94fa2006-01-16 16:50:04 +00004 *
5 * This copyrighted material is made available to anyone wishing to use,
6 * modify, copy, or redistribute it subject to the terms and conditions
Steven Whitehousee9fc2aa2006-09-01 11:05:15 -04007 * of the GNU General Public License version 2.
David Teiglandb3b94fa2006-01-16 16:50:04 +00008 */
9
David Teiglandb3b94fa2006-01-16 16:50:04 +000010#include <linux/slab.h>
11#include <linux/spinlock.h>
12#include <linux/completion.h>
13#include <linux/buffer_head.h>
14#include <linux/namei.h>
David Teiglandb3b94fa2006-01-16 16:50:04 +000015#include <linux/mm.h>
16#include <linux/xattr.h>
17#include <linux/posix_acl.h>
Steven Whitehouse5c676f62006-02-27 17:23:27 -050018#include <linux/gfs2_ondisk.h>
Steven Whitehouse71b86f52006-03-28 14:14:04 -050019#include <linux/crc32.h>
Steven Whitehousee9079cc2008-10-14 14:43:29 +010020#include <linux/fiemap.h>
Steven Whitehouse194c0112011-05-09 14:06:38 +010021#include <linux/security.h>
David Teiglandb3b94fa2006-01-16 16:50:04 +000022#include <asm/uaccess.h>
23
24#include "gfs2.h"
Steven Whitehouse5c676f62006-02-27 17:23:27 -050025#include "incore.h"
David Teiglandb3b94fa2006-01-16 16:50:04 +000026#include "acl.h"
27#include "bmap.h"
28#include "dir.h"
Steven Whitehouse307cf6e2009-08-26 18:51:04 +010029#include "xattr.h"
David Teiglandb3b94fa2006-01-16 16:50:04 +000030#include "glock.h"
31#include "inode.h"
32#include "meta_io.h"
David Teiglandb3b94fa2006-01-16 16:50:04 +000033#include "quota.h"
34#include "rgrp.h"
35#include "trans.h"
Steven Whitehouse5c676f62006-02-27 17:23:27 -050036#include "util.h"
Steven Whitehouseb2760582008-10-14 16:05:55 +010037#include "super.h"
Steven Whitehouse194c0112011-05-09 14:06:38 +010038#include "glops.h"
David Teiglandb3b94fa2006-01-16 16:50:04 +000039
Steven Whitehouse194c0112011-05-09 14:06:38 +010040struct gfs2_skip_data {
41 u64 no_addr;
42 int skipped;
43 int non_block;
44};
45
46static int iget_test(struct inode *inode, void *opaque)
47{
48 struct gfs2_inode *ip = GFS2_I(inode);
49 struct gfs2_skip_data *data = opaque;
50
51 if (ip->i_no_addr == data->no_addr) {
52 if (data->non_block &&
53 inode->i_state & (I_FREEING|I_CLEAR|I_WILL_FREE)) {
54 data->skipped = 1;
55 return 0;
56 }
57 return 1;
58 }
59 return 0;
60}
61
62static int iget_set(struct inode *inode, void *opaque)
63{
64 struct gfs2_inode *ip = GFS2_I(inode);
65 struct gfs2_skip_data *data = opaque;
66
67 if (data->skipped)
68 return -ENOENT;
69 inode->i_ino = (unsigned long)(data->no_addr);
70 ip->i_no_addr = data->no_addr;
71 return 0;
72}
73
74struct inode *gfs2_ilookup(struct super_block *sb, u64 no_addr, int non_block)
75{
76 unsigned long hash = (unsigned long)no_addr;
77 struct gfs2_skip_data data;
78
79 data.no_addr = no_addr;
80 data.skipped = 0;
81 data.non_block = non_block;
82 return ilookup5(sb, hash, iget_test, &data);
83}
84
85static struct inode *gfs2_iget(struct super_block *sb, u64 no_addr,
86 int non_block)
87{
88 struct gfs2_skip_data data;
89 unsigned long hash = (unsigned long)no_addr;
90
91 data.no_addr = no_addr;
92 data.skipped = 0;
93 data.non_block = non_block;
94 return iget5_locked(sb, hash, iget_test, iget_set, &data);
95}
96
97/**
98 * gfs2_set_iop - Sets inode operations
99 * @inode: The inode with correct i_mode filled in
100 *
101 * GFS2 lookup code fills in vfs inode contents based on info obtained
102 * from directory entry inside gfs2_inode_lookup().
103 */
104
105static void gfs2_set_iop(struct inode *inode)
106{
107 struct gfs2_sbd *sdp = GFS2_SB(inode);
108 umode_t mode = inode->i_mode;
109
110 if (S_ISREG(mode)) {
111 inode->i_op = &gfs2_file_iops;
112 if (gfs2_localflocks(sdp))
113 inode->i_fop = &gfs2_file_fops_nolock;
114 else
115 inode->i_fop = &gfs2_file_fops;
116 } else if (S_ISDIR(mode)) {
117 inode->i_op = &gfs2_dir_iops;
118 if (gfs2_localflocks(sdp))
119 inode->i_fop = &gfs2_dir_fops_nolock;
120 else
121 inode->i_fop = &gfs2_dir_fops;
122 } else if (S_ISLNK(mode)) {
123 inode->i_op = &gfs2_symlink_iops;
124 } else {
125 inode->i_op = &gfs2_file_iops;
126 init_special_inode(inode, inode->i_mode, inode->i_rdev);
127 }
128}
129
130/**
131 * gfs2_inode_lookup - Lookup an inode
132 * @sb: The super block
133 * @no_addr: The inode number
134 * @type: The type of the inode
135 * non_block: Can we block on inodes that are being freed?
136 *
137 * Returns: A VFS inode, or an error
138 */
139
140struct inode *gfs2_inode_lookup(struct super_block *sb, unsigned int type,
141 u64 no_addr, u64 no_formal_ino, int non_block)
142{
143 struct inode *inode;
144 struct gfs2_inode *ip;
145 struct gfs2_glock *io_gl = NULL;
146 int error;
147
148 inode = gfs2_iget(sb, no_addr, non_block);
149 ip = GFS2_I(inode);
150
151 if (!inode)
152 return ERR_PTR(-ENOBUFS);
153
154 if (inode->i_state & I_NEW) {
155 struct gfs2_sbd *sdp = GFS2_SB(inode);
156 ip->i_no_formal_ino = no_formal_ino;
157
158 error = gfs2_glock_get(sdp, no_addr, &gfs2_inode_glops, CREATE, &ip->i_gl);
159 if (unlikely(error))
160 goto fail;
161 ip->i_gl->gl_object = ip;
162
163 error = gfs2_glock_get(sdp, no_addr, &gfs2_iopen_glops, CREATE, &io_gl);
164 if (unlikely(error))
165 goto fail_put;
166
167 set_bit(GIF_INVALID, &ip->i_flags);
168 error = gfs2_glock_nq_init(io_gl, LM_ST_SHARED, GL_EXACT, &ip->i_iopen_gh);
169 if (unlikely(error))
170 goto fail_iopen;
171
172 ip->i_iopen_gh.gh_gl->gl_object = ip;
173 gfs2_glock_put(io_gl);
174 io_gl = NULL;
175
176 if (type == DT_UNKNOWN) {
177 /* Inode glock must be locked already */
178 error = gfs2_inode_refresh(GFS2_I(inode));
179 if (error)
180 goto fail_refresh;
181 } else {
182 inode->i_mode = DT2IF(type);
183 }
184
185 gfs2_set_iop(inode);
186 unlock_new_inode(inode);
187 }
188
189 return inode;
190
191fail_refresh:
192 ip->i_iopen_gh.gh_gl->gl_object = NULL;
193 gfs2_glock_dq_uninit(&ip->i_iopen_gh);
194fail_iopen:
195 if (io_gl)
196 gfs2_glock_put(io_gl);
197fail_put:
198 ip->i_gl->gl_object = NULL;
199 gfs2_glock_put(ip->i_gl);
200fail:
201 iget_failed(inode);
202 return ERR_PTR(error);
203}
204
205struct inode *gfs2_lookup_by_inum(struct gfs2_sbd *sdp, u64 no_addr,
206 u64 *no_formal_ino, unsigned int blktype)
207{
208 struct super_block *sb = sdp->sd_vfs;
209 struct gfs2_holder i_gh;
210 struct inode *inode = NULL;
211 int error;
212
213 /* Must not read in block until block type is verified */
214 error = gfs2_glock_nq_num(sdp, no_addr, &gfs2_inode_glops,
215 LM_ST_EXCLUSIVE, GL_SKIP, &i_gh);
216 if (error)
217 return ERR_PTR(error);
218
219 error = gfs2_check_blk_type(sdp, no_addr, blktype);
220 if (error)
221 goto fail;
222
223 inode = gfs2_inode_lookup(sb, DT_UNKNOWN, no_addr, 0, 1);
224 if (IS_ERR(inode))
225 goto fail;
226
227 /* Two extra checks for NFS only */
228 if (no_formal_ino) {
229 error = -ESTALE;
230 if (GFS2_I(inode)->i_no_formal_ino != *no_formal_ino)
231 goto fail_iput;
232
233 error = -EIO;
234 if (GFS2_I(inode)->i_diskflags & GFS2_DIF_SYSTEM)
235 goto fail_iput;
236
237 error = 0;
238 }
239
240fail:
241 gfs2_glock_dq_uninit(&i_gh);
242 return error ? ERR_PTR(error) : inode;
243fail_iput:
244 iput(inode);
245 goto fail;
246}
247
248
249struct inode *gfs2_lookup_simple(struct inode *dip, const char *name)
250{
251 struct qstr qstr;
252 struct inode *inode;
253 gfs2_str2qstr(&qstr, name);
254 inode = gfs2_lookupi(dip, &qstr, 1);
255 /* gfs2_lookupi has inconsistent callers: vfs
256 * related routines expect NULL for no entry found,
257 * gfs2_lookup_simple callers expect ENOENT
258 * and do not check for NULL.
259 */
260 if (inode == NULL)
261 return ERR_PTR(-ENOENT);
262 else
263 return inode;
264}
265
266
267/**
268 * gfs2_lookupi - Look up a filename in a directory and return its inode
269 * @d_gh: An initialized holder for the directory glock
270 * @name: The name of the inode to look for
271 * @is_root: If 1, ignore the caller's permissions
272 * @i_gh: An uninitialized holder for the new inode glock
273 *
274 * This can be called via the VFS filldir function when NFS is doing
275 * a readdirplus and the inode which its intending to stat isn't
276 * already in cache. In this case we must not take the directory glock
277 * again, since the readdir call will have already taken that lock.
278 *
279 * Returns: errno
280 */
281
282struct inode *gfs2_lookupi(struct inode *dir, const struct qstr *name,
283 int is_root)
284{
285 struct super_block *sb = dir->i_sb;
286 struct gfs2_inode *dip = GFS2_I(dir);
287 struct gfs2_holder d_gh;
288 int error = 0;
289 struct inode *inode = NULL;
290 int unlock = 0;
291
292 if (!name->len || name->len > GFS2_FNAMESIZE)
293 return ERR_PTR(-ENAMETOOLONG);
294
295 if ((name->len == 1 && memcmp(name->name, ".", 1) == 0) ||
296 (name->len == 2 && memcmp(name->name, "..", 2) == 0 &&
297 dir == sb->s_root->d_inode)) {
298 igrab(dir);
299 return dir;
300 }
301
302 if (gfs2_glock_is_locked_by_me(dip->i_gl) == NULL) {
303 error = gfs2_glock_nq_init(dip->i_gl, LM_ST_SHARED, 0, &d_gh);
304 if (error)
305 return ERR_PTR(error);
306 unlock = 1;
307 }
308
309 if (!is_root) {
Al Viro10556cb2011-06-20 19:28:19 -0400310 error = gfs2_permission(dir, MAY_EXEC);
Steven Whitehouse194c0112011-05-09 14:06:38 +0100311 if (error)
312 goto out;
313 }
314
315 inode = gfs2_dir_search(dir, name);
316 if (IS_ERR(inode))
317 error = PTR_ERR(inode);
318out:
319 if (unlock)
320 gfs2_glock_dq_uninit(&d_gh);
321 if (error == -ENOENT)
322 return NULL;
323 return inode ? inode : ERR_PTR(error);
324}
325
326/**
327 * create_ok - OK to create a new on-disk inode here?
328 * @dip: Directory in which dinode is to be created
329 * @name: Name of new dinode
330 * @mode:
331 *
332 * Returns: errno
333 */
334
335static int create_ok(struct gfs2_inode *dip, const struct qstr *name,
Al Viro175a4eb2011-07-26 03:30:54 -0400336 umode_t mode)
Steven Whitehouse194c0112011-05-09 14:06:38 +0100337{
338 int error;
339
Al Viro10556cb2011-06-20 19:28:19 -0400340 error = gfs2_permission(&dip->i_inode, MAY_WRITE | MAY_EXEC);
Steven Whitehouse194c0112011-05-09 14:06:38 +0100341 if (error)
342 return error;
343
344 /* Don't create entries in an unlinked directory */
345 if (!dip->i_inode.i_nlink)
346 return -ENOENT;
347
348 error = gfs2_dir_check(&dip->i_inode, name, NULL);
349 switch (error) {
350 case -ENOENT:
351 error = 0;
352 break;
353 case 0:
354 return -EEXIST;
355 default:
356 return error;
357 }
358
359 if (dip->i_entries == (u32)-1)
360 return -EFBIG;
361 if (S_ISDIR(mode) && dip->i_inode.i_nlink == (u32)-1)
362 return -EMLINK;
363
364 return 0;
365}
366
Al Viro175a4eb2011-07-26 03:30:54 -0400367static void munge_mode_uid_gid(struct gfs2_inode *dip, umode_t *mode,
Steven Whitehouse194c0112011-05-09 14:06:38 +0100368 unsigned int *uid, unsigned int *gid)
369{
370 if (GFS2_SB(&dip->i_inode)->sd_args.ar_suiddir &&
371 (dip->i_inode.i_mode & S_ISUID) && dip->i_inode.i_uid) {
372 if (S_ISDIR(*mode))
373 *mode |= S_ISUID;
374 else if (dip->i_inode.i_uid != current_fsuid())
375 *mode &= ~07111;
376 *uid = dip->i_inode.i_uid;
377 } else
378 *uid = current_fsuid();
379
380 if (dip->i_inode.i_mode & S_ISGID) {
381 if (S_ISDIR(*mode))
382 *mode |= S_ISGID;
383 *gid = dip->i_inode.i_gid;
384 } else
385 *gid = current_fsgid();
386}
387
388static int alloc_dinode(struct gfs2_inode *dip, u64 *no_addr, u64 *generation)
389{
390 struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode);
391 int error;
Steven Whitehouse6a8099e2011-11-22 12:18:51 +0000392 int dblocks = 1;
Steven Whitehouse194c0112011-05-09 14:06:38 +0100393
Bob Peterson564e12b2011-11-21 13:36:17 -0500394 error = gfs2_inplace_reserve(dip, RES_DINODE);
Steven Whitehouse194c0112011-05-09 14:06:38 +0100395 if (error)
396 goto out;
397
398 error = gfs2_trans_begin(sdp, RES_RG_BIT + RES_STATFS, 0);
399 if (error)
400 goto out_ipreserv;
401
Bob Peterson6e87ed02011-11-18 10:58:32 -0500402 error = gfs2_alloc_blocks(dip, no_addr, &dblocks, 1, generation);
Steven Whitehouse194c0112011-05-09 14:06:38 +0100403
404 gfs2_trans_end(sdp);
405
406out_ipreserv:
407 gfs2_inplace_release(dip);
408out:
Steven Whitehouse194c0112011-05-09 14:06:38 +0100409 return error;
410}
411
Steven Whitehousef2741d92011-05-13 12:11:17 +0100412static void gfs2_init_dir(struct buffer_head *dibh,
413 const struct gfs2_inode *parent)
Steven Whitehousee2d0a132011-05-13 09:55:55 +0100414{
415 struct gfs2_dinode *di = (struct gfs2_dinode *)dibh->b_data;
416 struct gfs2_dirent *dent = (struct gfs2_dirent *)(di+1);
417
418 gfs2_qstr2dirent(&gfs2_qdot, GFS2_DIRENT_SIZE(gfs2_qdot.len), dent);
419 dent->de_inum = di->di_num; /* already GFS2 endian */
420 dent->de_type = cpu_to_be16(DT_DIR);
421
422 dent = (struct gfs2_dirent *)((char*)dent + GFS2_DIRENT_SIZE(1));
423 gfs2_qstr2dirent(&gfs2_qdotdot, dibh->b_size - GFS2_DIRENT_SIZE(1) - sizeof(struct gfs2_dinode), dent);
424 gfs2_inum_out(parent, dent);
425 dent->de_type = cpu_to_be16(DT_DIR);
426
427}
428
Steven Whitehouse194c0112011-05-09 14:06:38 +0100429/**
430 * init_dinode - Fill in a new dinode structure
Steven Whitehousef2741d92011-05-13 12:11:17 +0100431 * @dip: The directory this inode is being created in
Steven Whitehouse194c0112011-05-09 14:06:38 +0100432 * @gl: The glock covering the new inode
Steven Whitehousef2741d92011-05-13 12:11:17 +0100433 * @inum: The inode number
434 * @mode: The file permissions
435 * @uid: The uid of the new inode
436 * @gid: The gid of the new inode
437 * @generation: The generation number of the new inode
438 * @dev: The device number (if a device node)
439 * @symname: The symlink destination (if a symlink)
440 * @size: The inode size (ignored for directories)
441 * @bhp: The buffer head (returned to caller)
Steven Whitehouse194c0112011-05-09 14:06:38 +0100442 *
443 */
444
445static void init_dinode(struct gfs2_inode *dip, struct gfs2_glock *gl,
Al Viro175a4eb2011-07-26 03:30:54 -0400446 const struct gfs2_inum_host *inum, umode_t mode,
Steven Whitehouse194c0112011-05-09 14:06:38 +0100447 unsigned int uid, unsigned int gid,
Steven Whitehouse160b4022011-05-13 10:34:59 +0100448 const u64 *generation, dev_t dev, const char *symname,
449 unsigned size, struct buffer_head **bhp)
Steven Whitehouse194c0112011-05-09 14:06:38 +0100450{
451 struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode);
452 struct gfs2_dinode *di;
453 struct buffer_head *dibh;
454 struct timespec tv = CURRENT_TIME;
455
456 dibh = gfs2_meta_new(gl, inum->no_addr);
457 gfs2_trans_add_bh(gl, dibh, 1);
458 gfs2_metatype_set(dibh, GFS2_METATYPE_DI, GFS2_FORMAT_DI);
459 gfs2_buffer_clear_tail(dibh, sizeof(struct gfs2_dinode));
460 di = (struct gfs2_dinode *)dibh->b_data;
461
462 di->di_num.no_formal_ino = cpu_to_be64(inum->no_formal_ino);
463 di->di_num.no_addr = cpu_to_be64(inum->no_addr);
464 di->di_mode = cpu_to_be32(mode);
465 di->di_uid = cpu_to_be32(uid);
466 di->di_gid = cpu_to_be32(gid);
467 di->di_nlink = 0;
Steven Whitehouse160b4022011-05-13 10:34:59 +0100468 di->di_size = cpu_to_be64(size);
Steven Whitehouse194c0112011-05-09 14:06:38 +0100469 di->di_blocks = cpu_to_be64(1);
470 di->di_atime = di->di_mtime = di->di_ctime = cpu_to_be64(tv.tv_sec);
471 di->di_major = cpu_to_be32(MAJOR(dev));
472 di->di_minor = cpu_to_be32(MINOR(dev));
473 di->di_goal_meta = di->di_goal_data = cpu_to_be64(inum->no_addr);
474 di->di_generation = cpu_to_be64(*generation);
475 di->di_flags = 0;
Steven Whitehouse194c0112011-05-09 14:06:38 +0100476 di->__pad1 = 0;
477 di->di_payload_format = cpu_to_be32(S_ISDIR(mode) ? GFS2_FORMAT_DE : 0);
478 di->di_height = 0;
479 di->__pad2 = 0;
480 di->__pad3 = 0;
481 di->di_depth = 0;
482 di->di_entries = 0;
483 memset(&di->__pad4, 0, sizeof(di->__pad4));
484 di->di_eattr = 0;
485 di->di_atime_nsec = cpu_to_be32(tv.tv_nsec);
486 di->di_mtime_nsec = cpu_to_be32(tv.tv_nsec);
487 di->di_ctime_nsec = cpu_to_be32(tv.tv_nsec);
488 memset(&di->di_reserved, 0, sizeof(di->di_reserved));
Steven Whitehouse160b4022011-05-13 10:34:59 +0100489
490 switch(mode & S_IFMT) {
491 case S_IFREG:
Steven Whitehousee2d0a132011-05-13 09:55:55 +0100492 if ((dip->i_diskflags & GFS2_DIF_INHERIT_JDATA) ||
493 gfs2_tune_get(sdp, gt_new_files_jdata))
494 di->di_flags |= cpu_to_be32(GFS2_DIF_JDATA);
Steven Whitehouse160b4022011-05-13 10:34:59 +0100495 break;
496 case S_IFDIR:
Steven Whitehousee2d0a132011-05-13 09:55:55 +0100497 di->di_flags |= cpu_to_be32(dip->i_diskflags &
498 GFS2_DIF_INHERIT_JDATA);
499 di->di_flags |= cpu_to_be32(GFS2_DIF_JDATA);
500 di->di_size = cpu_to_be64(sdp->sd_sb.sb_bsize - sizeof(struct gfs2_dinode));
501 di->di_entries = cpu_to_be32(2);
502 gfs2_init_dir(dibh, dip);
Steven Whitehouse160b4022011-05-13 10:34:59 +0100503 break;
504 case S_IFLNK:
505 memcpy(dibh->b_data + sizeof(struct gfs2_dinode), symname, size);
506 break;
Steven Whitehousee2d0a132011-05-13 09:55:55 +0100507 }
508
Steven Whitehouse194c0112011-05-09 14:06:38 +0100509 set_buffer_uptodate(dibh);
510
511 *bhp = dibh;
512}
513
514static int make_dinode(struct gfs2_inode *dip, struct gfs2_glock *gl,
Al Viro175a4eb2011-07-26 03:30:54 -0400515 umode_t mode, const struct gfs2_inum_host *inum,
Steven Whitehouse160b4022011-05-13 10:34:59 +0100516 const u64 *generation, dev_t dev, const char *symname,
517 unsigned int size, struct buffer_head **bhp)
Steven Whitehouse194c0112011-05-09 14:06:38 +0100518{
519 struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode);
520 unsigned int uid, gid;
521 int error;
522
523 munge_mode_uid_gid(dip, &mode, &uid, &gid);
Bob Peterson8e2e0042012-07-19 08:12:40 -0400524 error = gfs2_rindex_update(sdp);
525 if (error)
526 return error;
Steven Whitehouse194c0112011-05-09 14:06:38 +0100527
528 error = gfs2_quota_lock(dip, uid, gid);
529 if (error)
Bob Peterson5407e242012-05-18 09:28:23 -0400530 return error;
Steven Whitehouse194c0112011-05-09 14:06:38 +0100531
532 error = gfs2_quota_check(dip, uid, gid);
533 if (error)
534 goto out_quota;
535
536 error = gfs2_trans_begin(sdp, RES_DINODE + RES_QUOTA, 0);
537 if (error)
538 goto out_quota;
539
Steven Whitehouse160b4022011-05-13 10:34:59 +0100540 init_dinode(dip, gl, inum, mode, uid, gid, generation, dev, symname, size, bhp);
Steven Whitehouse194c0112011-05-09 14:06:38 +0100541 gfs2_quota_change(dip, +1, uid, gid);
542 gfs2_trans_end(sdp);
543
544out_quota:
545 gfs2_quota_unlock(dip);
Steven Whitehouse194c0112011-05-09 14:06:38 +0100546 return error;
547}
548
549static int link_dinode(struct gfs2_inode *dip, const struct qstr *name,
550 struct gfs2_inode *ip)
551{
552 struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode);
Steven Whitehouse194c0112011-05-09 14:06:38 +0100553 int alloc_required;
554 struct buffer_head *dibh;
555 int error;
556
Bob Peterson8e2e0042012-07-19 08:12:40 -0400557 error = gfs2_rindex_update(sdp);
558 if (error)
559 return error;
Steven Whitehouse194c0112011-05-09 14:06:38 +0100560
561 error = gfs2_quota_lock(dip, NO_QUOTA_CHANGE, NO_QUOTA_CHANGE);
562 if (error)
563 goto fail;
564
565 error = alloc_required = gfs2_diradd_alloc_required(&dip->i_inode, name);
566 if (alloc_required < 0)
567 goto fail_quota_locks;
568 if (alloc_required) {
569 error = gfs2_quota_check(dip, dip->i_inode.i_uid, dip->i_inode.i_gid);
570 if (error)
571 goto fail_quota_locks;
572
Bob Peterson564e12b2011-11-21 13:36:17 -0500573 error = gfs2_inplace_reserve(dip, sdp->sd_max_dirres);
Steven Whitehouse194c0112011-05-09 14:06:38 +0100574 if (error)
575 goto fail_quota_locks;
576
577 error = gfs2_trans_begin(sdp, sdp->sd_max_dirres +
Steven Whitehouse54335b12011-09-01 13:31:59 +0100578 dip->i_rgd->rd_length +
Steven Whitehouse194c0112011-05-09 14:06:38 +0100579 2 * RES_DINODE +
580 RES_STATFS + RES_QUOTA, 0);
581 if (error)
582 goto fail_ipreserv;
583 } else {
584 error = gfs2_trans_begin(sdp, RES_LEAF + 2 * RES_DINODE, 0);
585 if (error)
586 goto fail_quota_locks;
587 }
588
589 error = gfs2_dir_add(&dip->i_inode, name, ip);
590 if (error)
591 goto fail_end_trans;
592
593 error = gfs2_meta_inode_buffer(ip, &dibh);
594 if (error)
595 goto fail_end_trans;
Steven Whitehouse66ad8632012-01-11 12:35:05 +0000596 set_nlink(&ip->i_inode, S_ISDIR(ip->i_inode.i_mode) ? 2 : 1);
Steven Whitehouse194c0112011-05-09 14:06:38 +0100597 gfs2_trans_add_bh(ip->i_gl, dibh, 1);
598 gfs2_dinode_out(ip, dibh->b_data);
599 brelse(dibh);
600 return 0;
601
602fail_end_trans:
603 gfs2_trans_end(sdp);
604
605fail_ipreserv:
Bob Peterson8e2e0042012-07-19 08:12:40 -0400606 if (alloc_required)
607 gfs2_inplace_release(dip);
Steven Whitehouse194c0112011-05-09 14:06:38 +0100608
609fail_quota_locks:
610 gfs2_quota_unlock(dip);
611
612fail:
Steven Whitehouse194c0112011-05-09 14:06:38 +0100613 return error;
614}
615
H Hartley Sweeten46cc1e52011-09-23 15:51:32 -0700616static int gfs2_initxattrs(struct inode *inode, const struct xattr *xattr_array,
Mimi Zohar9d8f13b2011-06-06 15:29:25 -0400617 void *fs_info)
618{
619 const struct xattr *xattr;
620 int err = 0;
621
622 for (xattr = xattr_array; xattr->name != NULL; xattr++) {
623 err = __gfs2_xattr_set(inode, xattr->name, xattr->value,
624 xattr->value_len, 0,
625 GFS2_EATYPE_SECURITY);
626 if (err < 0)
627 break;
628 }
629 return err;
630}
631
Steven Whitehouse194c0112011-05-09 14:06:38 +0100632static int gfs2_security_init(struct gfs2_inode *dip, struct gfs2_inode *ip,
633 const struct qstr *qstr)
634{
Mimi Zohar9d8f13b2011-06-06 15:29:25 -0400635 return security_inode_init_security(&ip->i_inode, &dip->i_inode, qstr,
636 &gfs2_initxattrs, NULL);
Steven Whitehouse194c0112011-05-09 14:06:38 +0100637}
638
639/**
Steven Whitehousef2741d92011-05-13 12:11:17 +0100640 * gfs2_create_inode - Create a new inode
641 * @dir: The parent directory
642 * @dentry: The new dentry
643 * @mode: The permissions on the new inode
644 * @dev: For device nodes, this is the device number
645 * @symname: For symlinks, this is the link destination
646 * @size: The initial size of the inode (ignored for directories)
Steven Whitehouse194c0112011-05-09 14:06:38 +0100647 *
Steven Whitehousef2741d92011-05-13 12:11:17 +0100648 * Returns: 0 on success, or error code
Steven Whitehouse194c0112011-05-09 14:06:38 +0100649 */
650
Steven Whitehousef2741d92011-05-13 12:11:17 +0100651static int gfs2_create_inode(struct inode *dir, struct dentry *dentry,
Al Viro175a4eb2011-07-26 03:30:54 -0400652 umode_t mode, dev_t dev, const char *symname,
Steven Whitehouse9a63edd2011-08-18 14:35:53 +0100653 unsigned int size, int excl)
Steven Whitehouse194c0112011-05-09 14:06:38 +0100654{
Steven Whitehousef2741d92011-05-13 12:11:17 +0100655 const struct qstr *name = &dentry->d_name;
656 struct gfs2_holder ghs[2];
Steven Whitehouse194c0112011-05-09 14:06:38 +0100657 struct inode *inode = NULL;
Bob Peterson8e2e0042012-07-19 08:12:40 -0400658 struct gfs2_inode *dip = GFS2_I(dir), *ip;
Steven Whitehouse194c0112011-05-09 14:06:38 +0100659 struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode);
660 struct gfs2_inum_host inum = { .no_addr = 0, .no_formal_ino = 0 };
661 int error;
662 u64 generation;
663 struct buffer_head *bh = NULL;
664
665 if (!name->len || name->len > GFS2_FNAMESIZE)
Steven Whitehousef2741d92011-05-13 12:11:17 +0100666 return -ENAMETOOLONG;
Steven Whitehouse194c0112011-05-09 14:06:38 +0100667
Bob Peterson8e2e0042012-07-19 08:12:40 -0400668 /* We need a reservation to allocate the new dinode block. The
669 directory ip temporarily points to the reservation, but this is
670 being done to get a set of contiguous blocks for the new dinode.
671 Since this is a create, we don't have a sizehint yet, so it will
672 have to use the minimum reservation size. */
Bob Peterson0a305e42012-06-06 11:17:59 +0100673 error = gfs2_rs_alloc(dip);
674 if (error)
675 return error;
676
Steven Whitehousef2741d92011-05-13 12:11:17 +0100677 error = gfs2_glock_nq_init(dip->i_gl, LM_ST_EXCLUSIVE, 0, ghs);
Steven Whitehouse194c0112011-05-09 14:06:38 +0100678 if (error)
679 goto fail;
680
681 error = create_ok(dip, name, mode);
Steven Whitehouse9a63edd2011-08-18 14:35:53 +0100682 if ((error == -EEXIST) && S_ISREG(mode) && !excl) {
683 inode = gfs2_lookupi(dir, &dentry->d_name, 0);
684 gfs2_glock_dq_uninit(ghs);
685 d_instantiate(dentry, inode);
686 return IS_ERR(inode) ? PTR_ERR(inode) : 0;
687 }
Steven Whitehouse194c0112011-05-09 14:06:38 +0100688 if (error)
689 goto fail_gunlock;
690
691 error = alloc_dinode(dip, &inum.no_addr, &generation);
692 if (error)
693 goto fail_gunlock;
694 inum.no_formal_ino = generation;
695
696 error = gfs2_glock_nq_num(sdp, inum.no_addr, &gfs2_inode_glops,
697 LM_ST_EXCLUSIVE, GL_SKIP, ghs + 1);
698 if (error)
699 goto fail_gunlock;
700
Steven Whitehouse160b4022011-05-13 10:34:59 +0100701 error = make_dinode(dip, ghs[1].gh_gl, mode, &inum, &generation, dev, symname, size, &bh);
Steven Whitehouse194c0112011-05-09 14:06:38 +0100702 if (error)
703 goto fail_gunlock2;
704
705 inode = gfs2_inode_lookup(dir->i_sb, IF2DT(mode), inum.no_addr,
706 inum.no_formal_ino, 0);
707 if (IS_ERR(inode))
708 goto fail_gunlock2;
709
Bob Peterson8e2e0042012-07-19 08:12:40 -0400710 ip = GFS2_I(inode);
711 error = gfs2_inode_refresh(ip);
Steven Whitehouse194c0112011-05-09 14:06:38 +0100712 if (error)
713 goto fail_gunlock2;
714
Bob Peterson8e2e0042012-07-19 08:12:40 -0400715 /* The newly created inode needs a reservation so it can allocate
716 xattrs. At the same time, we want new blocks allocated to the new
717 dinode to be as contiguous as possible. Since we allocated the
718 dinode block under the directory's reservation, we transfer
719 ownership of that reservation to the new inode. The directory
720 doesn't need a reservation unless it needs a new allocation. */
721 ip->i_res = dip->i_res;
722 dip->i_res = NULL;
Bob Peterson0a305e42012-06-06 11:17:59 +0100723
Steven Whitehouse194c0112011-05-09 14:06:38 +0100724 error = gfs2_acl_create(dip, inode);
725 if (error)
726 goto fail_gunlock2;
727
Bob Peterson8e2e0042012-07-19 08:12:40 -0400728 error = gfs2_security_init(dip, ip, name);
Steven Whitehouse194c0112011-05-09 14:06:38 +0100729 if (error)
730 goto fail_gunlock2;
731
Bob Peterson8e2e0042012-07-19 08:12:40 -0400732 error = link_dinode(dip, name, ip);
Steven Whitehouse194c0112011-05-09 14:06:38 +0100733 if (error)
734 goto fail_gunlock2;
735
736 if (bh)
737 brelse(bh);
Steven Whitehousef2741d92011-05-13 12:11:17 +0100738
739 gfs2_trans_end(sdp);
Steven Whitehouse71f890f2012-07-30 14:53:19 +0100740 gfs2_inplace_release(dip);
Steven Whitehousef2741d92011-05-13 12:11:17 +0100741 gfs2_quota_unlock(dip);
Steven Whitehousef2741d92011-05-13 12:11:17 +0100742 mark_inode_dirty(inode);
Steven Whitehouseab9bbda2011-08-15 14:20:36 +0100743 gfs2_glock_dq_uninit_m(2, ghs);
Steven Whitehousef2741d92011-05-13 12:11:17 +0100744 d_instantiate(dentry, inode);
745 return 0;
Steven Whitehouse194c0112011-05-09 14:06:38 +0100746
747fail_gunlock2:
748 gfs2_glock_dq_uninit(ghs + 1);
Steven Whitehouse194c0112011-05-09 14:06:38 +0100749fail_gunlock:
Steven Whitehousef2741d92011-05-13 12:11:17 +0100750 gfs2_glock_dq_uninit(ghs);
Steven Whitehouse40ac2182011-08-02 13:17:27 +0100751 if (inode && !IS_ERR(inode)) {
752 set_bit(GIF_ALLOC_FAILED, &GFS2_I(inode)->i_flags);
753 iput(inode);
754 }
Steven Whitehouse194c0112011-05-09 14:06:38 +0100755fail:
Bob Peterson8e2e0042012-07-19 08:12:40 -0400756 gfs2_rs_delete(dip);
Steven Whitehouse194c0112011-05-09 14:06:38 +0100757 if (bh)
758 brelse(bh);
Steven Whitehousef2741d92011-05-13 12:11:17 +0100759 return error;
Steven Whitehouse194c0112011-05-09 14:06:38 +0100760}
Steven Whitehousef2741d92011-05-13 12:11:17 +0100761
David Teiglandb3b94fa2006-01-16 16:50:04 +0000762/**
763 * gfs2_create - Create a file
764 * @dir: The directory in which to create the file
765 * @dentry: The dentry of the new file
766 * @mode: The mode of the new file
767 *
768 * Returns: errno
769 */
770
771static int gfs2_create(struct inode *dir, struct dentry *dentry,
Al Viroebfc3b42012-06-10 18:05:36 -0400772 umode_t mode, bool excl)
David Teiglandb3b94fa2006-01-16 16:50:04 +0000773{
Steven Whitehouse9a63edd2011-08-18 14:35:53 +0100774 return gfs2_create_inode(dir, dentry, S_IFREG | mode, 0, NULL, 0, excl);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000775}
776
777/**
778 * gfs2_lookup - Look up a filename in a directory and return its inode
779 * @dir: The directory inode
780 * @dentry: The dentry of the new inode
781 * @nd: passed from Linux VFS, ignored by us
782 *
783 * Called by the VFS layer. Lock dir and call gfs2_lookupi()
784 *
785 * Returns: errno
786 */
787
788static struct dentry *gfs2_lookup(struct inode *dir, struct dentry *dentry,
Al Viro00cd8dd2012-06-10 17:13:09 -0400789 unsigned int flags)
David Teiglandb3b94fa2006-01-16 16:50:04 +0000790{
Al Viro6c673ab2011-07-17 10:22:27 -0400791 struct inode *inode = gfs2_lookupi(dir, &dentry->d_name, 0);
792 if (inode && !IS_ERR(inode)) {
Steven Whitehouse9656b2c2008-01-08 08:14:30 +0000793 struct gfs2_glock *gl = GFS2_I(inode)->i_gl;
794 struct gfs2_holder gh;
795 int error;
796 error = gfs2_glock_nq_init(gl, LM_ST_SHARED, LM_FLAG_ANY, &gh);
797 if (error) {
798 iput(inode);
799 return ERR_PTR(error);
800 }
801 gfs2_glock_dq_uninit(&gh);
Steven Whitehouse9656b2c2008-01-08 08:14:30 +0000802 }
Al Viro6c673ab2011-07-17 10:22:27 -0400803 return d_splice_alias(inode, dentry);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000804}
805
806/**
807 * gfs2_link - Link to a file
808 * @old_dentry: The inode to link
809 * @dir: Add link to this directory
810 * @dentry: The name of the link
811 *
812 * Link the inode in "old_dentry" into the directory "dir" with the
813 * name in "dentry".
814 *
815 * Returns: errno
816 */
817
818static int gfs2_link(struct dentry *old_dentry, struct inode *dir,
819 struct dentry *dentry)
820{
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -0400821 struct gfs2_inode *dip = GFS2_I(dir);
822 struct gfs2_sbd *sdp = GFS2_SB(dir);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000823 struct inode *inode = old_dentry->d_inode;
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -0400824 struct gfs2_inode *ip = GFS2_I(inode);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000825 struct gfs2_holder ghs[2];
Steven Whitehouse2baee032011-05-09 12:08:36 +0100826 struct buffer_head *dibh;
David Teiglandb3b94fa2006-01-16 16:50:04 +0000827 int alloc_required;
828 int error;
829
Steven Whitehouseb60623c2006-11-01 12:22:46 -0500830 if (S_ISDIR(inode->i_mode))
David Teiglandb3b94fa2006-01-16 16:50:04 +0000831 return -EPERM;
832
Bob Peterson0a305e42012-06-06 11:17:59 +0100833 error = gfs2_rs_alloc(dip);
834 if (error)
835 return error;
836
David Teiglandb3b94fa2006-01-16 16:50:04 +0000837 gfs2_holder_init(dip->i_gl, LM_ST_EXCLUSIVE, 0, ghs);
838 gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, ghs + 1);
839
Bob Peterson72dbf472008-08-12 13:39:29 -0500840 error = gfs2_glock_nq(ghs); /* parent */
David Teiglandb3b94fa2006-01-16 16:50:04 +0000841 if (error)
Bob Peterson72dbf472008-08-12 13:39:29 -0500842 goto out_parent;
843
844 error = gfs2_glock_nq(ghs + 1); /* child */
845 if (error)
846 goto out_child;
David Teiglandb3b94fa2006-01-16 16:50:04 +0000847
Steven Whitehoused192a8e2011-05-05 12:35:40 +0100848 error = -ENOENT;
849 if (inode->i_nlink == 0)
850 goto out_gunlock;
851
Al Viro10556cb2011-06-20 19:28:19 -0400852 error = gfs2_permission(dir, MAY_WRITE | MAY_EXEC);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000853 if (error)
854 goto out_gunlock;
855
Steven Whitehousedbb7cae2007-05-15 15:37:50 +0100856 error = gfs2_dir_check(dir, &dentry->d_name, NULL);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000857 switch (error) {
858 case -ENOENT:
859 break;
860 case 0:
861 error = -EEXIST;
862 default:
863 goto out_gunlock;
864 }
865
866 error = -EINVAL;
Steven Whitehouse4f561102006-11-01 14:04:17 -0500867 if (!dip->i_inode.i_nlink)
David Teiglandb3b94fa2006-01-16 16:50:04 +0000868 goto out_gunlock;
869 error = -EFBIG;
Steven Whitehousead6203f2008-11-03 13:59:19 +0000870 if (dip->i_entries == (u32)-1)
David Teiglandb3b94fa2006-01-16 16:50:04 +0000871 goto out_gunlock;
872 error = -EPERM;
873 if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
874 goto out_gunlock;
875 error = -EINVAL;
Steven Whitehouse4f561102006-11-01 14:04:17 -0500876 if (!ip->i_inode.i_nlink)
David Teiglandb3b94fa2006-01-16 16:50:04 +0000877 goto out_gunlock;
878 error = -EMLINK;
Steven Whitehouse4f561102006-11-01 14:04:17 -0500879 if (ip->i_inode.i_nlink == (u32)-1)
David Teiglandb3b94fa2006-01-16 16:50:04 +0000880 goto out_gunlock;
881
Steven Whitehousec7526662006-03-20 12:30:04 -0500882 alloc_required = error = gfs2_diradd_alloc_required(dir, &dentry->d_name);
883 if (error < 0)
David Teiglandb3b94fa2006-01-16 16:50:04 +0000884 goto out_gunlock;
Steven Whitehousec7526662006-03-20 12:30:04 -0500885 error = 0;
David Teiglandb3b94fa2006-01-16 16:50:04 +0000886
887 if (alloc_required) {
Steven Whitehoused82661d2008-03-10 15:34:50 +0000888 error = gfs2_quota_lock_check(dip);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000889 if (error)
Bob Peterson5407e242012-05-18 09:28:23 -0400890 goto out_gunlock;
David Teiglandb3b94fa2006-01-16 16:50:04 +0000891
Bob Peterson564e12b2011-11-21 13:36:17 -0500892 error = gfs2_inplace_reserve(dip, sdp->sd_max_dirres);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000893 if (error)
894 goto out_gunlock_q;
895
Steven Whitehouse1b502592006-05-18 14:10:52 -0400896 error = gfs2_trans_begin(sdp, sdp->sd_max_dirres +
Steven Whitehouse71f890f2012-07-30 14:53:19 +0100897 gfs2_rg_blocks(dip, sdp->sd_max_dirres) +
David Teiglandb3b94fa2006-01-16 16:50:04 +0000898 2 * RES_DINODE + RES_STATFS +
899 RES_QUOTA, 0);
900 if (error)
901 goto out_ipres;
902 } else {
903 error = gfs2_trans_begin(sdp, 2 * RES_DINODE + RES_LEAF, 0);
904 if (error)
905 goto out_ipres;
906 }
907
Steven Whitehouse2baee032011-05-09 12:08:36 +0100908 error = gfs2_meta_inode_buffer(ip, &dibh);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000909 if (error)
910 goto out_end_trans;
911
Steven Whitehouse3d6ecb72011-05-09 13:30:08 +0100912 error = gfs2_dir_add(dir, &dentry->d_name, ip);
Steven Whitehouse2baee032011-05-09 12:08:36 +0100913 if (error)
914 goto out_brelse;
David Teiglandb3b94fa2006-01-16 16:50:04 +0000915
Steven Whitehouse2baee032011-05-09 12:08:36 +0100916 gfs2_trans_add_bh(ip->i_gl, dibh, 1);
917 inc_nlink(&ip->i_inode);
918 ip->i_inode.i_ctime = CURRENT_TIME;
Steven Whitehouseab9bbda2011-08-15 14:20:36 +0100919 ihold(inode);
920 d_instantiate(dentry, inode);
921 mark_inode_dirty(inode);
Steven Whitehouse2baee032011-05-09 12:08:36 +0100922
923out_brelse:
924 brelse(dibh);
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -0400925out_end_trans:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000926 gfs2_trans_end(sdp);
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -0400927out_ipres:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000928 if (alloc_required)
929 gfs2_inplace_release(dip);
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -0400930out_gunlock_q:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000931 if (alloc_required)
932 gfs2_quota_unlock(dip);
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -0400933out_gunlock:
Bob Peterson72dbf472008-08-12 13:39:29 -0500934 gfs2_glock_dq(ghs + 1);
935out_child:
936 gfs2_glock_dq(ghs);
937out_parent:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000938 gfs2_holder_uninit(ghs);
939 gfs2_holder_uninit(ghs + 1);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000940 return error;
941}
942
Steven Whitehouse87ec2172009-05-22 10:54:50 +0100943/*
944 * gfs2_unlink_ok - check to see that a inode is still in a directory
945 * @dip: the directory
946 * @name: the name of the file
947 * @ip: the inode
948 *
949 * Assumes that the lock on (at least) @dip is held.
950 *
951 * Returns: 0 if the parent/child relationship is correct, errno if it isn't
952 */
953
954static int gfs2_unlink_ok(struct gfs2_inode *dip, const struct qstr *name,
955 const struct gfs2_inode *ip)
956{
957 int error;
958
959 if (IS_IMMUTABLE(&ip->i_inode) || IS_APPEND(&ip->i_inode))
960 return -EPERM;
961
962 if ((dip->i_inode.i_mode & S_ISVTX) &&
963 dip->i_inode.i_uid != current_fsuid() &&
964 ip->i_inode.i_uid != current_fsuid() && !capable(CAP_FOWNER))
965 return -EPERM;
966
967 if (IS_APPEND(&dip->i_inode))
968 return -EPERM;
969
Al Viro10556cb2011-06-20 19:28:19 -0400970 error = gfs2_permission(&dip->i_inode, MAY_WRITE | MAY_EXEC);
Steven Whitehouse87ec2172009-05-22 10:54:50 +0100971 if (error)
972 return error;
973
974 error = gfs2_dir_check(&dip->i_inode, name, ip);
975 if (error)
976 return error;
977
978 return 0;
979}
980
David Teiglandb3b94fa2006-01-16 16:50:04 +0000981/**
Steven Whitehouse855d23c2011-05-09 16:42:37 +0100982 * gfs2_unlink_inode - Removes an inode from its parent dir and unlinks it
983 * @dip: The parent directory
984 * @name: The name of the entry in the parent directory
985 * @bh: The inode buffer for the inode to be removed
986 * @inode: The inode to be removed
987 *
988 * Called with all the locks and in a transaction. This will only be
989 * called for a directory after it has been checked to ensure it is empty.
990 *
991 * Returns: 0 on success, or an error
992 */
993
994static int gfs2_unlink_inode(struct gfs2_inode *dip,
995 const struct dentry *dentry,
996 struct buffer_head *bh)
997{
998 struct inode *inode = dentry->d_inode;
999 struct gfs2_inode *ip = GFS2_I(inode);
1000 int error;
1001
1002 error = gfs2_dir_del(dip, dentry);
1003 if (error)
1004 return error;
1005
1006 ip->i_entries = 0;
1007 inode->i_ctime = CURRENT_TIME;
1008 if (S_ISDIR(inode->i_mode))
1009 clear_nlink(inode);
1010 else
1011 drop_nlink(inode);
Steven Whitehouse855d23c2011-05-09 16:42:37 +01001012 mark_inode_dirty(inode);
1013 if (inode->i_nlink == 0)
1014 gfs2_unlink_di(inode);
1015 return 0;
1016}
1017
1018
1019/**
1020 * gfs2_unlink - Unlink an inode (this does rmdir as well)
1021 * @dir: The inode of the directory containing the inode to unlink
David Teiglandb3b94fa2006-01-16 16:50:04 +00001022 * @dentry: The file itself
1023 *
Steven Whitehouse855d23c2011-05-09 16:42:37 +01001024 * This routine uses the type of the inode as a flag to figure out
1025 * whether this is an unlink or an rmdir.
David Teiglandb3b94fa2006-01-16 16:50:04 +00001026 *
1027 * Returns: errno
1028 */
1029
1030static int gfs2_unlink(struct inode *dir, struct dentry *dentry)
1031{
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001032 struct gfs2_inode *dip = GFS2_I(dir);
1033 struct gfs2_sbd *sdp = GFS2_SB(dir);
Steven Whitehouse855d23c2011-05-09 16:42:37 +01001034 struct inode *inode = dentry->d_inode;
1035 struct gfs2_inode *ip = GFS2_I(inode);
1036 struct buffer_head *bh;
Russell Cattelanddee7602007-01-29 17:13:44 -06001037 struct gfs2_holder ghs[3];
1038 struct gfs2_rgrpd *rgd;
Bob Peterson5e2f7d62012-04-04 22:11:16 -04001039 int error;
1040
1041 error = gfs2_rindex_update(sdp);
1042 if (error)
1043 return error;
1044
1045 error = -EROFS;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001046
Russell Cattelanddee7602007-01-29 17:13:44 -06001047 gfs2_holder_init(dip->i_gl, LM_ST_EXCLUSIVE, 0, ghs);
1048 gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, ghs + 1);
1049
Steven Whitehouse66fc0612012-02-08 12:58:32 +00001050 rgd = gfs2_blk2rgrpd(sdp, ip->i_no_addr, 1);
Steven Whitehousea365fbf2012-02-24 15:09:14 +00001051 if (!rgd)
Steven Whitehouse87654892011-11-08 14:04:20 +00001052 goto out_inodes;
Steven Whitehousea365fbf2012-02-24 15:09:14 +00001053
Russell Cattelanddee7602007-01-29 17:13:44 -06001054 gfs2_holder_init(rgd->rd_gl, LM_ST_EXCLUSIVE, 0, ghs + 2);
1055
1056
Steven Whitehouse8497a462007-08-26 14:23:56 +01001057 error = gfs2_glock_nq(ghs); /* parent */
David Teiglandb3b94fa2006-01-16 16:50:04 +00001058 if (error)
Steven Whitehouse8497a462007-08-26 14:23:56 +01001059 goto out_parent;
1060
1061 error = gfs2_glock_nq(ghs + 1); /* child */
1062 if (error)
1063 goto out_child;
1064
Steven Whitehoused192a8e2011-05-05 12:35:40 +01001065 error = -ENOENT;
Steven Whitehouse855d23c2011-05-09 16:42:37 +01001066 if (inode->i_nlink == 0)
Steven Whitehoused192a8e2011-05-05 12:35:40 +01001067 goto out_rgrp;
1068
Steven Whitehouse855d23c2011-05-09 16:42:37 +01001069 if (S_ISDIR(inode->i_mode)) {
1070 error = -ENOTEMPTY;
1071 if (ip->i_entries > 2 || inode->i_nlink > 2)
1072 goto out_rgrp;
1073 }
1074
Steven Whitehouse8497a462007-08-26 14:23:56 +01001075 error = gfs2_glock_nq(ghs + 2); /* rgrp */
1076 if (error)
1077 goto out_rgrp;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001078
1079 error = gfs2_unlink_ok(dip, &dentry->d_name, ip);
1080 if (error)
Bob Peterson72dbf472008-08-12 13:39:29 -05001081 goto out_gunlock;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001082
Steven Whitehouse855d23c2011-05-09 16:42:37 +01001083 error = gfs2_trans_begin(sdp, 2*RES_DINODE + 3*RES_LEAF + RES_RG_BIT, 0);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001084 if (error)
Roel Kluincd012072009-08-22 19:26:42 +02001085 goto out_gunlock;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001086
Steven Whitehouse855d23c2011-05-09 16:42:37 +01001087 error = gfs2_meta_inode_buffer(ip, &bh);
1088 if (error)
1089 goto out_end_trans;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001090
Steven Whitehouse855d23c2011-05-09 16:42:37 +01001091 error = gfs2_unlink_inode(dip, dentry, bh);
1092 brelse(bh);
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001093
1094out_end_trans:
David Teiglandb3b94fa2006-01-16 16:50:04 +00001095 gfs2_trans_end(sdp);
Bob Peterson72dbf472008-08-12 13:39:29 -05001096out_gunlock:
Steven Whitehouse8497a462007-08-26 14:23:56 +01001097 gfs2_glock_dq(ghs + 2);
1098out_rgrp:
Steven Whitehouse8497a462007-08-26 14:23:56 +01001099 gfs2_glock_dq(ghs + 1);
1100out_child:
Steven Whitehouse8497a462007-08-26 14:23:56 +01001101 gfs2_glock_dq(ghs);
1102out_parent:
Steven Whitehouse87654892011-11-08 14:04:20 +00001103 gfs2_holder_uninit(ghs + 2);
1104out_inodes:
1105 gfs2_holder_uninit(ghs + 1);
Steven Whitehouse8497a462007-08-26 14:23:56 +01001106 gfs2_holder_uninit(ghs);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001107 return error;
1108}
1109
1110/**
1111 * gfs2_symlink - Create a symlink
1112 * @dir: The directory to create the symlink in
1113 * @dentry: The dentry to put the symlink in
1114 * @symname: The thing which the link points to
1115 *
1116 * Returns: errno
1117 */
1118
1119static int gfs2_symlink(struct inode *dir, struct dentry *dentry,
1120 const char *symname)
1121{
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001122 struct gfs2_sbd *sdp = GFS2_SB(dir);
Steven Whitehouse160b4022011-05-13 10:34:59 +01001123 unsigned int size;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001124
David Teiglandb3b94fa2006-01-16 16:50:04 +00001125 size = strlen(symname);
1126 if (size > sdp->sd_sb.sb_bsize - sizeof(struct gfs2_dinode) - 1)
1127 return -ENAMETOOLONG;
1128
Steven Whitehouse9a63edd2011-08-18 14:35:53 +01001129 return gfs2_create_inode(dir, dentry, S_IFLNK | S_IRWXUGO, 0, symname, size, 0);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001130}
1131
1132/**
1133 * gfs2_mkdir - Make a directory
1134 * @dir: The parent directory of the new one
1135 * @dentry: The dentry of the new directory
1136 * @mode: The mode of the new directory
1137 *
1138 * Returns: errno
1139 */
1140
Al Viro18bb1db2011-07-26 01:41:39 -04001141static int gfs2_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
David Teiglandb3b94fa2006-01-16 16:50:04 +00001142{
Steven Whitehouse9a63edd2011-08-18 14:35:53 +01001143 return gfs2_create_inode(dir, dentry, S_IFDIR | mode, 0, NULL, 0, 0);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001144}
1145
1146/**
David Teiglandb3b94fa2006-01-16 16:50:04 +00001147 * gfs2_mknod - Make a special file
1148 * @dir: The directory in which the special file will reside
1149 * @dentry: The dentry of the special file
1150 * @mode: The mode of the special file
Steven Whitehousef2741d92011-05-13 12:11:17 +01001151 * @dev: The device specification of the special file
David Teiglandb3b94fa2006-01-16 16:50:04 +00001152 *
1153 */
1154
Al Viro1a67aaf2011-07-26 01:52:52 -04001155static int gfs2_mknod(struct inode *dir, struct dentry *dentry, umode_t mode,
David Teiglandb3b94fa2006-01-16 16:50:04 +00001156 dev_t dev)
1157{
Steven Whitehouse9a63edd2011-08-18 14:35:53 +01001158 return gfs2_create_inode(dir, dentry, mode, dev, NULL, 0, 0);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001159}
1160
Steven Whitehouse0188d6c2008-08-26 09:38:26 +01001161/*
1162 * gfs2_ok_to_move - check if it's ok to move a directory to another directory
1163 * @this: move this
1164 * @to: to here
1165 *
1166 * Follow @to back to the root and make sure we don't encounter @this
1167 * Assumes we already hold the rename lock.
1168 *
1169 * Returns: errno
1170 */
1171
1172static int gfs2_ok_to_move(struct gfs2_inode *this, struct gfs2_inode *to)
1173{
1174 struct inode *dir = &to->i_inode;
1175 struct super_block *sb = dir->i_sb;
1176 struct inode *tmp;
Steven Whitehouse0188d6c2008-08-26 09:38:26 +01001177 int error = 0;
1178
Steven Whitehouse0188d6c2008-08-26 09:38:26 +01001179 igrab(dir);
1180
1181 for (;;) {
1182 if (dir == &this->i_inode) {
1183 error = -EINVAL;
1184 break;
1185 }
1186 if (dir == sb->s_root->d_inode) {
1187 error = 0;
1188 break;
1189 }
1190
Steven Whitehouse8d123582010-09-17 12:30:23 +01001191 tmp = gfs2_lookupi(dir, &gfs2_qdotdot, 1);
Steven Whitehouse0188d6c2008-08-26 09:38:26 +01001192 if (IS_ERR(tmp)) {
1193 error = PTR_ERR(tmp);
1194 break;
1195 }
1196
1197 iput(dir);
1198 dir = tmp;
1199 }
1200
1201 iput(dir);
1202
1203 return error;
1204}
1205
David Teiglandb3b94fa2006-01-16 16:50:04 +00001206/**
1207 * gfs2_rename - Rename a file
1208 * @odir: Parent directory of old file name
1209 * @odentry: The old dentry of the file
1210 * @ndir: Parent directory of new file name
1211 * @ndentry: The new dentry of the file
1212 *
1213 * Returns: errno
1214 */
1215
1216static int gfs2_rename(struct inode *odir, struct dentry *odentry,
1217 struct inode *ndir, struct dentry *ndentry)
1218{
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001219 struct gfs2_inode *odip = GFS2_I(odir);
1220 struct gfs2_inode *ndip = GFS2_I(ndir);
1221 struct gfs2_inode *ip = GFS2_I(odentry->d_inode);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001222 struct gfs2_inode *nip = NULL;
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001223 struct gfs2_sbd *sdp = GFS2_SB(odir);
Steven Whitehouse8339ee52011-08-31 16:38:29 +01001224 struct gfs2_holder ghs[5], r_gh = { .gh_gl = NULL, };
Russell Cattelanddee7602007-01-29 17:13:44 -06001225 struct gfs2_rgrpd *nrgd;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001226 unsigned int num_gh;
1227 int dir_rename = 0;
Steven Whitehouse24b977b2009-12-09 13:55:12 +00001228 int alloc_required = 0;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001229 unsigned int x;
1230 int error;
1231
David Teiglandb3b94fa2006-01-16 16:50:04 +00001232 if (ndentry->d_inode) {
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001233 nip = GFS2_I(ndentry->d_inode);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001234 if (ip == nip)
1235 return 0;
1236 }
1237
Bob Peterson5e2f7d62012-04-04 22:11:16 -04001238 error = gfs2_rindex_update(sdp);
1239 if (error)
1240 return error;
1241
Bob Peterson0a305e42012-06-06 11:17:59 +01001242 error = gfs2_rs_alloc(ndip);
1243 if (error)
1244 return error;
1245
Steven Whitehouse0188d6c2008-08-26 09:38:26 +01001246 if (odip != ndip) {
1247 error = gfs2_glock_nq_init(sdp->sd_rename_gl, LM_ST_EXCLUSIVE,
1248 0, &r_gh);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001249 if (error)
1250 goto out;
1251
Steven Whitehouse0188d6c2008-08-26 09:38:26 +01001252 if (S_ISDIR(ip->i_inode.i_mode)) {
1253 dir_rename = 1;
1254 /* don't move a dirctory into it's subdir */
1255 error = gfs2_ok_to_move(ip, ndip);
1256 if (error)
1257 goto out_gunlock_r;
1258 }
David Teiglandb3b94fa2006-01-16 16:50:04 +00001259 }
1260
Steven Whitehoused9d1ca32006-06-21 15:38:17 -04001261 num_gh = 1;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001262 gfs2_holder_init(odip->i_gl, LM_ST_EXCLUSIVE, 0, ghs);
Steven Whitehoused9d1ca32006-06-21 15:38:17 -04001263 if (odip != ndip) {
1264 gfs2_holder_init(ndip->i_gl, LM_ST_EXCLUSIVE, 0, ghs + num_gh);
1265 num_gh++;
1266 }
1267 gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, ghs + num_gh);
1268 num_gh++;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001269
Steven Whitehoused9d1ca32006-06-21 15:38:17 -04001270 if (nip) {
1271 gfs2_holder_init(nip->i_gl, LM_ST_EXCLUSIVE, 0, ghs + num_gh);
1272 num_gh++;
Russell Cattelanddee7602007-01-29 17:13:44 -06001273 /* grab the resource lock for unlink flag twiddling
1274 * this is the case of the target file already existing
1275 * so we unlink before doing the rename
1276 */
Steven Whitehouse66fc0612012-02-08 12:58:32 +00001277 nrgd = gfs2_blk2rgrpd(sdp, nip->i_no_addr, 1);
Russell Cattelanddee7602007-01-29 17:13:44 -06001278 if (nrgd)
1279 gfs2_holder_init(nrgd->rd_gl, LM_ST_EXCLUSIVE, 0, ghs + num_gh++);
Steven Whitehoused9d1ca32006-06-21 15:38:17 -04001280 }
David Teiglandb3b94fa2006-01-16 16:50:04 +00001281
Bob Peterson72dbf472008-08-12 13:39:29 -05001282 for (x = 0; x < num_gh; x++) {
1283 error = gfs2_glock_nq(ghs + x);
1284 if (error)
1285 goto out_gunlock;
1286 }
David Teiglandb3b94fa2006-01-16 16:50:04 +00001287
Steven Whitehoused192a8e2011-05-05 12:35:40 +01001288 error = -ENOENT;
1289 if (ip->i_inode.i_nlink == 0)
1290 goto out_gunlock;
1291
David Teiglandb3b94fa2006-01-16 16:50:04 +00001292 /* Check out the old directory */
1293
1294 error = gfs2_unlink_ok(odip, &odentry->d_name, ip);
1295 if (error)
1296 goto out_gunlock;
1297
1298 /* Check out the new directory */
1299
1300 if (nip) {
1301 error = gfs2_unlink_ok(ndip, &ndentry->d_name, nip);
1302 if (error)
1303 goto out_gunlock;
1304
Steven Whitehoused192a8e2011-05-05 12:35:40 +01001305 if (nip->i_inode.i_nlink == 0) {
1306 error = -EAGAIN;
1307 goto out_gunlock;
1308 }
1309
Steven Whitehouseb60623c2006-11-01 12:22:46 -05001310 if (S_ISDIR(nip->i_inode.i_mode)) {
Steven Whitehousead6203f2008-11-03 13:59:19 +00001311 if (nip->i_entries < 2) {
Steven Whitehouse94fb7632011-05-09 13:36:10 +01001312 gfs2_consist_inode(nip);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001313 error = -EIO;
1314 goto out_gunlock;
1315 }
Steven Whitehousead6203f2008-11-03 13:59:19 +00001316 if (nip->i_entries > 2) {
David Teiglandb3b94fa2006-01-16 16:50:04 +00001317 error = -ENOTEMPTY;
1318 goto out_gunlock;
1319 }
1320 }
1321 } else {
Al Viro10556cb2011-06-20 19:28:19 -04001322 error = gfs2_permission(ndir, MAY_WRITE | MAY_EXEC);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001323 if (error)
1324 goto out_gunlock;
1325
Steven Whitehousedbb7cae2007-05-15 15:37:50 +01001326 error = gfs2_dir_check(ndir, &ndentry->d_name, NULL);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001327 switch (error) {
1328 case -ENOENT:
1329 error = 0;
1330 break;
1331 case 0:
1332 error = -EEXIST;
1333 default:
1334 goto out_gunlock;
1335 };
1336
1337 if (odip != ndip) {
Steven Whitehouse4f561102006-11-01 14:04:17 -05001338 if (!ndip->i_inode.i_nlink) {
Steven Whitehoused192a8e2011-05-05 12:35:40 +01001339 error = -ENOENT;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001340 goto out_gunlock;
1341 }
Steven Whitehousead6203f2008-11-03 13:59:19 +00001342 if (ndip->i_entries == (u32)-1) {
David Teiglandb3b94fa2006-01-16 16:50:04 +00001343 error = -EFBIG;
1344 goto out_gunlock;
1345 }
Steven Whitehouseb60623c2006-11-01 12:22:46 -05001346 if (S_ISDIR(ip->i_inode.i_mode) &&
Steven Whitehouse4f561102006-11-01 14:04:17 -05001347 ndip->i_inode.i_nlink == (u32)-1) {
David Teiglandb3b94fa2006-01-16 16:50:04 +00001348 error = -EMLINK;
1349 goto out_gunlock;
1350 }
1351 }
1352 }
1353
1354 /* Check out the dir to be renamed */
1355
1356 if (dir_rename) {
Al Viro10556cb2011-06-20 19:28:19 -04001357 error = gfs2_permission(odentry->d_inode, MAY_WRITE);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001358 if (error)
1359 goto out_gunlock;
1360 }
1361
Steven Whitehouse24b977b2009-12-09 13:55:12 +00001362 if (nip == NULL)
1363 alloc_required = gfs2_diradd_alloc_required(ndir, &ndentry->d_name);
1364 error = alloc_required;
Steven Whitehousec7526662006-03-20 12:30:04 -05001365 if (error < 0)
David Teiglandb3b94fa2006-01-16 16:50:04 +00001366 goto out_gunlock;
1367
1368 if (alloc_required) {
Steven Whitehoused82661d2008-03-10 15:34:50 +00001369 error = gfs2_quota_lock_check(ndip);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001370 if (error)
Bob Peterson5407e242012-05-18 09:28:23 -04001371 goto out_gunlock;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001372
Bob Peterson564e12b2011-11-21 13:36:17 -05001373 error = gfs2_inplace_reserve(ndip, sdp->sd_max_dirres);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001374 if (error)
1375 goto out_gunlock_q;
1376
Steven Whitehousefe1bded2006-04-18 10:09:15 -04001377 error = gfs2_trans_begin(sdp, sdp->sd_max_dirres +
Steven Whitehouse71f890f2012-07-30 14:53:19 +01001378 gfs2_rg_blocks(ndip, sdp->sd_max_dirres) +
David Teiglandb3b94fa2006-01-16 16:50:04 +00001379 4 * RES_DINODE + 4 * RES_LEAF +
S. Wendy Cheng87d21e02007-01-18 16:07:03 -05001380 RES_STATFS + RES_QUOTA + 4, 0);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001381 if (error)
1382 goto out_ipreserv;
1383 } else {
1384 error = gfs2_trans_begin(sdp, 4 * RES_DINODE +
S. Wendy Cheng87d21e02007-01-18 16:07:03 -05001385 5 * RES_LEAF + 4, 0);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001386 if (error)
1387 goto out_gunlock;
1388 }
1389
1390 /* Remove the target file, if it exists */
1391
1392 if (nip) {
Steven Whitehouse855d23c2011-05-09 16:42:37 +01001393 struct buffer_head *bh;
1394 error = gfs2_meta_inode_buffer(nip, &bh);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001395 if (error)
1396 goto out_end_trans;
Steven Whitehouse855d23c2011-05-09 16:42:37 +01001397 error = gfs2_unlink_inode(ndip, ndentry, bh);
1398 brelse(bh);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001399 }
1400
1401 if (dir_rename) {
Steven Whitehouse8d123582010-09-17 12:30:23 +01001402 error = gfs2_dir_mvino(ip, &gfs2_qdotdot, ndip, DT_DIR);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001403 if (error)
1404 goto out_end_trans;
1405 } else {
1406 struct buffer_head *dibh;
1407 error = gfs2_meta_inode_buffer(ip, &dibh);
1408 if (error)
1409 goto out_end_trans;
Steven Whitehouse4bd91ba2007-06-05 09:39:18 +01001410 ip->i_inode.i_ctime = CURRENT_TIME;
Steven Whitehoused4e9c4c2006-01-18 11:19:28 +00001411 gfs2_trans_add_bh(ip->i_gl, dibh, 1);
Steven Whitehouse539e5d62006-10-31 15:07:05 -05001412 gfs2_dinode_out(ip, dibh->b_data);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001413 brelse(dibh);
1414 }
1415
Steven Whitehouse855d23c2011-05-09 16:42:37 +01001416 error = gfs2_dir_del(odip, odentry);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001417 if (error)
1418 goto out_end_trans;
1419
Steven Whitehouse3d6ecb72011-05-09 13:30:08 +01001420 error = gfs2_dir_add(ndir, &ndentry->d_name, ip);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001421 if (error)
1422 goto out_end_trans;
1423
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001424out_end_trans:
David Teiglandb3b94fa2006-01-16 16:50:04 +00001425 gfs2_trans_end(sdp);
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001426out_ipreserv:
David Teiglandb3b94fa2006-01-16 16:50:04 +00001427 if (alloc_required)
1428 gfs2_inplace_release(ndip);
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001429out_gunlock_q:
David Teiglandb3b94fa2006-01-16 16:50:04 +00001430 if (alloc_required)
1431 gfs2_quota_unlock(ndip);
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001432out_gunlock:
Bob Peterson72dbf472008-08-12 13:39:29 -05001433 while (x--) {
1434 gfs2_glock_dq(ghs + x);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001435 gfs2_holder_uninit(ghs + x);
Bob Peterson72dbf472008-08-12 13:39:29 -05001436 }
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001437out_gunlock_r:
Steven Whitehouse0188d6c2008-08-26 09:38:26 +01001438 if (r_gh.gh_gl)
David Teiglandb3b94fa2006-01-16 16:50:04 +00001439 gfs2_glock_dq_uninit(&r_gh);
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001440out:
David Teiglandb3b94fa2006-01-16 16:50:04 +00001441 return error;
1442}
1443
1444/**
David Teiglandb3b94fa2006-01-16 16:50:04 +00001445 * gfs2_follow_link - Follow a symbolic link
1446 * @dentry: The dentry of the link
1447 * @nd: Data that we pass to vfs_follow_link()
1448 *
Al Viroc177c2a2010-01-14 00:59:16 -05001449 * This can handle symlinks of any size.
David Teiglandb3b94fa2006-01-16 16:50:04 +00001450 *
1451 * Returns: 0 on success or error code
1452 */
1453
1454static void *gfs2_follow_link(struct dentry *dentry, struct nameidata *nd)
1455{
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001456 struct gfs2_inode *ip = GFS2_I(dentry->d_inode);
Al Viroc177c2a2010-01-14 00:59:16 -05001457 struct gfs2_holder i_gh;
1458 struct buffer_head *dibh;
Steven Whitehouse160b4022011-05-13 10:34:59 +01001459 unsigned int size;
Al Viroc177c2a2010-01-14 00:59:16 -05001460 char *buf;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001461 int error;
1462
Al Viroc177c2a2010-01-14 00:59:16 -05001463 gfs2_holder_init(ip->i_gl, LM_ST_SHARED, 0, &i_gh);
1464 error = gfs2_glock_nq(&i_gh);
1465 if (error) {
1466 gfs2_holder_uninit(&i_gh);
1467 nd_set_link(nd, ERR_PTR(error));
1468 return NULL;
1469 }
David Teiglandb3b94fa2006-01-16 16:50:04 +00001470
Steven Whitehousea2e0f792010-08-11 09:53:11 +01001471 size = (unsigned int)i_size_read(&ip->i_inode);
1472 if (size == 0) {
Al Viroc177c2a2010-01-14 00:59:16 -05001473 gfs2_consist_inode(ip);
1474 buf = ERR_PTR(-EIO);
1475 goto out;
1476 }
1477
1478 error = gfs2_meta_inode_buffer(ip, &dibh);
1479 if (error) {
1480 buf = ERR_PTR(error);
1481 goto out;
1482 }
1483
Steven Whitehouse160b4022011-05-13 10:34:59 +01001484 buf = kzalloc(size + 1, GFP_NOFS);
Al Viroc177c2a2010-01-14 00:59:16 -05001485 if (!buf)
1486 buf = ERR_PTR(-ENOMEM);
1487 else
Steven Whitehouse160b4022011-05-13 10:34:59 +01001488 memcpy(buf, dibh->b_data + sizeof(struct gfs2_dinode), size);
Al Viroc177c2a2010-01-14 00:59:16 -05001489 brelse(dibh);
1490out:
1491 gfs2_glock_dq_uninit(&i_gh);
1492 nd_set_link(nd, buf);
1493 return NULL;
1494}
1495
1496static void gfs2_put_link(struct dentry *dentry, struct nameidata *nd, void *p)
1497{
1498 char *s = nd_get_link(nd);
1499 if (!IS_ERR(s))
1500 kfree(s);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001501}
1502
1503/**
1504 * gfs2_permission -
Steven Whitehouse75d5cfb2011-01-19 09:42:40 +00001505 * @inode: The inode
1506 * @mask: The mask to be tested
1507 * @flags: Indicates whether this is an RCU path walk or not
David Teiglandb3b94fa2006-01-16 16:50:04 +00001508 *
Steven Whitehouse300c7d72006-11-27 09:55:28 -05001509 * This may be called from the VFS directly, or from within GFS2 with the
1510 * inode locked, so we look to see if the glock is already locked and only
1511 * lock the glock if its not already been done.
1512 *
David Teiglandb3b94fa2006-01-16 16:50:04 +00001513 * Returns: errno
1514 */
1515
Al Viro10556cb2011-06-20 19:28:19 -04001516int gfs2_permission(struct inode *inode, int mask)
David Teiglandb3b94fa2006-01-16 16:50:04 +00001517{
Nick Pigginb74c79e2011-01-07 17:49:58 +11001518 struct gfs2_inode *ip;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001519 struct gfs2_holder i_gh;
1520 int error;
Steven Whitehouse300c7d72006-11-27 09:55:28 -05001521 int unlock = 0;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001522
Nick Pigginb74c79e2011-01-07 17:49:58 +11001523
1524 ip = GFS2_I(inode);
Steven Whitehouse7afd88d2008-02-22 16:07:18 +00001525 if (gfs2_glock_is_locked_by_me(ip->i_gl) == NULL) {
Al Viro10556cb2011-06-20 19:28:19 -04001526 if (mask & MAY_NOT_BLOCK)
Steven Whitehouse75d5cfb2011-01-19 09:42:40 +00001527 return -ECHILD;
Steven Whitehouse300c7d72006-11-27 09:55:28 -05001528 error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &i_gh);
1529 if (error)
1530 return error;
1531 unlock = 1;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001532 }
1533
Miklos Szeredif58ba882008-07-02 21:12:01 +02001534 if ((mask & MAY_WRITE) && IS_IMMUTABLE(inode))
1535 error = -EACCES;
1536 else
Al Viro2830ba72011-06-20 19:16:29 -04001537 error = generic_permission(inode, mask);
Steven Whitehouse300c7d72006-11-27 09:55:28 -05001538 if (unlock)
1539 gfs2_glock_dq_uninit(&i_gh);
1540
David Teiglandb3b94fa2006-01-16 16:50:04 +00001541 return error;
1542}
1543
Steven Whitehouseab9bbda2011-08-15 14:20:36 +01001544static int __gfs2_setattr_simple(struct inode *inode, struct iattr *attr)
Steven Whitehouse194c0112011-05-09 14:06:38 +01001545{
Steven Whitehouse194c0112011-05-09 14:06:38 +01001546 setattr_copy(inode, attr);
1547 mark_inode_dirty(inode);
Steven Whitehouse194c0112011-05-09 14:06:38 +01001548 return 0;
1549}
1550
1551/**
1552 * gfs2_setattr_simple -
1553 * @ip:
1554 * @attr:
1555 *
1556 * Returns: errno
1557 */
1558
Steven Whitehouseab9bbda2011-08-15 14:20:36 +01001559int gfs2_setattr_simple(struct inode *inode, struct iattr *attr)
Steven Whitehouse194c0112011-05-09 14:06:38 +01001560{
1561 int error;
1562
1563 if (current->journal_info)
Steven Whitehouseab9bbda2011-08-15 14:20:36 +01001564 return __gfs2_setattr_simple(inode, attr);
Steven Whitehouse194c0112011-05-09 14:06:38 +01001565
Steven Whitehouseab9bbda2011-08-15 14:20:36 +01001566 error = gfs2_trans_begin(GFS2_SB(inode), RES_DINODE, 0);
Steven Whitehouse194c0112011-05-09 14:06:38 +01001567 if (error)
1568 return error;
1569
Steven Whitehouseab9bbda2011-08-15 14:20:36 +01001570 error = __gfs2_setattr_simple(inode, attr);
1571 gfs2_trans_end(GFS2_SB(inode));
Steven Whitehouse194c0112011-05-09 14:06:38 +01001572 return error;
1573}
1574
David Teiglandb3b94fa2006-01-16 16:50:04 +00001575static int setattr_chown(struct inode *inode, struct iattr *attr)
1576{
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001577 struct gfs2_inode *ip = GFS2_I(inode);
1578 struct gfs2_sbd *sdp = GFS2_SB(inode);
Steven Whitehousecd915492006-09-04 12:49:07 -04001579 u32 ouid, ogid, nuid, ngid;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001580 int error;
1581
Steven Whitehouse2933f922006-11-01 13:23:29 -05001582 ouid = inode->i_uid;
1583 ogid = inode->i_gid;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001584 nuid = attr->ia_uid;
1585 ngid = attr->ia_gid;
1586
1587 if (!(attr->ia_valid & ATTR_UID) || ouid == nuid)
1588 ouid = nuid = NO_QUOTA_CHANGE;
1589 if (!(attr->ia_valid & ATTR_GID) || ogid == ngid)
1590 ogid = ngid = NO_QUOTA_CHANGE;
1591
David Teiglandb3b94fa2006-01-16 16:50:04 +00001592 error = gfs2_quota_lock(ip, nuid, ngid);
1593 if (error)
Bob Peterson5407e242012-05-18 09:28:23 -04001594 return error;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001595
1596 if (ouid != NO_QUOTA_CHANGE || ogid != NO_QUOTA_CHANGE) {
1597 error = gfs2_quota_check(ip, nuid, ngid);
1598 if (error)
1599 goto out_gunlock_q;
1600 }
1601
1602 error = gfs2_trans_begin(sdp, RES_DINODE + 2 * RES_QUOTA, 0);
1603 if (error)
1604 goto out_gunlock_q;
1605
Steven Whitehouseab9bbda2011-08-15 14:20:36 +01001606 error = gfs2_setattr_simple(inode, attr);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001607 if (error)
1608 goto out_end_trans;
1609
David Teiglandb3b94fa2006-01-16 16:50:04 +00001610 if (ouid != NO_QUOTA_CHANGE || ogid != NO_QUOTA_CHANGE) {
Steven Whitehouse77658aa2008-02-12 14:17:27 +00001611 u64 blocks = gfs2_get_inode_blocks(&ip->i_inode);
1612 gfs2_quota_change(ip, -blocks, ouid, ogid);
1613 gfs2_quota_change(ip, blocks, nuid, ngid);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001614 }
1615
Steven Whitehousea91ea692006-09-04 12:04:26 -04001616out_end_trans:
David Teiglandb3b94fa2006-01-16 16:50:04 +00001617 gfs2_trans_end(sdp);
Steven Whitehousea91ea692006-09-04 12:04:26 -04001618out_gunlock_q:
David Teiglandb3b94fa2006-01-16 16:50:04 +00001619 gfs2_quota_unlock(ip);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001620 return error;
1621}
1622
1623/**
1624 * gfs2_setattr - Change attributes on an inode
1625 * @dentry: The dentry which is changing
1626 * @attr: The structure describing the change
1627 *
1628 * The VFS layer wants to change one or more of an inodes attributes. Write
1629 * that change out to disk.
1630 *
1631 * Returns: errno
1632 */
1633
1634static int gfs2_setattr(struct dentry *dentry, struct iattr *attr)
1635{
1636 struct inode *inode = dentry->d_inode;
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001637 struct gfs2_inode *ip = GFS2_I(inode);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001638 struct gfs2_holder i_gh;
1639 int error;
1640
Bob Peterson0a305e42012-06-06 11:17:59 +01001641 error = gfs2_rs_alloc(ip);
1642 if (error)
1643 return error;
1644
David Teiglandb3b94fa2006-01-16 16:50:04 +00001645 error = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &i_gh);
1646 if (error)
1647 return error;
1648
1649 error = -EPERM;
1650 if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
1651 goto out;
1652
1653 error = inode_change_ok(inode, attr);
1654 if (error)
1655 goto out;
1656
1657 if (attr->ia_valid & ATTR_SIZE)
Steven Whitehouseff8f33c2010-08-11 09:37:53 +01001658 error = gfs2_setattr_size(inode, attr->ia_size);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001659 else if (attr->ia_valid & (ATTR_UID | ATTR_GID))
1660 error = setattr_chown(inode, attr);
1661 else if ((attr->ia_valid & ATTR_MODE) && IS_POSIXACL(inode))
1662 error = gfs2_acl_chmod(ip, attr);
1663 else
Steven Whitehouseab9bbda2011-08-15 14:20:36 +01001664 error = gfs2_setattr_simple(inode, attr);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001665
Steven Whitehousea91ea692006-09-04 12:04:26 -04001666out:
David Teiglandb3b94fa2006-01-16 16:50:04 +00001667 if (!error)
1668 mark_inode_dirty(inode);
Steven Whitehouseab9bbda2011-08-15 14:20:36 +01001669 gfs2_glock_dq_uninit(&i_gh);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001670 return error;
1671}
1672
1673/**
1674 * gfs2_getattr - Read out an inode's attributes
Steven Whitehouse26c1a572006-09-04 15:32:10 -04001675 * @mnt: The vfsmount the inode is being accessed from
David Teiglandb3b94fa2006-01-16 16:50:04 +00001676 * @dentry: The dentry to stat
1677 * @stat: The inode's stats
1678 *
Steven Whitehousedcf3dd82006-11-27 10:12:05 -05001679 * This may be called from the VFS directly, or from within GFS2 with the
1680 * inode locked, so we look to see if the glock is already locked and only
1681 * lock the glock if its not already been done. Note that its the NFS
1682 * readdirplus operation which causes this to be called (from filldir)
1683 * with the glock already held.
1684 *
David Teiglandb3b94fa2006-01-16 16:50:04 +00001685 * Returns: errno
1686 */
1687
1688static int gfs2_getattr(struct vfsmount *mnt, struct dentry *dentry,
1689 struct kstat *stat)
1690{
1691 struct inode *inode = dentry->d_inode;
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001692 struct gfs2_inode *ip = GFS2_I(inode);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001693 struct gfs2_holder gh;
1694 int error;
Steven Whitehousedcf3dd82006-11-27 10:12:05 -05001695 int unlock = 0;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001696
Steven Whitehouse7afd88d2008-02-22 16:07:18 +00001697 if (gfs2_glock_is_locked_by_me(ip->i_gl) == NULL) {
Steven Whitehousedcf3dd82006-11-27 10:12:05 -05001698 error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &gh);
1699 if (error)
1700 return error;
1701 unlock = 1;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001702 }
1703
Steven Whitehousedcf3dd82006-11-27 10:12:05 -05001704 generic_fillattr(inode, stat);
Steven Whitehoused7c103d2007-01-25 17:14:59 +00001705 if (unlock)
Steven Whitehousedcf3dd82006-11-27 10:12:05 -05001706 gfs2_glock_dq_uninit(&gh);
1707
1708 return 0;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001709}
1710
1711static int gfs2_setxattr(struct dentry *dentry, const char *name,
1712 const void *data, size_t size, int flags)
1713{
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001714 struct inode *inode = dentry->d_inode;
Steven Whitehouse40b78a32009-08-26 18:41:32 +01001715 struct gfs2_inode *ip = GFS2_I(inode);
1716 struct gfs2_holder gh;
1717 int ret;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001718
Steven Whitehouse40b78a32009-08-26 18:41:32 +01001719 gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh);
1720 ret = gfs2_glock_nq(&gh);
1721 if (ret == 0) {
Steven Whitehouse645b2cc2012-07-26 14:15:17 +01001722 ret = gfs2_rs_alloc(ip);
1723 if (ret == 0)
1724 ret = generic_setxattr(dentry, name, data, size, flags);
Steven Whitehouse40b78a32009-08-26 18:41:32 +01001725 gfs2_glock_dq(&gh);
1726 }
1727 gfs2_holder_uninit(&gh);
1728 return ret;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001729}
1730
1731static ssize_t gfs2_getxattr(struct dentry *dentry, const char *name,
1732 void *data, size_t size)
1733{
Steven Whitehouse40b78a32009-08-26 18:41:32 +01001734 struct inode *inode = dentry->d_inode;
1735 struct gfs2_inode *ip = GFS2_I(inode);
1736 struct gfs2_holder gh;
1737 int ret;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001738
Steven Whitehouse40b78a32009-08-26 18:41:32 +01001739 gfs2_holder_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &gh);
1740 ret = gfs2_glock_nq(&gh);
1741 if (ret == 0) {
1742 ret = generic_getxattr(dentry, name, data, size);
1743 gfs2_glock_dq(&gh);
1744 }
1745 gfs2_holder_uninit(&gh);
1746 return ret;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001747}
1748
1749static int gfs2_removexattr(struct dentry *dentry, const char *name)
1750{
Steven Whitehouse40b78a32009-08-26 18:41:32 +01001751 struct inode *inode = dentry->d_inode;
1752 struct gfs2_inode *ip = GFS2_I(inode);
1753 struct gfs2_holder gh;
1754 int ret;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001755
Steven Whitehouse40b78a32009-08-26 18:41:32 +01001756 gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh);
1757 ret = gfs2_glock_nq(&gh);
1758 if (ret == 0) {
Steven Whitehouse645b2cc2012-07-26 14:15:17 +01001759 ret = gfs2_rs_alloc(ip);
1760 if (ret == 0)
1761 ret = generic_removexattr(dentry, name);
Steven Whitehouse40b78a32009-08-26 18:41:32 +01001762 gfs2_glock_dq(&gh);
1763 }
1764 gfs2_holder_uninit(&gh);
1765 return ret;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001766}
1767
Steven Whitehousee9079cc2008-10-14 14:43:29 +01001768static int gfs2_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
1769 u64 start, u64 len)
1770{
1771 struct gfs2_inode *ip = GFS2_I(inode);
1772 struct gfs2_holder gh;
1773 int ret;
1774
1775 ret = fiemap_check_flags(fieinfo, FIEMAP_FLAG_SYNC);
1776 if (ret)
1777 return ret;
1778
1779 mutex_lock(&inode->i_mutex);
1780
1781 ret = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, 0, &gh);
1782 if (ret)
1783 goto out;
1784
1785 if (gfs2_is_stuffed(ip)) {
1786 u64 phys = ip->i_no_addr << inode->i_blkbits;
1787 u64 size = i_size_read(inode);
1788 u32 flags = FIEMAP_EXTENT_LAST|FIEMAP_EXTENT_NOT_ALIGNED|
1789 FIEMAP_EXTENT_DATA_INLINE;
1790 phys += sizeof(struct gfs2_dinode);
1791 phys += start;
1792 if (start + len > size)
1793 len = size - start;
1794 if (start < size)
1795 ret = fiemap_fill_next_extent(fieinfo, start, phys,
1796 len, flags);
1797 if (ret == 1)
1798 ret = 0;
1799 } else {
1800 ret = __generic_block_fiemap(inode, fieinfo, start, len,
1801 gfs2_block_map);
1802 }
1803
1804 gfs2_glock_dq_uninit(&gh);
1805out:
1806 mutex_unlock(&inode->i_mutex);
1807 return ret;
1808}
1809
Arjan van de Ven92e1d5b2007-02-12 00:55:39 -08001810const struct inode_operations gfs2_file_iops = {
Al Viroe6305c42008-07-15 21:03:57 -04001811 .permission = gfs2_permission,
David Teiglandb3b94fa2006-01-16 16:50:04 +00001812 .setattr = gfs2_setattr,
1813 .getattr = gfs2_getattr,
1814 .setxattr = gfs2_setxattr,
1815 .getxattr = gfs2_getxattr,
1816 .listxattr = gfs2_listxattr,
1817 .removexattr = gfs2_removexattr,
Steven Whitehousee9079cc2008-10-14 14:43:29 +01001818 .fiemap = gfs2_fiemap,
Christoph Hellwig4e34e712011-07-23 17:37:31 +02001819 .get_acl = gfs2_get_acl,
David Teiglandb3b94fa2006-01-16 16:50:04 +00001820};
1821
Arjan van de Ven92e1d5b2007-02-12 00:55:39 -08001822const struct inode_operations gfs2_dir_iops = {
David Teiglandb3b94fa2006-01-16 16:50:04 +00001823 .create = gfs2_create,
1824 .lookup = gfs2_lookup,
1825 .link = gfs2_link,
1826 .unlink = gfs2_unlink,
1827 .symlink = gfs2_symlink,
1828 .mkdir = gfs2_mkdir,
Steven Whitehouse855d23c2011-05-09 16:42:37 +01001829 .rmdir = gfs2_unlink,
David Teiglandb3b94fa2006-01-16 16:50:04 +00001830 .mknod = gfs2_mknod,
1831 .rename = gfs2_rename,
Al Viroe6305c42008-07-15 21:03:57 -04001832 .permission = gfs2_permission,
David Teiglandb3b94fa2006-01-16 16:50:04 +00001833 .setattr = gfs2_setattr,
1834 .getattr = gfs2_getattr,
1835 .setxattr = gfs2_setxattr,
1836 .getxattr = gfs2_getxattr,
1837 .listxattr = gfs2_listxattr,
1838 .removexattr = gfs2_removexattr,
Steven Whitehousee9079cc2008-10-14 14:43:29 +01001839 .fiemap = gfs2_fiemap,
Christoph Hellwig4e34e712011-07-23 17:37:31 +02001840 .get_acl = gfs2_get_acl,
David Teiglandb3b94fa2006-01-16 16:50:04 +00001841};
1842
Arjan van de Ven92e1d5b2007-02-12 00:55:39 -08001843const struct inode_operations gfs2_symlink_iops = {
Al Viroc177c2a2010-01-14 00:59:16 -05001844 .readlink = generic_readlink,
David Teiglandb3b94fa2006-01-16 16:50:04 +00001845 .follow_link = gfs2_follow_link,
Al Viroc177c2a2010-01-14 00:59:16 -05001846 .put_link = gfs2_put_link,
Al Viroe6305c42008-07-15 21:03:57 -04001847 .permission = gfs2_permission,
David Teiglandb3b94fa2006-01-16 16:50:04 +00001848 .setattr = gfs2_setattr,
1849 .getattr = gfs2_getattr,
1850 .setxattr = gfs2_setxattr,
1851 .getxattr = gfs2_getxattr,
1852 .listxattr = gfs2_listxattr,
1853 .removexattr = gfs2_removexattr,
Steven Whitehousee9079cc2008-10-14 14:43:29 +01001854 .fiemap = gfs2_fiemap,
Christoph Hellwig4e34e712011-07-23 17:37:31 +02001855 .get_acl = gfs2_get_acl,
David Teiglandb3b94fa2006-01-16 16:50:04 +00001856};
1857