blob: c53c67e30bd45b339216892c07f5957c820508fc [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;
560
Steven Whitehouse194c0112011-05-09 14:06:38 +0100561 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);
Bob Peterson564e12b2011-11-21 13:36:17 -0500740 /* Check if we reserved space in the rgrp. Function link_dinode may
741 not, depending on whether alloc is required. */
Bob Peterson0a305e42012-06-06 11:17:59 +0100742 if (gfs2_mb_reserved(dip))
Bob Peterson564e12b2011-11-21 13:36:17 -0500743 gfs2_inplace_release(dip);
Steven Whitehousef2741d92011-05-13 12:11:17 +0100744 gfs2_quota_unlock(dip);
Steven Whitehousef2741d92011-05-13 12:11:17 +0100745 mark_inode_dirty(inode);
Steven Whitehouseab9bbda2011-08-15 14:20:36 +0100746 gfs2_glock_dq_uninit_m(2, ghs);
Steven Whitehousef2741d92011-05-13 12:11:17 +0100747 d_instantiate(dentry, inode);
748 return 0;
Steven Whitehouse194c0112011-05-09 14:06:38 +0100749
750fail_gunlock2:
751 gfs2_glock_dq_uninit(ghs + 1);
Steven Whitehouse194c0112011-05-09 14:06:38 +0100752fail_gunlock:
Steven Whitehousef2741d92011-05-13 12:11:17 +0100753 gfs2_glock_dq_uninit(ghs);
Steven Whitehouse40ac2182011-08-02 13:17:27 +0100754 if (inode && !IS_ERR(inode)) {
755 set_bit(GIF_ALLOC_FAILED, &GFS2_I(inode)->i_flags);
756 iput(inode);
757 }
Steven Whitehouse194c0112011-05-09 14:06:38 +0100758fail:
Bob Peterson8e2e0042012-07-19 08:12:40 -0400759 gfs2_rs_delete(dip);
Steven Whitehouse194c0112011-05-09 14:06:38 +0100760 if (bh)
761 brelse(bh);
Steven Whitehousef2741d92011-05-13 12:11:17 +0100762 return error;
Steven Whitehouse194c0112011-05-09 14:06:38 +0100763}
Steven Whitehousef2741d92011-05-13 12:11:17 +0100764
David Teiglandb3b94fa2006-01-16 16:50:04 +0000765/**
766 * gfs2_create - Create a file
767 * @dir: The directory in which to create the file
768 * @dentry: The dentry of the new file
769 * @mode: The mode of the new file
770 *
771 * Returns: errno
772 */
773
774static int gfs2_create(struct inode *dir, struct dentry *dentry,
Al Viro4acdaf22011-07-26 01:42:34 -0400775 umode_t mode, struct nameidata *nd)
David Teiglandb3b94fa2006-01-16 16:50:04 +0000776{
Steven Whitehouse9a63edd2011-08-18 14:35:53 +0100777 int excl = 0;
778 if (nd && (nd->flags & LOOKUP_EXCL))
779 excl = 1;
780 return gfs2_create_inode(dir, dentry, S_IFREG | mode, 0, NULL, 0, excl);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000781}
782
783/**
784 * gfs2_lookup - Look up a filename in a directory and return its inode
785 * @dir: The directory inode
786 * @dentry: The dentry of the new inode
787 * @nd: passed from Linux VFS, ignored by us
788 *
789 * Called by the VFS layer. Lock dir and call gfs2_lookupi()
790 *
791 * Returns: errno
792 */
793
794static struct dentry *gfs2_lookup(struct inode *dir, struct dentry *dentry,
795 struct nameidata *nd)
796{
Al Viro6c673ab2011-07-17 10:22:27 -0400797 struct inode *inode = gfs2_lookupi(dir, &dentry->d_name, 0);
798 if (inode && !IS_ERR(inode)) {
Steven Whitehouse9656b2c2008-01-08 08:14:30 +0000799 struct gfs2_glock *gl = GFS2_I(inode)->i_gl;
800 struct gfs2_holder gh;
801 int error;
802 error = gfs2_glock_nq_init(gl, LM_ST_SHARED, LM_FLAG_ANY, &gh);
803 if (error) {
804 iput(inode);
805 return ERR_PTR(error);
806 }
807 gfs2_glock_dq_uninit(&gh);
Steven Whitehouse9656b2c2008-01-08 08:14:30 +0000808 }
Al Viro6c673ab2011-07-17 10:22:27 -0400809 return d_splice_alias(inode, dentry);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000810}
811
812/**
813 * gfs2_link - Link to a file
814 * @old_dentry: The inode to link
815 * @dir: Add link to this directory
816 * @dentry: The name of the link
817 *
818 * Link the inode in "old_dentry" into the directory "dir" with the
819 * name in "dentry".
820 *
821 * Returns: errno
822 */
823
824static int gfs2_link(struct dentry *old_dentry, struct inode *dir,
825 struct dentry *dentry)
826{
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -0400827 struct gfs2_inode *dip = GFS2_I(dir);
828 struct gfs2_sbd *sdp = GFS2_SB(dir);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000829 struct inode *inode = old_dentry->d_inode;
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -0400830 struct gfs2_inode *ip = GFS2_I(inode);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000831 struct gfs2_holder ghs[2];
Steven Whitehouse2baee032011-05-09 12:08:36 +0100832 struct buffer_head *dibh;
David Teiglandb3b94fa2006-01-16 16:50:04 +0000833 int alloc_required;
834 int error;
835
Steven Whitehouseb60623c2006-11-01 12:22:46 -0500836 if (S_ISDIR(inode->i_mode))
David Teiglandb3b94fa2006-01-16 16:50:04 +0000837 return -EPERM;
838
Bob Peterson0a305e42012-06-06 11:17:59 +0100839 error = gfs2_rs_alloc(dip);
840 if (error)
841 return error;
842
David Teiglandb3b94fa2006-01-16 16:50:04 +0000843 gfs2_holder_init(dip->i_gl, LM_ST_EXCLUSIVE, 0, ghs);
844 gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, ghs + 1);
845
Bob Peterson72dbf472008-08-12 13:39:29 -0500846 error = gfs2_glock_nq(ghs); /* parent */
David Teiglandb3b94fa2006-01-16 16:50:04 +0000847 if (error)
Bob Peterson72dbf472008-08-12 13:39:29 -0500848 goto out_parent;
849
850 error = gfs2_glock_nq(ghs + 1); /* child */
851 if (error)
852 goto out_child;
David Teiglandb3b94fa2006-01-16 16:50:04 +0000853
Steven Whitehoused192a8e2011-05-05 12:35:40 +0100854 error = -ENOENT;
855 if (inode->i_nlink == 0)
856 goto out_gunlock;
857
Al Viro10556cb2011-06-20 19:28:19 -0400858 error = gfs2_permission(dir, MAY_WRITE | MAY_EXEC);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000859 if (error)
860 goto out_gunlock;
861
Steven Whitehousedbb7cae2007-05-15 15:37:50 +0100862 error = gfs2_dir_check(dir, &dentry->d_name, NULL);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000863 switch (error) {
864 case -ENOENT:
865 break;
866 case 0:
867 error = -EEXIST;
868 default:
869 goto out_gunlock;
870 }
871
872 error = -EINVAL;
Steven Whitehouse4f561102006-11-01 14:04:17 -0500873 if (!dip->i_inode.i_nlink)
David Teiglandb3b94fa2006-01-16 16:50:04 +0000874 goto out_gunlock;
875 error = -EFBIG;
Steven Whitehousead6203f2008-11-03 13:59:19 +0000876 if (dip->i_entries == (u32)-1)
David Teiglandb3b94fa2006-01-16 16:50:04 +0000877 goto out_gunlock;
878 error = -EPERM;
879 if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
880 goto out_gunlock;
881 error = -EINVAL;
Steven Whitehouse4f561102006-11-01 14:04:17 -0500882 if (!ip->i_inode.i_nlink)
David Teiglandb3b94fa2006-01-16 16:50:04 +0000883 goto out_gunlock;
884 error = -EMLINK;
Steven Whitehouse4f561102006-11-01 14:04:17 -0500885 if (ip->i_inode.i_nlink == (u32)-1)
David Teiglandb3b94fa2006-01-16 16:50:04 +0000886 goto out_gunlock;
887
Steven Whitehousec7526662006-03-20 12:30:04 -0500888 alloc_required = error = gfs2_diradd_alloc_required(dir, &dentry->d_name);
889 if (error < 0)
David Teiglandb3b94fa2006-01-16 16:50:04 +0000890 goto out_gunlock;
Steven Whitehousec7526662006-03-20 12:30:04 -0500891 error = 0;
David Teiglandb3b94fa2006-01-16 16:50:04 +0000892
893 if (alloc_required) {
Steven Whitehoused82661d2008-03-10 15:34:50 +0000894 error = gfs2_quota_lock_check(dip);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000895 if (error)
Bob Peterson5407e242012-05-18 09:28:23 -0400896 goto out_gunlock;
David Teiglandb3b94fa2006-01-16 16:50:04 +0000897
Bob Peterson564e12b2011-11-21 13:36:17 -0500898 error = gfs2_inplace_reserve(dip, sdp->sd_max_dirres);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000899 if (error)
900 goto out_gunlock_q;
901
Steven Whitehouse1b502592006-05-18 14:10:52 -0400902 error = gfs2_trans_begin(sdp, sdp->sd_max_dirres +
Steven Whitehouse54335b12011-09-01 13:31:59 +0100903 gfs2_rg_blocks(dip) +
David Teiglandb3b94fa2006-01-16 16:50:04 +0000904 2 * RES_DINODE + RES_STATFS +
905 RES_QUOTA, 0);
906 if (error)
907 goto out_ipres;
908 } else {
909 error = gfs2_trans_begin(sdp, 2 * RES_DINODE + RES_LEAF, 0);
910 if (error)
911 goto out_ipres;
912 }
913
Steven Whitehouse2baee032011-05-09 12:08:36 +0100914 error = gfs2_meta_inode_buffer(ip, &dibh);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000915 if (error)
916 goto out_end_trans;
917
Steven Whitehouse3d6ecb72011-05-09 13:30:08 +0100918 error = gfs2_dir_add(dir, &dentry->d_name, ip);
Steven Whitehouse2baee032011-05-09 12:08:36 +0100919 if (error)
920 goto out_brelse;
David Teiglandb3b94fa2006-01-16 16:50:04 +0000921
Steven Whitehouse2baee032011-05-09 12:08:36 +0100922 gfs2_trans_add_bh(ip->i_gl, dibh, 1);
923 inc_nlink(&ip->i_inode);
924 ip->i_inode.i_ctime = CURRENT_TIME;
Steven Whitehouseab9bbda2011-08-15 14:20:36 +0100925 ihold(inode);
926 d_instantiate(dentry, inode);
927 mark_inode_dirty(inode);
Steven Whitehouse2baee032011-05-09 12:08:36 +0100928
929out_brelse:
930 brelse(dibh);
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -0400931out_end_trans:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000932 gfs2_trans_end(sdp);
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -0400933out_ipres:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000934 if (alloc_required)
935 gfs2_inplace_release(dip);
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -0400936out_gunlock_q:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000937 if (alloc_required)
938 gfs2_quota_unlock(dip);
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -0400939out_gunlock:
Bob Peterson72dbf472008-08-12 13:39:29 -0500940 gfs2_glock_dq(ghs + 1);
941out_child:
942 gfs2_glock_dq(ghs);
943out_parent:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000944 gfs2_holder_uninit(ghs);
945 gfs2_holder_uninit(ghs + 1);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000946 return error;
947}
948
Steven Whitehouse87ec2172009-05-22 10:54:50 +0100949/*
950 * gfs2_unlink_ok - check to see that a inode is still in a directory
951 * @dip: the directory
952 * @name: the name of the file
953 * @ip: the inode
954 *
955 * Assumes that the lock on (at least) @dip is held.
956 *
957 * Returns: 0 if the parent/child relationship is correct, errno if it isn't
958 */
959
960static int gfs2_unlink_ok(struct gfs2_inode *dip, const struct qstr *name,
961 const struct gfs2_inode *ip)
962{
963 int error;
964
965 if (IS_IMMUTABLE(&ip->i_inode) || IS_APPEND(&ip->i_inode))
966 return -EPERM;
967
968 if ((dip->i_inode.i_mode & S_ISVTX) &&
969 dip->i_inode.i_uid != current_fsuid() &&
970 ip->i_inode.i_uid != current_fsuid() && !capable(CAP_FOWNER))
971 return -EPERM;
972
973 if (IS_APPEND(&dip->i_inode))
974 return -EPERM;
975
Al Viro10556cb2011-06-20 19:28:19 -0400976 error = gfs2_permission(&dip->i_inode, MAY_WRITE | MAY_EXEC);
Steven Whitehouse87ec2172009-05-22 10:54:50 +0100977 if (error)
978 return error;
979
980 error = gfs2_dir_check(&dip->i_inode, name, ip);
981 if (error)
982 return error;
983
984 return 0;
985}
986
David Teiglandb3b94fa2006-01-16 16:50:04 +0000987/**
Steven Whitehouse855d23c2011-05-09 16:42:37 +0100988 * gfs2_unlink_inode - Removes an inode from its parent dir and unlinks it
989 * @dip: The parent directory
990 * @name: The name of the entry in the parent directory
991 * @bh: The inode buffer for the inode to be removed
992 * @inode: The inode to be removed
993 *
994 * Called with all the locks and in a transaction. This will only be
995 * called for a directory after it has been checked to ensure it is empty.
996 *
997 * Returns: 0 on success, or an error
998 */
999
1000static int gfs2_unlink_inode(struct gfs2_inode *dip,
1001 const struct dentry *dentry,
1002 struct buffer_head *bh)
1003{
1004 struct inode *inode = dentry->d_inode;
1005 struct gfs2_inode *ip = GFS2_I(inode);
1006 int error;
1007
1008 error = gfs2_dir_del(dip, dentry);
1009 if (error)
1010 return error;
1011
1012 ip->i_entries = 0;
1013 inode->i_ctime = CURRENT_TIME;
1014 if (S_ISDIR(inode->i_mode))
1015 clear_nlink(inode);
1016 else
1017 drop_nlink(inode);
Steven Whitehouse855d23c2011-05-09 16:42:37 +01001018 mark_inode_dirty(inode);
1019 if (inode->i_nlink == 0)
1020 gfs2_unlink_di(inode);
1021 return 0;
1022}
1023
1024
1025/**
1026 * gfs2_unlink - Unlink an inode (this does rmdir as well)
1027 * @dir: The inode of the directory containing the inode to unlink
David Teiglandb3b94fa2006-01-16 16:50:04 +00001028 * @dentry: The file itself
1029 *
Steven Whitehouse855d23c2011-05-09 16:42:37 +01001030 * This routine uses the type of the inode as a flag to figure out
1031 * whether this is an unlink or an rmdir.
David Teiglandb3b94fa2006-01-16 16:50:04 +00001032 *
1033 * Returns: errno
1034 */
1035
1036static int gfs2_unlink(struct inode *dir, struct dentry *dentry)
1037{
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001038 struct gfs2_inode *dip = GFS2_I(dir);
1039 struct gfs2_sbd *sdp = GFS2_SB(dir);
Steven Whitehouse855d23c2011-05-09 16:42:37 +01001040 struct inode *inode = dentry->d_inode;
1041 struct gfs2_inode *ip = GFS2_I(inode);
1042 struct buffer_head *bh;
Russell Cattelanddee7602007-01-29 17:13:44 -06001043 struct gfs2_holder ghs[3];
1044 struct gfs2_rgrpd *rgd;
Bob Peterson5e2f7d62012-04-04 22:11:16 -04001045 int error;
1046
1047 error = gfs2_rindex_update(sdp);
1048 if (error)
1049 return error;
1050
1051 error = -EROFS;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001052
Russell Cattelanddee7602007-01-29 17:13:44 -06001053 gfs2_holder_init(dip->i_gl, LM_ST_EXCLUSIVE, 0, ghs);
1054 gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, ghs + 1);
1055
Steven Whitehouse66fc0612012-02-08 12:58:32 +00001056 rgd = gfs2_blk2rgrpd(sdp, ip->i_no_addr, 1);
Steven Whitehousea365fbf2012-02-24 15:09:14 +00001057 if (!rgd)
Steven Whitehouse87654892011-11-08 14:04:20 +00001058 goto out_inodes;
Steven Whitehousea365fbf2012-02-24 15:09:14 +00001059
Russell Cattelanddee7602007-01-29 17:13:44 -06001060 gfs2_holder_init(rgd->rd_gl, LM_ST_EXCLUSIVE, 0, ghs + 2);
1061
1062
Steven Whitehouse8497a462007-08-26 14:23:56 +01001063 error = gfs2_glock_nq(ghs); /* parent */
David Teiglandb3b94fa2006-01-16 16:50:04 +00001064 if (error)
Steven Whitehouse8497a462007-08-26 14:23:56 +01001065 goto out_parent;
1066
1067 error = gfs2_glock_nq(ghs + 1); /* child */
1068 if (error)
1069 goto out_child;
1070
Steven Whitehoused192a8e2011-05-05 12:35:40 +01001071 error = -ENOENT;
Steven Whitehouse855d23c2011-05-09 16:42:37 +01001072 if (inode->i_nlink == 0)
Steven Whitehoused192a8e2011-05-05 12:35:40 +01001073 goto out_rgrp;
1074
Steven Whitehouse855d23c2011-05-09 16:42:37 +01001075 if (S_ISDIR(inode->i_mode)) {
1076 error = -ENOTEMPTY;
1077 if (ip->i_entries > 2 || inode->i_nlink > 2)
1078 goto out_rgrp;
1079 }
1080
Steven Whitehouse8497a462007-08-26 14:23:56 +01001081 error = gfs2_glock_nq(ghs + 2); /* rgrp */
1082 if (error)
1083 goto out_rgrp;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001084
1085 error = gfs2_unlink_ok(dip, &dentry->d_name, ip);
1086 if (error)
Bob Peterson72dbf472008-08-12 13:39:29 -05001087 goto out_gunlock;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001088
Steven Whitehouse855d23c2011-05-09 16:42:37 +01001089 error = gfs2_trans_begin(sdp, 2*RES_DINODE + 3*RES_LEAF + RES_RG_BIT, 0);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001090 if (error)
Roel Kluincd012072009-08-22 19:26:42 +02001091 goto out_gunlock;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001092
Steven Whitehouse855d23c2011-05-09 16:42:37 +01001093 error = gfs2_meta_inode_buffer(ip, &bh);
1094 if (error)
1095 goto out_end_trans;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001096
Steven Whitehouse855d23c2011-05-09 16:42:37 +01001097 error = gfs2_unlink_inode(dip, dentry, bh);
1098 brelse(bh);
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001099
1100out_end_trans:
David Teiglandb3b94fa2006-01-16 16:50:04 +00001101 gfs2_trans_end(sdp);
Bob Peterson72dbf472008-08-12 13:39:29 -05001102out_gunlock:
Steven Whitehouse8497a462007-08-26 14:23:56 +01001103 gfs2_glock_dq(ghs + 2);
1104out_rgrp:
Steven Whitehouse8497a462007-08-26 14:23:56 +01001105 gfs2_glock_dq(ghs + 1);
1106out_child:
Steven Whitehouse8497a462007-08-26 14:23:56 +01001107 gfs2_glock_dq(ghs);
1108out_parent:
Steven Whitehouse87654892011-11-08 14:04:20 +00001109 gfs2_holder_uninit(ghs + 2);
1110out_inodes:
1111 gfs2_holder_uninit(ghs + 1);
Steven Whitehouse8497a462007-08-26 14:23:56 +01001112 gfs2_holder_uninit(ghs);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001113 return error;
1114}
1115
1116/**
1117 * gfs2_symlink - Create a symlink
1118 * @dir: The directory to create the symlink in
1119 * @dentry: The dentry to put the symlink in
1120 * @symname: The thing which the link points to
1121 *
1122 * Returns: errno
1123 */
1124
1125static int gfs2_symlink(struct inode *dir, struct dentry *dentry,
1126 const char *symname)
1127{
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001128 struct gfs2_sbd *sdp = GFS2_SB(dir);
Steven Whitehouse160b4022011-05-13 10:34:59 +01001129 unsigned int size;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001130
David Teiglandb3b94fa2006-01-16 16:50:04 +00001131 size = strlen(symname);
1132 if (size > sdp->sd_sb.sb_bsize - sizeof(struct gfs2_dinode) - 1)
1133 return -ENAMETOOLONG;
1134
Steven Whitehouse9a63edd2011-08-18 14:35:53 +01001135 return gfs2_create_inode(dir, dentry, S_IFLNK | S_IRWXUGO, 0, symname, size, 0);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001136}
1137
1138/**
1139 * gfs2_mkdir - Make a directory
1140 * @dir: The parent directory of the new one
1141 * @dentry: The dentry of the new directory
1142 * @mode: The mode of the new directory
1143 *
1144 * Returns: errno
1145 */
1146
Al Viro18bb1db2011-07-26 01:41:39 -04001147static int gfs2_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
David Teiglandb3b94fa2006-01-16 16:50:04 +00001148{
Steven Whitehouse9a63edd2011-08-18 14:35:53 +01001149 return gfs2_create_inode(dir, dentry, S_IFDIR | mode, 0, NULL, 0, 0);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001150}
1151
1152/**
David Teiglandb3b94fa2006-01-16 16:50:04 +00001153 * gfs2_mknod - Make a special file
1154 * @dir: The directory in which the special file will reside
1155 * @dentry: The dentry of the special file
1156 * @mode: The mode of the special file
Steven Whitehousef2741d92011-05-13 12:11:17 +01001157 * @dev: The device specification of the special file
David Teiglandb3b94fa2006-01-16 16:50:04 +00001158 *
1159 */
1160
Al Viro1a67aaf2011-07-26 01:52:52 -04001161static int gfs2_mknod(struct inode *dir, struct dentry *dentry, umode_t mode,
David Teiglandb3b94fa2006-01-16 16:50:04 +00001162 dev_t dev)
1163{
Steven Whitehouse9a63edd2011-08-18 14:35:53 +01001164 return gfs2_create_inode(dir, dentry, mode, dev, NULL, 0, 0);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001165}
1166
Steven Whitehouse0188d6c2008-08-26 09:38:26 +01001167/*
1168 * gfs2_ok_to_move - check if it's ok to move a directory to another directory
1169 * @this: move this
1170 * @to: to here
1171 *
1172 * Follow @to back to the root and make sure we don't encounter @this
1173 * Assumes we already hold the rename lock.
1174 *
1175 * Returns: errno
1176 */
1177
1178static int gfs2_ok_to_move(struct gfs2_inode *this, struct gfs2_inode *to)
1179{
1180 struct inode *dir = &to->i_inode;
1181 struct super_block *sb = dir->i_sb;
1182 struct inode *tmp;
Steven Whitehouse0188d6c2008-08-26 09:38:26 +01001183 int error = 0;
1184
Steven Whitehouse0188d6c2008-08-26 09:38:26 +01001185 igrab(dir);
1186
1187 for (;;) {
1188 if (dir == &this->i_inode) {
1189 error = -EINVAL;
1190 break;
1191 }
1192 if (dir == sb->s_root->d_inode) {
1193 error = 0;
1194 break;
1195 }
1196
Steven Whitehouse8d123582010-09-17 12:30:23 +01001197 tmp = gfs2_lookupi(dir, &gfs2_qdotdot, 1);
Steven Whitehouse0188d6c2008-08-26 09:38:26 +01001198 if (IS_ERR(tmp)) {
1199 error = PTR_ERR(tmp);
1200 break;
1201 }
1202
1203 iput(dir);
1204 dir = tmp;
1205 }
1206
1207 iput(dir);
1208
1209 return error;
1210}
1211
David Teiglandb3b94fa2006-01-16 16:50:04 +00001212/**
1213 * gfs2_rename - Rename a file
1214 * @odir: Parent directory of old file name
1215 * @odentry: The old dentry of the file
1216 * @ndir: Parent directory of new file name
1217 * @ndentry: The new dentry of the file
1218 *
1219 * Returns: errno
1220 */
1221
1222static int gfs2_rename(struct inode *odir, struct dentry *odentry,
1223 struct inode *ndir, struct dentry *ndentry)
1224{
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001225 struct gfs2_inode *odip = GFS2_I(odir);
1226 struct gfs2_inode *ndip = GFS2_I(ndir);
1227 struct gfs2_inode *ip = GFS2_I(odentry->d_inode);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001228 struct gfs2_inode *nip = NULL;
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001229 struct gfs2_sbd *sdp = GFS2_SB(odir);
Steven Whitehouse8339ee52011-08-31 16:38:29 +01001230 struct gfs2_holder ghs[5], r_gh = { .gh_gl = NULL, };
Russell Cattelanddee7602007-01-29 17:13:44 -06001231 struct gfs2_rgrpd *nrgd;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001232 unsigned int num_gh;
1233 int dir_rename = 0;
Steven Whitehouse24b977b2009-12-09 13:55:12 +00001234 int alloc_required = 0;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001235 unsigned int x;
1236 int error;
1237
David Teiglandb3b94fa2006-01-16 16:50:04 +00001238 if (ndentry->d_inode) {
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001239 nip = GFS2_I(ndentry->d_inode);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001240 if (ip == nip)
1241 return 0;
1242 }
1243
Bob Peterson5e2f7d62012-04-04 22:11:16 -04001244 error = gfs2_rindex_update(sdp);
1245 if (error)
1246 return error;
1247
Bob Peterson0a305e42012-06-06 11:17:59 +01001248 error = gfs2_rs_alloc(ndip);
1249 if (error)
1250 return error;
1251
Steven Whitehouse0188d6c2008-08-26 09:38:26 +01001252 if (odip != ndip) {
1253 error = gfs2_glock_nq_init(sdp->sd_rename_gl, LM_ST_EXCLUSIVE,
1254 0, &r_gh);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001255 if (error)
1256 goto out;
1257
Steven Whitehouse0188d6c2008-08-26 09:38:26 +01001258 if (S_ISDIR(ip->i_inode.i_mode)) {
1259 dir_rename = 1;
1260 /* don't move a dirctory into it's subdir */
1261 error = gfs2_ok_to_move(ip, ndip);
1262 if (error)
1263 goto out_gunlock_r;
1264 }
David Teiglandb3b94fa2006-01-16 16:50:04 +00001265 }
1266
Steven Whitehoused9d1ca32006-06-21 15:38:17 -04001267 num_gh = 1;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001268 gfs2_holder_init(odip->i_gl, LM_ST_EXCLUSIVE, 0, ghs);
Steven Whitehoused9d1ca32006-06-21 15:38:17 -04001269 if (odip != ndip) {
1270 gfs2_holder_init(ndip->i_gl, LM_ST_EXCLUSIVE, 0, ghs + num_gh);
1271 num_gh++;
1272 }
1273 gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, ghs + num_gh);
1274 num_gh++;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001275
Steven Whitehoused9d1ca32006-06-21 15:38:17 -04001276 if (nip) {
1277 gfs2_holder_init(nip->i_gl, LM_ST_EXCLUSIVE, 0, ghs + num_gh);
1278 num_gh++;
Russell Cattelanddee7602007-01-29 17:13:44 -06001279 /* grab the resource lock for unlink flag twiddling
1280 * this is the case of the target file already existing
1281 * so we unlink before doing the rename
1282 */
Steven Whitehouse66fc0612012-02-08 12:58:32 +00001283 nrgd = gfs2_blk2rgrpd(sdp, nip->i_no_addr, 1);
Russell Cattelanddee7602007-01-29 17:13:44 -06001284 if (nrgd)
1285 gfs2_holder_init(nrgd->rd_gl, LM_ST_EXCLUSIVE, 0, ghs + num_gh++);
Steven Whitehoused9d1ca32006-06-21 15:38:17 -04001286 }
David Teiglandb3b94fa2006-01-16 16:50:04 +00001287
Bob Peterson72dbf472008-08-12 13:39:29 -05001288 for (x = 0; x < num_gh; x++) {
1289 error = gfs2_glock_nq(ghs + x);
1290 if (error)
1291 goto out_gunlock;
1292 }
David Teiglandb3b94fa2006-01-16 16:50:04 +00001293
Steven Whitehoused192a8e2011-05-05 12:35:40 +01001294 error = -ENOENT;
1295 if (ip->i_inode.i_nlink == 0)
1296 goto out_gunlock;
1297
David Teiglandb3b94fa2006-01-16 16:50:04 +00001298 /* Check out the old directory */
1299
1300 error = gfs2_unlink_ok(odip, &odentry->d_name, ip);
1301 if (error)
1302 goto out_gunlock;
1303
1304 /* Check out the new directory */
1305
1306 if (nip) {
1307 error = gfs2_unlink_ok(ndip, &ndentry->d_name, nip);
1308 if (error)
1309 goto out_gunlock;
1310
Steven Whitehoused192a8e2011-05-05 12:35:40 +01001311 if (nip->i_inode.i_nlink == 0) {
1312 error = -EAGAIN;
1313 goto out_gunlock;
1314 }
1315
Steven Whitehouseb60623c2006-11-01 12:22:46 -05001316 if (S_ISDIR(nip->i_inode.i_mode)) {
Steven Whitehousead6203f2008-11-03 13:59:19 +00001317 if (nip->i_entries < 2) {
Steven Whitehouse94fb7632011-05-09 13:36:10 +01001318 gfs2_consist_inode(nip);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001319 error = -EIO;
1320 goto out_gunlock;
1321 }
Steven Whitehousead6203f2008-11-03 13:59:19 +00001322 if (nip->i_entries > 2) {
David Teiglandb3b94fa2006-01-16 16:50:04 +00001323 error = -ENOTEMPTY;
1324 goto out_gunlock;
1325 }
1326 }
1327 } else {
Al Viro10556cb2011-06-20 19:28:19 -04001328 error = gfs2_permission(ndir, MAY_WRITE | MAY_EXEC);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001329 if (error)
1330 goto out_gunlock;
1331
Steven Whitehousedbb7cae2007-05-15 15:37:50 +01001332 error = gfs2_dir_check(ndir, &ndentry->d_name, NULL);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001333 switch (error) {
1334 case -ENOENT:
1335 error = 0;
1336 break;
1337 case 0:
1338 error = -EEXIST;
1339 default:
1340 goto out_gunlock;
1341 };
1342
1343 if (odip != ndip) {
Steven Whitehouse4f561102006-11-01 14:04:17 -05001344 if (!ndip->i_inode.i_nlink) {
Steven Whitehoused192a8e2011-05-05 12:35:40 +01001345 error = -ENOENT;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001346 goto out_gunlock;
1347 }
Steven Whitehousead6203f2008-11-03 13:59:19 +00001348 if (ndip->i_entries == (u32)-1) {
David Teiglandb3b94fa2006-01-16 16:50:04 +00001349 error = -EFBIG;
1350 goto out_gunlock;
1351 }
Steven Whitehouseb60623c2006-11-01 12:22:46 -05001352 if (S_ISDIR(ip->i_inode.i_mode) &&
Steven Whitehouse4f561102006-11-01 14:04:17 -05001353 ndip->i_inode.i_nlink == (u32)-1) {
David Teiglandb3b94fa2006-01-16 16:50:04 +00001354 error = -EMLINK;
1355 goto out_gunlock;
1356 }
1357 }
1358 }
1359
1360 /* Check out the dir to be renamed */
1361
1362 if (dir_rename) {
Al Viro10556cb2011-06-20 19:28:19 -04001363 error = gfs2_permission(odentry->d_inode, MAY_WRITE);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001364 if (error)
1365 goto out_gunlock;
1366 }
1367
Steven Whitehouse24b977b2009-12-09 13:55:12 +00001368 if (nip == NULL)
1369 alloc_required = gfs2_diradd_alloc_required(ndir, &ndentry->d_name);
1370 error = alloc_required;
Steven Whitehousec7526662006-03-20 12:30:04 -05001371 if (error < 0)
David Teiglandb3b94fa2006-01-16 16:50:04 +00001372 goto out_gunlock;
1373
1374 if (alloc_required) {
Steven Whitehoused82661d2008-03-10 15:34:50 +00001375 error = gfs2_quota_lock_check(ndip);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001376 if (error)
Bob Peterson5407e242012-05-18 09:28:23 -04001377 goto out_gunlock;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001378
Bob Peterson564e12b2011-11-21 13:36:17 -05001379 error = gfs2_inplace_reserve(ndip, sdp->sd_max_dirres);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001380 if (error)
1381 goto out_gunlock_q;
1382
Steven Whitehousefe1bded2006-04-18 10:09:15 -04001383 error = gfs2_trans_begin(sdp, sdp->sd_max_dirres +
Steven Whitehouse54335b12011-09-01 13:31:59 +01001384 gfs2_rg_blocks(ndip) +
David Teiglandb3b94fa2006-01-16 16:50:04 +00001385 4 * RES_DINODE + 4 * RES_LEAF +
S. Wendy Cheng87d21e02007-01-18 16:07:03 -05001386 RES_STATFS + RES_QUOTA + 4, 0);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001387 if (error)
1388 goto out_ipreserv;
1389 } else {
1390 error = gfs2_trans_begin(sdp, 4 * RES_DINODE +
S. Wendy Cheng87d21e02007-01-18 16:07:03 -05001391 5 * RES_LEAF + 4, 0);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001392 if (error)
1393 goto out_gunlock;
1394 }
1395
1396 /* Remove the target file, if it exists */
1397
1398 if (nip) {
Steven Whitehouse855d23c2011-05-09 16:42:37 +01001399 struct buffer_head *bh;
1400 error = gfs2_meta_inode_buffer(nip, &bh);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001401 if (error)
1402 goto out_end_trans;
Steven Whitehouse855d23c2011-05-09 16:42:37 +01001403 error = gfs2_unlink_inode(ndip, ndentry, bh);
1404 brelse(bh);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001405 }
1406
1407 if (dir_rename) {
Steven Whitehouse8d123582010-09-17 12:30:23 +01001408 error = gfs2_dir_mvino(ip, &gfs2_qdotdot, ndip, DT_DIR);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001409 if (error)
1410 goto out_end_trans;
1411 } else {
1412 struct buffer_head *dibh;
1413 error = gfs2_meta_inode_buffer(ip, &dibh);
1414 if (error)
1415 goto out_end_trans;
Steven Whitehouse4bd91ba2007-06-05 09:39:18 +01001416 ip->i_inode.i_ctime = CURRENT_TIME;
Steven Whitehoused4e9c4c2006-01-18 11:19:28 +00001417 gfs2_trans_add_bh(ip->i_gl, dibh, 1);
Steven Whitehouse539e5d62006-10-31 15:07:05 -05001418 gfs2_dinode_out(ip, dibh->b_data);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001419 brelse(dibh);
1420 }
1421
Steven Whitehouse855d23c2011-05-09 16:42:37 +01001422 error = gfs2_dir_del(odip, odentry);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001423 if (error)
1424 goto out_end_trans;
1425
Steven Whitehouse3d6ecb72011-05-09 13:30:08 +01001426 error = gfs2_dir_add(ndir, &ndentry->d_name, ip);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001427 if (error)
1428 goto out_end_trans;
1429
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001430out_end_trans:
David Teiglandb3b94fa2006-01-16 16:50:04 +00001431 gfs2_trans_end(sdp);
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001432out_ipreserv:
David Teiglandb3b94fa2006-01-16 16:50:04 +00001433 if (alloc_required)
1434 gfs2_inplace_release(ndip);
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001435out_gunlock_q:
David Teiglandb3b94fa2006-01-16 16:50:04 +00001436 if (alloc_required)
1437 gfs2_quota_unlock(ndip);
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001438out_gunlock:
Bob Peterson72dbf472008-08-12 13:39:29 -05001439 while (x--) {
1440 gfs2_glock_dq(ghs + x);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001441 gfs2_holder_uninit(ghs + x);
Bob Peterson72dbf472008-08-12 13:39:29 -05001442 }
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001443out_gunlock_r:
Steven Whitehouse0188d6c2008-08-26 09:38:26 +01001444 if (r_gh.gh_gl)
David Teiglandb3b94fa2006-01-16 16:50:04 +00001445 gfs2_glock_dq_uninit(&r_gh);
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001446out:
David Teiglandb3b94fa2006-01-16 16:50:04 +00001447 return error;
1448}
1449
1450/**
David Teiglandb3b94fa2006-01-16 16:50:04 +00001451 * gfs2_follow_link - Follow a symbolic link
1452 * @dentry: The dentry of the link
1453 * @nd: Data that we pass to vfs_follow_link()
1454 *
Al Viroc177c2a2010-01-14 00:59:16 -05001455 * This can handle symlinks of any size.
David Teiglandb3b94fa2006-01-16 16:50:04 +00001456 *
1457 * Returns: 0 on success or error code
1458 */
1459
1460static void *gfs2_follow_link(struct dentry *dentry, struct nameidata *nd)
1461{
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001462 struct gfs2_inode *ip = GFS2_I(dentry->d_inode);
Al Viroc177c2a2010-01-14 00:59:16 -05001463 struct gfs2_holder i_gh;
1464 struct buffer_head *dibh;
Steven Whitehouse160b4022011-05-13 10:34:59 +01001465 unsigned int size;
Al Viroc177c2a2010-01-14 00:59:16 -05001466 char *buf;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001467 int error;
1468
Al Viroc177c2a2010-01-14 00:59:16 -05001469 gfs2_holder_init(ip->i_gl, LM_ST_SHARED, 0, &i_gh);
1470 error = gfs2_glock_nq(&i_gh);
1471 if (error) {
1472 gfs2_holder_uninit(&i_gh);
1473 nd_set_link(nd, ERR_PTR(error));
1474 return NULL;
1475 }
David Teiglandb3b94fa2006-01-16 16:50:04 +00001476
Steven Whitehousea2e0f792010-08-11 09:53:11 +01001477 size = (unsigned int)i_size_read(&ip->i_inode);
1478 if (size == 0) {
Al Viroc177c2a2010-01-14 00:59:16 -05001479 gfs2_consist_inode(ip);
1480 buf = ERR_PTR(-EIO);
1481 goto out;
1482 }
1483
1484 error = gfs2_meta_inode_buffer(ip, &dibh);
1485 if (error) {
1486 buf = ERR_PTR(error);
1487 goto out;
1488 }
1489
Steven Whitehouse160b4022011-05-13 10:34:59 +01001490 buf = kzalloc(size + 1, GFP_NOFS);
Al Viroc177c2a2010-01-14 00:59:16 -05001491 if (!buf)
1492 buf = ERR_PTR(-ENOMEM);
1493 else
Steven Whitehouse160b4022011-05-13 10:34:59 +01001494 memcpy(buf, dibh->b_data + sizeof(struct gfs2_dinode), size);
Al Viroc177c2a2010-01-14 00:59:16 -05001495 brelse(dibh);
1496out:
1497 gfs2_glock_dq_uninit(&i_gh);
1498 nd_set_link(nd, buf);
1499 return NULL;
1500}
1501
1502static void gfs2_put_link(struct dentry *dentry, struct nameidata *nd, void *p)
1503{
1504 char *s = nd_get_link(nd);
1505 if (!IS_ERR(s))
1506 kfree(s);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001507}
1508
1509/**
1510 * gfs2_permission -
Steven Whitehouse75d5cfb2011-01-19 09:42:40 +00001511 * @inode: The inode
1512 * @mask: The mask to be tested
1513 * @flags: Indicates whether this is an RCU path walk or not
David Teiglandb3b94fa2006-01-16 16:50:04 +00001514 *
Steven Whitehouse300c7d72006-11-27 09:55:28 -05001515 * This may be called from the VFS directly, or from within GFS2 with the
1516 * inode locked, so we look to see if the glock is already locked and only
1517 * lock the glock if its not already been done.
1518 *
David Teiglandb3b94fa2006-01-16 16:50:04 +00001519 * Returns: errno
1520 */
1521
Al Viro10556cb2011-06-20 19:28:19 -04001522int gfs2_permission(struct inode *inode, int mask)
David Teiglandb3b94fa2006-01-16 16:50:04 +00001523{
Nick Pigginb74c79e2011-01-07 17:49:58 +11001524 struct gfs2_inode *ip;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001525 struct gfs2_holder i_gh;
1526 int error;
Steven Whitehouse300c7d72006-11-27 09:55:28 -05001527 int unlock = 0;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001528
Nick Pigginb74c79e2011-01-07 17:49:58 +11001529
1530 ip = GFS2_I(inode);
Steven Whitehouse7afd88d2008-02-22 16:07:18 +00001531 if (gfs2_glock_is_locked_by_me(ip->i_gl) == NULL) {
Al Viro10556cb2011-06-20 19:28:19 -04001532 if (mask & MAY_NOT_BLOCK)
Steven Whitehouse75d5cfb2011-01-19 09:42:40 +00001533 return -ECHILD;
Steven Whitehouse300c7d72006-11-27 09:55:28 -05001534 error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &i_gh);
1535 if (error)
1536 return error;
1537 unlock = 1;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001538 }
1539
Miklos Szeredif58ba882008-07-02 21:12:01 +02001540 if ((mask & MAY_WRITE) && IS_IMMUTABLE(inode))
1541 error = -EACCES;
1542 else
Al Viro2830ba72011-06-20 19:16:29 -04001543 error = generic_permission(inode, mask);
Steven Whitehouse300c7d72006-11-27 09:55:28 -05001544 if (unlock)
1545 gfs2_glock_dq_uninit(&i_gh);
1546
David Teiglandb3b94fa2006-01-16 16:50:04 +00001547 return error;
1548}
1549
Steven Whitehouseab9bbda2011-08-15 14:20:36 +01001550static int __gfs2_setattr_simple(struct inode *inode, struct iattr *attr)
Steven Whitehouse194c0112011-05-09 14:06:38 +01001551{
Steven Whitehouse194c0112011-05-09 14:06:38 +01001552 setattr_copy(inode, attr);
1553 mark_inode_dirty(inode);
Steven Whitehouse194c0112011-05-09 14:06:38 +01001554 return 0;
1555}
1556
1557/**
1558 * gfs2_setattr_simple -
1559 * @ip:
1560 * @attr:
1561 *
1562 * Returns: errno
1563 */
1564
Steven Whitehouseab9bbda2011-08-15 14:20:36 +01001565int gfs2_setattr_simple(struct inode *inode, struct iattr *attr)
Steven Whitehouse194c0112011-05-09 14:06:38 +01001566{
1567 int error;
1568
1569 if (current->journal_info)
Steven Whitehouseab9bbda2011-08-15 14:20:36 +01001570 return __gfs2_setattr_simple(inode, attr);
Steven Whitehouse194c0112011-05-09 14:06:38 +01001571
Steven Whitehouseab9bbda2011-08-15 14:20:36 +01001572 error = gfs2_trans_begin(GFS2_SB(inode), RES_DINODE, 0);
Steven Whitehouse194c0112011-05-09 14:06:38 +01001573 if (error)
1574 return error;
1575
Steven Whitehouseab9bbda2011-08-15 14:20:36 +01001576 error = __gfs2_setattr_simple(inode, attr);
1577 gfs2_trans_end(GFS2_SB(inode));
Steven Whitehouse194c0112011-05-09 14:06:38 +01001578 return error;
1579}
1580
David Teiglandb3b94fa2006-01-16 16:50:04 +00001581static int setattr_chown(struct inode *inode, struct iattr *attr)
1582{
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001583 struct gfs2_inode *ip = GFS2_I(inode);
1584 struct gfs2_sbd *sdp = GFS2_SB(inode);
Steven Whitehousecd915492006-09-04 12:49:07 -04001585 u32 ouid, ogid, nuid, ngid;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001586 int error;
1587
Steven Whitehouse2933f922006-11-01 13:23:29 -05001588 ouid = inode->i_uid;
1589 ogid = inode->i_gid;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001590 nuid = attr->ia_uid;
1591 ngid = attr->ia_gid;
1592
1593 if (!(attr->ia_valid & ATTR_UID) || ouid == nuid)
1594 ouid = nuid = NO_QUOTA_CHANGE;
1595 if (!(attr->ia_valid & ATTR_GID) || ogid == ngid)
1596 ogid = ngid = NO_QUOTA_CHANGE;
1597
David Teiglandb3b94fa2006-01-16 16:50:04 +00001598 error = gfs2_quota_lock(ip, nuid, ngid);
1599 if (error)
Bob Peterson5407e242012-05-18 09:28:23 -04001600 return error;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001601
1602 if (ouid != NO_QUOTA_CHANGE || ogid != NO_QUOTA_CHANGE) {
1603 error = gfs2_quota_check(ip, nuid, ngid);
1604 if (error)
1605 goto out_gunlock_q;
1606 }
1607
1608 error = gfs2_trans_begin(sdp, RES_DINODE + 2 * RES_QUOTA, 0);
1609 if (error)
1610 goto out_gunlock_q;
1611
Steven Whitehouseab9bbda2011-08-15 14:20:36 +01001612 error = gfs2_setattr_simple(inode, attr);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001613 if (error)
1614 goto out_end_trans;
1615
David Teiglandb3b94fa2006-01-16 16:50:04 +00001616 if (ouid != NO_QUOTA_CHANGE || ogid != NO_QUOTA_CHANGE) {
Steven Whitehouse77658aa2008-02-12 14:17:27 +00001617 u64 blocks = gfs2_get_inode_blocks(&ip->i_inode);
1618 gfs2_quota_change(ip, -blocks, ouid, ogid);
1619 gfs2_quota_change(ip, blocks, nuid, ngid);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001620 }
1621
Steven Whitehousea91ea692006-09-04 12:04:26 -04001622out_end_trans:
David Teiglandb3b94fa2006-01-16 16:50:04 +00001623 gfs2_trans_end(sdp);
Steven Whitehousea91ea692006-09-04 12:04:26 -04001624out_gunlock_q:
David Teiglandb3b94fa2006-01-16 16:50:04 +00001625 gfs2_quota_unlock(ip);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001626 return error;
1627}
1628
1629/**
1630 * gfs2_setattr - Change attributes on an inode
1631 * @dentry: The dentry which is changing
1632 * @attr: The structure describing the change
1633 *
1634 * The VFS layer wants to change one or more of an inodes attributes. Write
1635 * that change out to disk.
1636 *
1637 * Returns: errno
1638 */
1639
1640static int gfs2_setattr(struct dentry *dentry, struct iattr *attr)
1641{
1642 struct inode *inode = dentry->d_inode;
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001643 struct gfs2_inode *ip = GFS2_I(inode);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001644 struct gfs2_holder i_gh;
1645 int error;
1646
Bob Peterson0a305e42012-06-06 11:17:59 +01001647 error = gfs2_rs_alloc(ip);
1648 if (error)
1649 return error;
1650
David Teiglandb3b94fa2006-01-16 16:50:04 +00001651 error = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &i_gh);
1652 if (error)
1653 return error;
1654
1655 error = -EPERM;
1656 if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
1657 goto out;
1658
1659 error = inode_change_ok(inode, attr);
1660 if (error)
1661 goto out;
1662
1663 if (attr->ia_valid & ATTR_SIZE)
Steven Whitehouseff8f33c2010-08-11 09:37:53 +01001664 error = gfs2_setattr_size(inode, attr->ia_size);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001665 else if (attr->ia_valid & (ATTR_UID | ATTR_GID))
1666 error = setattr_chown(inode, attr);
1667 else if ((attr->ia_valid & ATTR_MODE) && IS_POSIXACL(inode))
1668 error = gfs2_acl_chmod(ip, attr);
1669 else
Steven Whitehouseab9bbda2011-08-15 14:20:36 +01001670 error = gfs2_setattr_simple(inode, attr);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001671
Steven Whitehousea91ea692006-09-04 12:04:26 -04001672out:
David Teiglandb3b94fa2006-01-16 16:50:04 +00001673 if (!error)
1674 mark_inode_dirty(inode);
Steven Whitehouseab9bbda2011-08-15 14:20:36 +01001675 gfs2_glock_dq_uninit(&i_gh);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001676 return error;
1677}
1678
1679/**
1680 * gfs2_getattr - Read out an inode's attributes
Steven Whitehouse26c1a572006-09-04 15:32:10 -04001681 * @mnt: The vfsmount the inode is being accessed from
David Teiglandb3b94fa2006-01-16 16:50:04 +00001682 * @dentry: The dentry to stat
1683 * @stat: The inode's stats
1684 *
Steven Whitehousedcf3dd82006-11-27 10:12:05 -05001685 * This may be called from the VFS directly, or from within GFS2 with the
1686 * inode locked, so we look to see if the glock is already locked and only
1687 * lock the glock if its not already been done. Note that its the NFS
1688 * readdirplus operation which causes this to be called (from filldir)
1689 * with the glock already held.
1690 *
David Teiglandb3b94fa2006-01-16 16:50:04 +00001691 * Returns: errno
1692 */
1693
1694static int gfs2_getattr(struct vfsmount *mnt, struct dentry *dentry,
1695 struct kstat *stat)
1696{
1697 struct inode *inode = dentry->d_inode;
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001698 struct gfs2_inode *ip = GFS2_I(inode);
David Teiglandb3b94fa2006-01-16 16:50:04 +00001699 struct gfs2_holder gh;
1700 int error;
Steven Whitehousedcf3dd82006-11-27 10:12:05 -05001701 int unlock = 0;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001702
Steven Whitehouse7afd88d2008-02-22 16:07:18 +00001703 if (gfs2_glock_is_locked_by_me(ip->i_gl) == NULL) {
Steven Whitehousedcf3dd82006-11-27 10:12:05 -05001704 error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &gh);
1705 if (error)
1706 return error;
1707 unlock = 1;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001708 }
1709
Steven Whitehousedcf3dd82006-11-27 10:12:05 -05001710 generic_fillattr(inode, stat);
Steven Whitehoused7c103d2007-01-25 17:14:59 +00001711 if (unlock)
Steven Whitehousedcf3dd82006-11-27 10:12:05 -05001712 gfs2_glock_dq_uninit(&gh);
1713
1714 return 0;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001715}
1716
1717static int gfs2_setxattr(struct dentry *dentry, const char *name,
1718 const void *data, size_t size, int flags)
1719{
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -04001720 struct inode *inode = dentry->d_inode;
Steven Whitehouse40b78a32009-08-26 18:41:32 +01001721 struct gfs2_inode *ip = GFS2_I(inode);
1722 struct gfs2_holder gh;
1723 int ret;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001724
Steven Whitehouse40b78a32009-08-26 18:41:32 +01001725 gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh);
1726 ret = gfs2_glock_nq(&gh);
1727 if (ret == 0) {
1728 ret = generic_setxattr(dentry, name, data, size, flags);
1729 gfs2_glock_dq(&gh);
1730 }
1731 gfs2_holder_uninit(&gh);
1732 return ret;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001733}
1734
1735static ssize_t gfs2_getxattr(struct dentry *dentry, const char *name,
1736 void *data, size_t size)
1737{
Steven Whitehouse40b78a32009-08-26 18:41:32 +01001738 struct inode *inode = dentry->d_inode;
1739 struct gfs2_inode *ip = GFS2_I(inode);
1740 struct gfs2_holder gh;
1741 int ret;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001742
Steven Whitehouse40b78a32009-08-26 18:41:32 +01001743 gfs2_holder_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &gh);
1744 ret = gfs2_glock_nq(&gh);
1745 if (ret == 0) {
1746 ret = generic_getxattr(dentry, name, data, size);
1747 gfs2_glock_dq(&gh);
1748 }
1749 gfs2_holder_uninit(&gh);
1750 return ret;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001751}
1752
1753static int gfs2_removexattr(struct dentry *dentry, const char *name)
1754{
Steven Whitehouse40b78a32009-08-26 18:41:32 +01001755 struct inode *inode = dentry->d_inode;
1756 struct gfs2_inode *ip = GFS2_I(inode);
1757 struct gfs2_holder gh;
1758 int ret;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001759
Steven Whitehouse40b78a32009-08-26 18:41:32 +01001760 gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh);
1761 ret = gfs2_glock_nq(&gh);
1762 if (ret == 0) {
1763 ret = generic_removexattr(dentry, name);
1764 gfs2_glock_dq(&gh);
1765 }
1766 gfs2_holder_uninit(&gh);
1767 return ret;
David Teiglandb3b94fa2006-01-16 16:50:04 +00001768}
1769
Steven Whitehousee9079cc2008-10-14 14:43:29 +01001770static int gfs2_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
1771 u64 start, u64 len)
1772{
1773 struct gfs2_inode *ip = GFS2_I(inode);
1774 struct gfs2_holder gh;
1775 int ret;
1776
1777 ret = fiemap_check_flags(fieinfo, FIEMAP_FLAG_SYNC);
1778 if (ret)
1779 return ret;
1780
1781 mutex_lock(&inode->i_mutex);
1782
1783 ret = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, 0, &gh);
1784 if (ret)
1785 goto out;
1786
1787 if (gfs2_is_stuffed(ip)) {
1788 u64 phys = ip->i_no_addr << inode->i_blkbits;
1789 u64 size = i_size_read(inode);
1790 u32 flags = FIEMAP_EXTENT_LAST|FIEMAP_EXTENT_NOT_ALIGNED|
1791 FIEMAP_EXTENT_DATA_INLINE;
1792 phys += sizeof(struct gfs2_dinode);
1793 phys += start;
1794 if (start + len > size)
1795 len = size - start;
1796 if (start < size)
1797 ret = fiemap_fill_next_extent(fieinfo, start, phys,
1798 len, flags);
1799 if (ret == 1)
1800 ret = 0;
1801 } else {
1802 ret = __generic_block_fiemap(inode, fieinfo, start, len,
1803 gfs2_block_map);
1804 }
1805
1806 gfs2_glock_dq_uninit(&gh);
1807out:
1808 mutex_unlock(&inode->i_mutex);
1809 return ret;
1810}
1811
Arjan van de Ven92e1d5b2007-02-12 00:55:39 -08001812const struct inode_operations gfs2_file_iops = {
Al Viroe6305c42008-07-15 21:03:57 -04001813 .permission = gfs2_permission,
David Teiglandb3b94fa2006-01-16 16:50:04 +00001814 .setattr = gfs2_setattr,
1815 .getattr = gfs2_getattr,
1816 .setxattr = gfs2_setxattr,
1817 .getxattr = gfs2_getxattr,
1818 .listxattr = gfs2_listxattr,
1819 .removexattr = gfs2_removexattr,
Steven Whitehousee9079cc2008-10-14 14:43:29 +01001820 .fiemap = gfs2_fiemap,
Christoph Hellwig4e34e712011-07-23 17:37:31 +02001821 .get_acl = gfs2_get_acl,
David Teiglandb3b94fa2006-01-16 16:50:04 +00001822};
1823
Arjan van de Ven92e1d5b2007-02-12 00:55:39 -08001824const struct inode_operations gfs2_dir_iops = {
David Teiglandb3b94fa2006-01-16 16:50:04 +00001825 .create = gfs2_create,
1826 .lookup = gfs2_lookup,
1827 .link = gfs2_link,
1828 .unlink = gfs2_unlink,
1829 .symlink = gfs2_symlink,
1830 .mkdir = gfs2_mkdir,
Steven Whitehouse855d23c2011-05-09 16:42:37 +01001831 .rmdir = gfs2_unlink,
David Teiglandb3b94fa2006-01-16 16:50:04 +00001832 .mknod = gfs2_mknod,
1833 .rename = gfs2_rename,
Al Viroe6305c42008-07-15 21:03:57 -04001834 .permission = gfs2_permission,
David Teiglandb3b94fa2006-01-16 16:50:04 +00001835 .setattr = gfs2_setattr,
1836 .getattr = gfs2_getattr,
1837 .setxattr = gfs2_setxattr,
1838 .getxattr = gfs2_getxattr,
1839 .listxattr = gfs2_listxattr,
1840 .removexattr = gfs2_removexattr,
Steven Whitehousee9079cc2008-10-14 14:43:29 +01001841 .fiemap = gfs2_fiemap,
Christoph Hellwig4e34e712011-07-23 17:37:31 +02001842 .get_acl = gfs2_get_acl,
David Teiglandb3b94fa2006-01-16 16:50:04 +00001843};
1844
Arjan van de Ven92e1d5b2007-02-12 00:55:39 -08001845const struct inode_operations gfs2_symlink_iops = {
Al Viroc177c2a2010-01-14 00:59:16 -05001846 .readlink = generic_readlink,
David Teiglandb3b94fa2006-01-16 16:50:04 +00001847 .follow_link = gfs2_follow_link,
Al Viroc177c2a2010-01-14 00:59:16 -05001848 .put_link = gfs2_put_link,
Al Viroe6305c42008-07-15 21:03:57 -04001849 .permission = gfs2_permission,
David Teiglandb3b94fa2006-01-16 16:50:04 +00001850 .setattr = gfs2_setattr,
1851 .getattr = gfs2_getattr,
1852 .setxattr = gfs2_setxattr,
1853 .getxattr = gfs2_getxattr,
1854 .listxattr = gfs2_listxattr,
1855 .removexattr = gfs2_removexattr,
Steven Whitehousee9079cc2008-10-14 14:43:29 +01001856 .fiemap = gfs2_fiemap,
Christoph Hellwig4e34e712011-07-23 17:37:31 +02001857 .get_acl = gfs2_get_acl,
David Teiglandb3b94fa2006-01-16 16:50:04 +00001858};
1859