GFS2: Get rid of I_MUTEX_QUOTA usage
[deliverable/linux.git] / fs / gfs2 / inode.c
CommitLineData
b3b94faa
DT
1/*
2 * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
f2741d98 3 * Copyright (C) 2004-2011 Red Hat, Inc. All rights reserved.
b3b94faa
DT
4 *
5 * This copyrighted material is made available to anyone wishing to use,
6 * modify, copy, or redistribute it subject to the terms and conditions
e9fc2aa0 7 * of the GNU General Public License version 2.
b3b94faa
DT
8 */
9
b3b94faa
DT
10#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>
b3b94faa
DT
15#include <linux/mm.h>
16#include <linux/xattr.h>
17#include <linux/posix_acl.h>
5c676f6d 18#include <linux/gfs2_ondisk.h>
71b86f56 19#include <linux/crc32.h>
e9079cce 20#include <linux/fiemap.h>
194c011f 21#include <linux/security.h>
b3b94faa
DT
22#include <asm/uaccess.h>
23
24#include "gfs2.h"
5c676f6d 25#include "incore.h"
b3b94faa
DT
26#include "acl.h"
27#include "bmap.h"
28#include "dir.h"
307cf6e6 29#include "xattr.h"
b3b94faa
DT
30#include "glock.h"
31#include "inode.h"
32#include "meta_io.h"
b3b94faa
DT
33#include "quota.h"
34#include "rgrp.h"
35#include "trans.h"
5c676f6d 36#include "util.h"
b2760583 37#include "super.h"
194c011f
SW
38#include "glops.h"
39
40struct 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) {
10556cb2 310 error = gfs2_permission(dir, MAY_EXEC);
194c011f
SW
311 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,
175a4eb7 336 umode_t mode)
194c011f
SW
337{
338 int error;
339
10556cb2 340 error = gfs2_permission(&dip->i_inode, MAY_WRITE | MAY_EXEC);
194c011f
SW
341 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
175a4eb7 367static void munge_mode_uid_gid(struct gfs2_inode *dip, umode_t *mode,
194c011f
SW
368 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;
6a8099ed 392 int dblocks = 1;
194c011f 393
564e12b1 394 error = gfs2_inplace_reserve(dip, RES_DINODE);
194c011f
SW
395 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
6e87ed0f 402 error = gfs2_alloc_blocks(dip, no_addr, &dblocks, 1, generation);
194c011f
SW
403
404 gfs2_trans_end(sdp);
405
406out_ipreserv:
407 gfs2_inplace_release(dip);
408out:
194c011f
SW
409 return error;
410}
411
f2741d98
SW
412static void gfs2_init_dir(struct buffer_head *dibh,
413 const struct gfs2_inode *parent)
e2d0a13b
SW
414{
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
194c011f
SW
429/**
430 * init_dinode - Fill in a new dinode structure
f2741d98 431 * @dip: The directory this inode is being created in
194c011f 432 * @gl: The glock covering the new inode
f2741d98
SW
433 * @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)
194c011f
SW
442 *
443 */
444
445static void init_dinode(struct gfs2_inode *dip, struct gfs2_glock *gl,
175a4eb7 446 const struct gfs2_inum_host *inum, umode_t mode,
194c011f 447 unsigned int uid, unsigned int gid,
160b4026
SW
448 const u64 *generation, dev_t dev, const char *symname,
449 unsigned size, struct buffer_head **bhp)
194c011f
SW
450{
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;
160b4026 468 di->di_size = cpu_to_be64(size);
194c011f
SW
469 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;
194c011f
SW
476 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));
160b4026
SW
489
490 switch(mode & S_IFMT) {
491 case S_IFREG:
e2d0a13b
SW
492 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);
160b4026
SW
495 break;
496 case S_IFDIR:
e2d0a13b
SW
497 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);
160b4026
SW
503 break;
504 case S_IFLNK:
505 memcpy(dibh->b_data + sizeof(struct gfs2_dinode), symname, size);
506 break;
e2d0a13b
SW
507 }
508
194c011f
SW
509 set_buffer_uptodate(dibh);
510
511 *bhp = dibh;
512}
513
514static int make_dinode(struct gfs2_inode *dip, struct gfs2_glock *gl,
175a4eb7 515 umode_t mode, const struct gfs2_inum_host *inum,
160b4026
SW
516 const u64 *generation, dev_t dev, const char *symname,
517 unsigned int size, struct buffer_head **bhp)
194c011f
SW
518{
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);
8e2e0047
BP
524 error = gfs2_rindex_update(sdp);
525 if (error)
526 return error;
194c011f
SW
527
528 error = gfs2_quota_lock(dip, uid, gid);
529 if (error)
5407e242 530 return error;
194c011f
SW
531
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
160b4026 540 init_dinode(dip, gl, inum, mode, uid, gid, generation, dev, symname, size, bhp);
194c011f
SW
541 gfs2_quota_change(dip, +1, uid, gid);
542 gfs2_trans_end(sdp);
543
544out_quota:
545 gfs2_quota_unlock(dip);
194c011f
SW
546 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);
194c011f
SW
553 int alloc_required;
554 struct buffer_head *dibh;
555 int error;
556
8e2e0047
BP
557 error = gfs2_rindex_update(sdp);
558 if (error)
559 return error;
194c011f
SW
560
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
564e12b1 573 error = gfs2_inplace_reserve(dip, sdp->sd_max_dirres);
194c011f
SW
574 if (error)
575 goto fail_quota_locks;
576
577 error = gfs2_trans_begin(sdp, sdp->sd_max_dirres +
54335b1f 578 dip->i_rgd->rd_length +
194c011f
SW
579 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;
66ad863b 596 set_nlink(&ip->i_inode, S_ISDIR(ip->i_inode.i_mode) ? 2 : 1);
194c011f
SW
597 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:
8e2e0047
BP
606 if (alloc_required)
607 gfs2_inplace_release(dip);
194c011f
SW
608
609fail_quota_locks:
610 gfs2_quota_unlock(dip);
611
612fail:
194c011f
SW
613 return error;
614}
615
46cc1e5f 616static int gfs2_initxattrs(struct inode *inode, const struct xattr *xattr_array,
9d8f13ba 617 void *fs_info)
194c011f 618{
9d8f13ba
MZ
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;
194c011f 628 }
194c011f
SW
629 return err;
630}
b3b94faa 631
9d8f13ba
MZ
632static int gfs2_security_init(struct gfs2_inode *dip, struct gfs2_inode *ip,
633 const struct qstr *qstr)
634{
635 return security_inode_init_security(&ip->i_inode, &dip->i_inode, qstr,
636 &gfs2_initxattrs, NULL);
637}
638
194c011f 639/**
f2741d98
SW
640 * 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)
194c011f 647 *
f2741d98 648 * Returns: 0 on success, or error code
194c011f
SW
649 */
650
f2741d98 651static int gfs2_create_inode(struct inode *dir, struct dentry *dentry,
175a4eb7 652 umode_t mode, dev_t dev, const char *symname,
9a63edd1 653 unsigned int size, int excl)
194c011f 654{
f2741d98
SW
655 const struct qstr *name = &dentry->d_name;
656 struct gfs2_holder ghs[2];
194c011f 657 struct inode *inode = NULL;
8e2e0047 658 struct gfs2_inode *dip = GFS2_I(dir), *ip;
194c011f
SW
659 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)
f2741d98 666 return -ENAMETOOLONG;
194c011f 667
8e2e0047
BP
668 /* 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. */
0a305e49
BP
673 error = gfs2_rs_alloc(dip);
674 if (error)
675 return error;
676
f2741d98 677 error = gfs2_glock_nq_init(dip->i_gl, LM_ST_EXCLUSIVE, 0, ghs);
194c011f
SW
678 if (error)
679 goto fail;
680
681 error = create_ok(dip, name, mode);
9a63edd1
SW
682 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 }
194c011f
SW
688 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
160b4026 701 error = make_dinode(dip, ghs[1].gh_gl, mode, &inum, &generation, dev, symname, size, &bh);
194c011f
SW
702 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
8e2e0047
BP
710 ip = GFS2_I(inode);
711 error = gfs2_inode_refresh(ip);
194c011f
SW
712 if (error)
713 goto fail_gunlock2;
714
8e2e0047
BP
715 /* 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;
0a305e49 723
194c011f
SW
724 error = gfs2_acl_create(dip, inode);
725 if (error)
726 goto fail_gunlock2;
727
8e2e0047 728 error = gfs2_security_init(dip, ip, name);
194c011f
SW
729 if (error)
730 goto fail_gunlock2;
731
8e2e0047 732 error = link_dinode(dip, name, ip);
194c011f
SW
733 if (error)
734 goto fail_gunlock2;
735
736 if (bh)
737 brelse(bh);
f2741d98
SW
738
739 gfs2_trans_end(sdp);
71f890f7 740 gfs2_inplace_release(dip);
f2741d98 741 gfs2_quota_unlock(dip);
f2741d98 742 mark_inode_dirty(inode);
ab9bbda0 743 gfs2_glock_dq_uninit_m(2, ghs);
f2741d98
SW
744 d_instantiate(dentry, inode);
745 return 0;
194c011f
SW
746
747fail_gunlock2:
748 gfs2_glock_dq_uninit(ghs + 1);
194c011f 749fail_gunlock:
f2741d98 750 gfs2_glock_dq_uninit(ghs);
40ac218f
SW
751 if (inode && !IS_ERR(inode)) {
752 set_bit(GIF_ALLOC_FAILED, &GFS2_I(inode)->i_flags);
753 iput(inode);
754 }
194c011f 755fail:
8e2e0047 756 gfs2_rs_delete(dip);
194c011f
SW
757 if (bh)
758 brelse(bh);
f2741d98 759 return error;
194c011f 760}
f2741d98 761
b3b94faa
DT
762/**
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,
ebfc3b49 772 umode_t mode, bool excl)
b3b94faa 773{
9a63edd1 774 return gfs2_create_inode(dir, dentry, S_IFREG | mode, 0, NULL, 0, excl);
b3b94faa
DT
775}
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,
00cd8dd3 789 unsigned int flags)
b3b94faa 790{
6c673ab3
AV
791 struct inode *inode = gfs2_lookupi(dir, &dentry->d_name, 0);
792 if (inode && !IS_ERR(inode)) {
9656b2c1
SW
793 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);
9656b2c1 802 }
6c673ab3 803 return d_splice_alias(inode, dentry);
b3b94faa
DT
804}
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{
feaa7bba
SW
821 struct gfs2_inode *dip = GFS2_I(dir);
822 struct gfs2_sbd *sdp = GFS2_SB(dir);
b3b94faa 823 struct inode *inode = old_dentry->d_inode;
feaa7bba 824 struct gfs2_inode *ip = GFS2_I(inode);
b3b94faa 825 struct gfs2_holder ghs[2];
2baee03f 826 struct buffer_head *dibh;
b3b94faa
DT
827 int alloc_required;
828 int error;
829
b60623c2 830 if (S_ISDIR(inode->i_mode))
b3b94faa
DT
831 return -EPERM;
832
0a305e49
BP
833 error = gfs2_rs_alloc(dip);
834 if (error)
835 return error;
836
b3b94faa
DT
837 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
72dbf479
BP
840 error = gfs2_glock_nq(ghs); /* parent */
841 if (error)
842 goto out_parent;
843
844 error = gfs2_glock_nq(ghs + 1); /* child */
b3b94faa 845 if (error)
72dbf479 846 goto out_child;
b3b94faa 847
d192a8e5
SW
848 error = -ENOENT;
849 if (inode->i_nlink == 0)
850 goto out_gunlock;
851
10556cb2 852 error = gfs2_permission(dir, MAY_WRITE | MAY_EXEC);
b3b94faa
DT
853 if (error)
854 goto out_gunlock;
855
dbb7cae2 856 error = gfs2_dir_check(dir, &dentry->d_name, NULL);
b3b94faa
DT
857 switch (error) {
858 case -ENOENT:
859 break;
860 case 0:
861 error = -EEXIST;
862 default:
863 goto out_gunlock;
864 }
865
866 error = -EINVAL;
4f56110a 867 if (!dip->i_inode.i_nlink)
b3b94faa
DT
868 goto out_gunlock;
869 error = -EFBIG;
ad6203f2 870 if (dip->i_entries == (u32)-1)
b3b94faa
DT
871 goto out_gunlock;
872 error = -EPERM;
873 if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
874 goto out_gunlock;
875 error = -EINVAL;
4f56110a 876 if (!ip->i_inode.i_nlink)
b3b94faa
DT
877 goto out_gunlock;
878 error = -EMLINK;
4f56110a 879 if (ip->i_inode.i_nlink == (u32)-1)
b3b94faa
DT
880 goto out_gunlock;
881
c752666c
SW
882 alloc_required = error = gfs2_diradd_alloc_required(dir, &dentry->d_name);
883 if (error < 0)
b3b94faa 884 goto out_gunlock;
c752666c 885 error = 0;
b3b94faa
DT
886
887 if (alloc_required) {
d82661d9 888 error = gfs2_quota_lock_check(dip);
b3b94faa 889 if (error)
5407e242 890 goto out_gunlock;
b3b94faa 891
564e12b1 892 error = gfs2_inplace_reserve(dip, sdp->sd_max_dirres);
b3b94faa
DT
893 if (error)
894 goto out_gunlock_q;
895
1b50259b 896 error = gfs2_trans_begin(sdp, sdp->sd_max_dirres +
71f890f7 897 gfs2_rg_blocks(dip, sdp->sd_max_dirres) +
b3b94faa
DT
898 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
2baee03f 908 error = gfs2_meta_inode_buffer(ip, &dibh);
b3b94faa
DT
909 if (error)
910 goto out_end_trans;
911
3d6ecb7d 912 error = gfs2_dir_add(dir, &dentry->d_name, ip);
2baee03f
SW
913 if (error)
914 goto out_brelse;
915
916 gfs2_trans_add_bh(ip->i_gl, dibh, 1);
917 inc_nlink(&ip->i_inode);
918 ip->i_inode.i_ctime = CURRENT_TIME;
ab9bbda0
SW
919 ihold(inode);
920 d_instantiate(dentry, inode);
921 mark_inode_dirty(inode);
b3b94faa 922
2baee03f
SW
923out_brelse:
924 brelse(dibh);
feaa7bba 925out_end_trans:
b3b94faa 926 gfs2_trans_end(sdp);
feaa7bba 927out_ipres:
b3b94faa
DT
928 if (alloc_required)
929 gfs2_inplace_release(dip);
feaa7bba 930out_gunlock_q:
b3b94faa
DT
931 if (alloc_required)
932 gfs2_quota_unlock(dip);
feaa7bba 933out_gunlock:
72dbf479
BP
934 gfs2_glock_dq(ghs + 1);
935out_child:
936 gfs2_glock_dq(ghs);
937out_parent:
b3b94faa
DT
938 gfs2_holder_uninit(ghs);
939 gfs2_holder_uninit(ghs + 1);
b3b94faa
DT
940 return error;
941}
942
87ec2174
SW
943/*
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
10556cb2 970 error = gfs2_permission(&dip->i_inode, MAY_WRITE | MAY_EXEC);
87ec2174
SW
971 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
b3b94faa 981/**
855d23ce
SW
982 * 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);
855d23ce
SW
1012 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
b3b94faa
DT
1022 * @dentry: The file itself
1023 *
855d23ce
SW
1024 * This routine uses the type of the inode as a flag to figure out
1025 * whether this is an unlink or an rmdir.
b3b94faa
DT
1026 *
1027 * Returns: errno
1028 */
1029
1030static int gfs2_unlink(struct inode *dir, struct dentry *dentry)
1031{
feaa7bba
SW
1032 struct gfs2_inode *dip = GFS2_I(dir);
1033 struct gfs2_sbd *sdp = GFS2_SB(dir);
855d23ce
SW
1034 struct inode *inode = dentry->d_inode;
1035 struct gfs2_inode *ip = GFS2_I(inode);
1036 struct buffer_head *bh;
ddee7608
RC
1037 struct gfs2_holder ghs[3];
1038 struct gfs2_rgrpd *rgd;
5e2f7d61
BP
1039 int error;
1040
1041 error = gfs2_rindex_update(sdp);
1042 if (error)
1043 return error;
1044
1045 error = -EROFS;
b3b94faa 1046
b3b94faa 1047 gfs2_holder_init(dip->i_gl, LM_ST_EXCLUSIVE, 0, ghs);
ddee7608 1048 gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, ghs + 1);
b3b94faa 1049
66fc061b 1050 rgd = gfs2_blk2rgrpd(sdp, ip->i_no_addr, 1);
a365fbf3 1051 if (!rgd)
87654896 1052 goto out_inodes;
a365fbf3 1053
ddee7608
RC
1054 gfs2_holder_init(rgd->rd_gl, LM_ST_EXCLUSIVE, 0, ghs + 2);
1055
1056
8497a46e 1057 error = gfs2_glock_nq(ghs); /* parent */
b3b94faa 1058 if (error)
8497a46e
SW
1059 goto out_parent;
1060
1061 error = gfs2_glock_nq(ghs + 1); /* child */
1062 if (error)
1063 goto out_child;
1064
d192a8e5 1065 error = -ENOENT;
855d23ce 1066 if (inode->i_nlink == 0)
d192a8e5
SW
1067 goto out_rgrp;
1068
855d23ce
SW
1069 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
8497a46e
SW
1075 error = gfs2_glock_nq(ghs + 2); /* rgrp */
1076 if (error)
1077 goto out_rgrp;
b3b94faa
DT
1078
1079 error = gfs2_unlink_ok(dip, &dentry->d_name, ip);
1080 if (error)
72dbf479 1081 goto out_gunlock;
b3b94faa 1082
855d23ce 1083 error = gfs2_trans_begin(sdp, 2*RES_DINODE + 3*RES_LEAF + RES_RG_BIT, 0);
b3b94faa 1084 if (error)
cd012075 1085 goto out_gunlock;
b3b94faa 1086
855d23ce
SW
1087 error = gfs2_meta_inode_buffer(ip, &bh);
1088 if (error)
1089 goto out_end_trans;
b3b94faa 1090
855d23ce
SW
1091 error = gfs2_unlink_inode(dip, dentry, bh);
1092 brelse(bh);
b3b94faa 1093
feaa7bba
SW
1094out_end_trans:
1095 gfs2_trans_end(sdp);
72dbf479 1096out_gunlock:
8497a46e
SW
1097 gfs2_glock_dq(ghs + 2);
1098out_rgrp:
8497a46e
SW
1099 gfs2_glock_dq(ghs + 1);
1100out_child:
8497a46e
SW
1101 gfs2_glock_dq(ghs);
1102out_parent:
87654896
SW
1103 gfs2_holder_uninit(ghs + 2);
1104out_inodes:
1105 gfs2_holder_uninit(ghs + 1);
8497a46e 1106 gfs2_holder_uninit(ghs);
b3b94faa
DT
1107 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{
feaa7bba 1122 struct gfs2_sbd *sdp = GFS2_SB(dir);
160b4026 1123 unsigned int size;
b3b94faa 1124
b3b94faa
DT
1125 size = strlen(symname);
1126 if (size > sdp->sd_sb.sb_bsize - sizeof(struct gfs2_dinode) - 1)
1127 return -ENAMETOOLONG;
1128
9a63edd1 1129 return gfs2_create_inode(dir, dentry, S_IFLNK | S_IRWXUGO, 0, symname, size, 0);
b3b94faa
DT
1130}
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
18bb1db3 1141static int gfs2_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
b3b94faa 1142{
9a63edd1 1143 return gfs2_create_inode(dir, dentry, S_IFDIR | mode, 0, NULL, 0, 0);
b3b94faa
DT
1144}
1145
b3b94faa
DT
1146/**
1147 * 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
f2741d98 1151 * @dev: The device specification of the special file
b3b94faa
DT
1152 *
1153 */
1154
1a67aafb 1155static int gfs2_mknod(struct inode *dir, struct dentry *dentry, umode_t mode,
b3b94faa
DT
1156 dev_t dev)
1157{
9a63edd1 1158 return gfs2_create_inode(dir, dentry, mode, dev, NULL, 0, 0);
b3b94faa
DT
1159}
1160
0188d6c5
SW
1161/*
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;
0188d6c5
SW
1177 int error = 0;
1178
0188d6c5
SW
1179 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
8d123585 1191 tmp = gfs2_lookupi(dir, &gfs2_qdotdot, 1);
0188d6c5
SW
1192 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
b3b94faa
DT
1206/**
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{
feaa7bba
SW
1219 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);
b3b94faa 1222 struct gfs2_inode *nip = NULL;
feaa7bba 1223 struct gfs2_sbd *sdp = GFS2_SB(odir);
8339ee54 1224 struct gfs2_holder ghs[5], r_gh = { .gh_gl = NULL, };
ddee7608 1225 struct gfs2_rgrpd *nrgd;
b3b94faa
DT
1226 unsigned int num_gh;
1227 int dir_rename = 0;
24b977b5 1228 int alloc_required = 0;
b3b94faa
DT
1229 unsigned int x;
1230 int error;
1231
b3b94faa 1232 if (ndentry->d_inode) {
feaa7bba 1233 nip = GFS2_I(ndentry->d_inode);
b3b94faa
DT
1234 if (ip == nip)
1235 return 0;
1236 }
1237
5e2f7d61
BP
1238 error = gfs2_rindex_update(sdp);
1239 if (error)
1240 return error;
1241
0a305e49
BP
1242 error = gfs2_rs_alloc(ndip);
1243 if (error)
1244 return error;
1245
0188d6c5
SW
1246 if (odip != ndip) {
1247 error = gfs2_glock_nq_init(sdp->sd_rename_gl, LM_ST_EXCLUSIVE,
1248 0, &r_gh);
b3b94faa
DT
1249 if (error)
1250 goto out;
1251
0188d6c5
SW
1252 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 }
b3b94faa
DT
1259 }
1260
d9d1ca30 1261 num_gh = 1;
b3b94faa 1262 gfs2_holder_init(odip->i_gl, LM_ST_EXCLUSIVE, 0, ghs);
d9d1ca30
SW
1263 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++;
b3b94faa 1269
d9d1ca30
SW
1270 if (nip) {
1271 gfs2_holder_init(nip->i_gl, LM_ST_EXCLUSIVE, 0, ghs + num_gh);
1272 num_gh++;
ddee7608
RC
1273 /* 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 */
66fc061b 1277 nrgd = gfs2_blk2rgrpd(sdp, nip->i_no_addr, 1);
ddee7608
RC
1278 if (nrgd)
1279 gfs2_holder_init(nrgd->rd_gl, LM_ST_EXCLUSIVE, 0, ghs + num_gh++);
d9d1ca30 1280 }
b3b94faa 1281
72dbf479
BP
1282 for (x = 0; x < num_gh; x++) {
1283 error = gfs2_glock_nq(ghs + x);
1284 if (error)
1285 goto out_gunlock;
1286 }
b3b94faa 1287
d192a8e5
SW
1288 error = -ENOENT;
1289 if (ip->i_inode.i_nlink == 0)
1290 goto out_gunlock;
1291
b3b94faa
DT
1292 /* 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
d192a8e5
SW
1305 if (nip->i_inode.i_nlink == 0) {
1306 error = -EAGAIN;
1307 goto out_gunlock;
1308 }
1309
b60623c2 1310 if (S_ISDIR(nip->i_inode.i_mode)) {
ad6203f2 1311 if (nip->i_entries < 2) {
94fb763b 1312 gfs2_consist_inode(nip);
b3b94faa
DT
1313 error = -EIO;
1314 goto out_gunlock;
1315 }
ad6203f2 1316 if (nip->i_entries > 2) {
b3b94faa
DT
1317 error = -ENOTEMPTY;
1318 goto out_gunlock;
1319 }
1320 }
1321 } else {
10556cb2 1322 error = gfs2_permission(ndir, MAY_WRITE | MAY_EXEC);
b3b94faa
DT
1323 if (error)
1324 goto out_gunlock;
1325
dbb7cae2 1326 error = gfs2_dir_check(ndir, &ndentry->d_name, NULL);
b3b94faa
DT
1327 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) {
4f56110a 1338 if (!ndip->i_inode.i_nlink) {
d192a8e5 1339 error = -ENOENT;
b3b94faa
DT
1340 goto out_gunlock;
1341 }
ad6203f2 1342 if (ndip->i_entries == (u32)-1) {
b3b94faa
DT
1343 error = -EFBIG;
1344 goto out_gunlock;
1345 }
b60623c2 1346 if (S_ISDIR(ip->i_inode.i_mode) &&
4f56110a 1347 ndip->i_inode.i_nlink == (u32)-1) {
b3b94faa
DT
1348 error = -EMLINK;
1349 goto out_gunlock;
1350 }
1351 }
1352 }
1353
1354 /* Check out the dir to be renamed */
1355
1356 if (dir_rename) {
10556cb2 1357 error = gfs2_permission(odentry->d_inode, MAY_WRITE);
b3b94faa
DT
1358 if (error)
1359 goto out_gunlock;
1360 }
1361
24b977b5
SW
1362 if (nip == NULL)
1363 alloc_required = gfs2_diradd_alloc_required(ndir, &ndentry->d_name);
1364 error = alloc_required;
c752666c 1365 if (error < 0)
b3b94faa
DT
1366 goto out_gunlock;
1367
1368 if (alloc_required) {
d82661d9 1369 error = gfs2_quota_lock_check(ndip);
b3b94faa 1370 if (error)
5407e242 1371 goto out_gunlock;
b3b94faa 1372
564e12b1 1373 error = gfs2_inplace_reserve(ndip, sdp->sd_max_dirres);
b3b94faa
DT
1374 if (error)
1375 goto out_gunlock_q;
1376
fe1bdedc 1377 error = gfs2_trans_begin(sdp, sdp->sd_max_dirres +
71f890f7 1378 gfs2_rg_blocks(ndip, sdp->sd_max_dirres) +
b3b94faa 1379 4 * RES_DINODE + 4 * RES_LEAF +
87d21e07 1380 RES_STATFS + RES_QUOTA + 4, 0);
b3b94faa
DT
1381 if (error)
1382 goto out_ipreserv;
1383 } else {
1384 error = gfs2_trans_begin(sdp, 4 * RES_DINODE +
87d21e07 1385 5 * RES_LEAF + 4, 0);
b3b94faa
DT
1386 if (error)
1387 goto out_gunlock;
1388 }
1389
1390 /* Remove the target file, if it exists */
1391
1392 if (nip) {
855d23ce
SW
1393 struct buffer_head *bh;
1394 error = gfs2_meta_inode_buffer(nip, &bh);
b3b94faa
DT
1395 if (error)
1396 goto out_end_trans;
855d23ce
SW
1397 error = gfs2_unlink_inode(ndip, ndentry, bh);
1398 brelse(bh);
b3b94faa
DT
1399 }
1400
1401 if (dir_rename) {
8d123585 1402 error = gfs2_dir_mvino(ip, &gfs2_qdotdot, ndip, DT_DIR);
b3b94faa
DT
1403 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;
4bd91ba1 1410 ip->i_inode.i_ctime = CURRENT_TIME;
d4e9c4c3 1411 gfs2_trans_add_bh(ip->i_gl, dibh, 1);
539e5d6b 1412 gfs2_dinode_out(ip, dibh->b_data);
b3b94faa
DT
1413 brelse(dibh);
1414 }
1415
855d23ce 1416 error = gfs2_dir_del(odip, odentry);
b3b94faa
DT
1417 if (error)
1418 goto out_end_trans;
1419
3d6ecb7d 1420 error = gfs2_dir_add(ndir, &ndentry->d_name, ip);
b3b94faa
DT
1421 if (error)
1422 goto out_end_trans;
1423
feaa7bba 1424out_end_trans:
b3b94faa 1425 gfs2_trans_end(sdp);
feaa7bba 1426out_ipreserv:
b3b94faa
DT
1427 if (alloc_required)
1428 gfs2_inplace_release(ndip);
feaa7bba 1429out_gunlock_q:
b3b94faa
DT
1430 if (alloc_required)
1431 gfs2_quota_unlock(ndip);
feaa7bba 1432out_gunlock:
72dbf479
BP
1433 while (x--) {
1434 gfs2_glock_dq(ghs + x);
b3b94faa 1435 gfs2_holder_uninit(ghs + x);
72dbf479 1436 }
feaa7bba 1437out_gunlock_r:
0188d6c5 1438 if (r_gh.gh_gl)
b3b94faa 1439 gfs2_glock_dq_uninit(&r_gh);
feaa7bba 1440out:
b3b94faa
DT
1441 return error;
1442}
1443
536baf02 1444/**
c177c2ac
AV
1445 * gfs2_follow_link - Follow a symbolic link
1446 * @dentry: The dentry of the link
1447 * @nd: Data that we pass to vfs_follow_link()
536baf02 1448 *
c177c2ac 1449 * This can handle symlinks of any size.
536baf02 1450 *
c177c2ac 1451 * Returns: 0 on success or error code
536baf02
SW
1452 */
1453
c177c2ac 1454static void *gfs2_follow_link(struct dentry *dentry, struct nameidata *nd)
536baf02 1455{
c177c2ac 1456 struct gfs2_inode *ip = GFS2_I(dentry->d_inode);
536baf02
SW
1457 struct gfs2_holder i_gh;
1458 struct buffer_head *dibh;
160b4026 1459 unsigned int size;
c177c2ac 1460 char *buf;
536baf02
SW
1461 int error;
1462
1463 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);
c177c2ac
AV
1467 nd_set_link(nd, ERR_PTR(error));
1468 return NULL;
536baf02
SW
1469 }
1470
a2e0f799
SW
1471 size = (unsigned int)i_size_read(&ip->i_inode);
1472 if (size == 0) {
536baf02 1473 gfs2_consist_inode(ip);
c177c2ac 1474 buf = ERR_PTR(-EIO);
536baf02
SW
1475 goto out;
1476 }
1477
1478 error = gfs2_meta_inode_buffer(ip, &dibh);
c177c2ac
AV
1479 if (error) {
1480 buf = ERR_PTR(error);
536baf02 1481 goto out;
536baf02
SW
1482 }
1483
160b4026 1484 buf = kzalloc(size + 1, GFP_NOFS);
c177c2ac
AV
1485 if (!buf)
1486 buf = ERR_PTR(-ENOMEM);
1487 else
160b4026 1488 memcpy(buf, dibh->b_data + sizeof(struct gfs2_dinode), size);
536baf02
SW
1489 brelse(dibh);
1490out:
1491 gfs2_glock_dq_uninit(&i_gh);
c177c2ac
AV
1492 nd_set_link(nd, buf);
1493 return NULL;
b3b94faa
DT
1494}
1495
c177c2ac 1496static void gfs2_put_link(struct dentry *dentry, struct nameidata *nd, void *p)
b3b94faa 1497{
c177c2ac
AV
1498 char *s = nd_get_link(nd);
1499 if (!IS_ERR(s))
1500 kfree(s);
b3b94faa
DT
1501}
1502
1503/**
1504 * gfs2_permission -
75d5cfbe
SW
1505 * @inode: The inode
1506 * @mask: The mask to be tested
1507 * @flags: Indicates whether this is an RCU path walk or not
b3b94faa 1508 *
300c7d75
SW
1509 * 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 *
b3b94faa
DT
1513 * Returns: errno
1514 */
1515
10556cb2 1516int gfs2_permission(struct inode *inode, int mask)
b3b94faa 1517{
b74c79e9 1518 struct gfs2_inode *ip;
b3b94faa
DT
1519 struct gfs2_holder i_gh;
1520 int error;
300c7d75 1521 int unlock = 0;
b3b94faa 1522
b74c79e9
NP
1523
1524 ip = GFS2_I(inode);
7afd88d9 1525 if (gfs2_glock_is_locked_by_me(ip->i_gl) == NULL) {
10556cb2 1526 if (mask & MAY_NOT_BLOCK)
75d5cfbe 1527 return -ECHILD;
300c7d75
SW
1528 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;
1532 }
b3b94faa 1533
f58ba889
MS
1534 if ((mask & MAY_WRITE) && IS_IMMUTABLE(inode))
1535 error = -EACCES;
1536 else
2830ba7f 1537 error = generic_permission(inode, mask);
300c7d75 1538 if (unlock)
b3b94faa 1539 gfs2_glock_dq_uninit(&i_gh);
b3b94faa
DT
1540
1541 return error;
1542}
1543
ab9bbda0 1544static int __gfs2_setattr_simple(struct inode *inode, struct iattr *attr)
194c011f 1545{
194c011f
SW
1546 setattr_copy(inode, attr);
1547 mark_inode_dirty(inode);
194c011f
SW
1548 return 0;
1549}
1550
1551/**
1552 * gfs2_setattr_simple -
1553 * @ip:
1554 * @attr:
1555 *
1556 * Returns: errno
1557 */
1558
ab9bbda0 1559int gfs2_setattr_simple(struct inode *inode, struct iattr *attr)
194c011f
SW
1560{
1561 int error;
1562
1563 if (current->journal_info)
ab9bbda0 1564 return __gfs2_setattr_simple(inode, attr);
194c011f 1565
ab9bbda0 1566 error = gfs2_trans_begin(GFS2_SB(inode), RES_DINODE, 0);
194c011f
SW
1567 if (error)
1568 return error;
1569
ab9bbda0
SW
1570 error = __gfs2_setattr_simple(inode, attr);
1571 gfs2_trans_end(GFS2_SB(inode));
194c011f
SW
1572 return error;
1573}
1574
b3b94faa
DT
1575static int setattr_chown(struct inode *inode, struct iattr *attr)
1576{
feaa7bba
SW
1577 struct gfs2_inode *ip = GFS2_I(inode);
1578 struct gfs2_sbd *sdp = GFS2_SB(inode);
cd915493 1579 u32 ouid, ogid, nuid, ngid;
b3b94faa
DT
1580 int error;
1581
2933f925
SW
1582 ouid = inode->i_uid;
1583 ogid = inode->i_gid;
b3b94faa
DT
1584 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
b3b94faa
DT
1592 error = gfs2_quota_lock(ip, nuid, ngid);
1593 if (error)
5407e242 1594 return error;
b3b94faa
DT
1595
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
ab9bbda0 1606 error = gfs2_setattr_simple(inode, attr);
b3b94faa
DT
1607 if (error)
1608 goto out_end_trans;
1609
b3b94faa 1610 if (ouid != NO_QUOTA_CHANGE || ogid != NO_QUOTA_CHANGE) {
77658aad
SW
1611 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);
b3b94faa
DT
1614 }
1615
a91ea69f 1616out_end_trans:
b3b94faa 1617 gfs2_trans_end(sdp);
a91ea69f 1618out_gunlock_q:
b3b94faa 1619 gfs2_quota_unlock(ip);
b3b94faa
DT
1620 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;
feaa7bba 1637 struct gfs2_inode *ip = GFS2_I(inode);
b3b94faa
DT
1638 struct gfs2_holder i_gh;
1639 int error;
1640
0a305e49
BP
1641 error = gfs2_rs_alloc(ip);
1642 if (error)
1643 return error;
1644
b3b94faa
DT
1645 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)
ff8f33c8 1658 error = gfs2_setattr_size(inode, attr->ia_size);
b3b94faa
DT
1659 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
ab9bbda0 1664 error = gfs2_setattr_simple(inode, attr);
b3b94faa 1665
a91ea69f 1666out:
b3b94faa
DT
1667 if (!error)
1668 mark_inode_dirty(inode);
ab9bbda0 1669 gfs2_glock_dq_uninit(&i_gh);
b3b94faa
DT
1670 return error;
1671}
1672
1673/**
1674 * gfs2_getattr - Read out an inode's attributes
26c1a574 1675 * @mnt: The vfsmount the inode is being accessed from
b3b94faa
DT
1676 * @dentry: The dentry to stat
1677 * @stat: The inode's stats
1678 *
dcf3dd85
SW
1679 * 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 *
b3b94faa
DT
1685 * 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;
feaa7bba 1692 struct gfs2_inode *ip = GFS2_I(inode);
b3b94faa
DT
1693 struct gfs2_holder gh;
1694 int error;
dcf3dd85 1695 int unlock = 0;
b3b94faa 1696
7afd88d9 1697 if (gfs2_glock_is_locked_by_me(ip->i_gl) == NULL) {
dcf3dd85
SW
1698 error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &gh);
1699 if (error)
1700 return error;
1701 unlock = 1;
b3b94faa
DT
1702 }
1703
dcf3dd85 1704 generic_fillattr(inode, stat);
d7c103d0 1705 if (unlock)
dcf3dd85
SW
1706 gfs2_glock_dq_uninit(&gh);
1707
1708 return 0;
b3b94faa
DT
1709}
1710
1711static int gfs2_setxattr(struct dentry *dentry, const char *name,
1712 const void *data, size_t size, int flags)
1713{
feaa7bba 1714 struct inode *inode = dentry->d_inode;
40b78a32
SW
1715 struct gfs2_inode *ip = GFS2_I(inode);
1716 struct gfs2_holder gh;
1717 int ret;
b3b94faa 1718
40b78a32
SW
1719 gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh);
1720 ret = gfs2_glock_nq(&gh);
1721 if (ret == 0) {
645b2ccc
SW
1722 ret = gfs2_rs_alloc(ip);
1723 if (ret == 0)
1724 ret = generic_setxattr(dentry, name, data, size, flags);
40b78a32
SW
1725 gfs2_glock_dq(&gh);
1726 }
1727 gfs2_holder_uninit(&gh);
1728 return ret;
b3b94faa
DT
1729}
1730
1731static ssize_t gfs2_getxattr(struct dentry *dentry, const char *name,
1732 void *data, size_t size)
1733{
40b78a32
SW
1734 struct inode *inode = dentry->d_inode;
1735 struct gfs2_inode *ip = GFS2_I(inode);
1736 struct gfs2_holder gh;
1737 int ret;
b3b94faa 1738
40b78a32
SW
1739 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;
b3b94faa
DT
1747}
1748
1749static int gfs2_removexattr(struct dentry *dentry, const char *name)
1750{
40b78a32
SW
1751 struct inode *inode = dentry->d_inode;
1752 struct gfs2_inode *ip = GFS2_I(inode);
1753 struct gfs2_holder gh;
1754 int ret;
b3b94faa 1755
40b78a32
SW
1756 gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh);
1757 ret = gfs2_glock_nq(&gh);
1758 if (ret == 0) {
645b2ccc
SW
1759 ret = gfs2_rs_alloc(ip);
1760 if (ret == 0)
1761 ret = generic_removexattr(dentry, name);
40b78a32
SW
1762 gfs2_glock_dq(&gh);
1763 }
1764 gfs2_holder_uninit(&gh);
1765 return ret;
b3b94faa
DT
1766}
1767
e9079cce
SW
1768static 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
92e1d5be 1810const struct inode_operations gfs2_file_iops = {
e6305c43 1811 .permission = gfs2_permission,
b3b94faa
DT
1812 .setattr = gfs2_setattr,
1813 .getattr = gfs2_getattr,
1814 .setxattr = gfs2_setxattr,
1815 .getxattr = gfs2_getxattr,
1816 .listxattr = gfs2_listxattr,
1817 .removexattr = gfs2_removexattr,
e9079cce 1818 .fiemap = gfs2_fiemap,
4e34e719 1819 .get_acl = gfs2_get_acl,
b3b94faa
DT
1820};
1821
92e1d5be 1822const struct inode_operations gfs2_dir_iops = {
b3b94faa
DT
1823 .create = gfs2_create,
1824 .lookup = gfs2_lookup,
1825 .link = gfs2_link,
1826 .unlink = gfs2_unlink,
1827 .symlink = gfs2_symlink,
1828 .mkdir = gfs2_mkdir,
855d23ce 1829 .rmdir = gfs2_unlink,
b3b94faa
DT
1830 .mknod = gfs2_mknod,
1831 .rename = gfs2_rename,
e6305c43 1832 .permission = gfs2_permission,
b3b94faa
DT
1833 .setattr = gfs2_setattr,
1834 .getattr = gfs2_getattr,
1835 .setxattr = gfs2_setxattr,
1836 .getxattr = gfs2_getxattr,
1837 .listxattr = gfs2_listxattr,
1838 .removexattr = gfs2_removexattr,
e9079cce 1839 .fiemap = gfs2_fiemap,
4e34e719 1840 .get_acl = gfs2_get_acl,
b3b94faa
DT
1841};
1842
92e1d5be 1843const struct inode_operations gfs2_symlink_iops = {
c177c2ac 1844 .readlink = generic_readlink,
b3b94faa 1845 .follow_link = gfs2_follow_link,
c177c2ac 1846 .put_link = gfs2_put_link,
e6305c43 1847 .permission = gfs2_permission,
b3b94faa
DT
1848 .setattr = gfs2_setattr,
1849 .getattr = gfs2_getattr,
1850 .setxattr = gfs2_setxattr,
1851 .getxattr = gfs2_getxattr,
1852 .listxattr = gfs2_listxattr,
1853 .removexattr = gfs2_removexattr,
e9079cce 1854 .fiemap = gfs2_fiemap,
4e34e719 1855 .get_acl = gfs2_get_acl,
b3b94faa
DT
1856};
1857
This page took 0.664076 seconds and 5 git commands to generate.