]> bbs.cooldavid.org Git - net-next-2.6.git/blob - fs/xfs/linux-2.6/xfs_iops.c
xfs: drop dmapi hooks
[net-next-2.6.git] / fs / xfs / linux-2.6 / xfs_iops.c
1 /*
2  * Copyright (c) 2000-2005 Silicon Graphics, Inc.
3  * All Rights Reserved.
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it would be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write the Free Software Foundation,
16  * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17  */
18 #include "xfs.h"
19 #include "xfs_fs.h"
20 #include "xfs_acl.h"
21 #include "xfs_bit.h"
22 #include "xfs_log.h"
23 #include "xfs_inum.h"
24 #include "xfs_trans.h"
25 #include "xfs_sb.h"
26 #include "xfs_ag.h"
27 #include "xfs_dir2.h"
28 #include "xfs_alloc.h"
29 #include "xfs_quota.h"
30 #include "xfs_mount.h"
31 #include "xfs_bmap_btree.h"
32 #include "xfs_alloc_btree.h"
33 #include "xfs_ialloc_btree.h"
34 #include "xfs_dir2_sf.h"
35 #include "xfs_attr_sf.h"
36 #include "xfs_dinode.h"
37 #include "xfs_inode.h"
38 #include "xfs_bmap.h"
39 #include "xfs_btree.h"
40 #include "xfs_ialloc.h"
41 #include "xfs_rtalloc.h"
42 #include "xfs_error.h"
43 #include "xfs_itable.h"
44 #include "xfs_rw.h"
45 #include "xfs_attr.h"
46 #include "xfs_buf_item.h"
47 #include "xfs_utils.h"
48 #include "xfs_vnodeops.h"
49 #include "xfs_trace.h"
50
51 #include <linux/capability.h>
52 #include <linux/xattr.h>
53 #include <linux/namei.h>
54 #include <linux/posix_acl.h>
55 #include <linux/security.h>
56 #include <linux/falloc.h>
57 #include <linux/fiemap.h>
58 #include <linux/slab.h>
59
60 /*
61  * Bring the timestamps in the XFS inode uptodate.
62  *
63  * Used before writing the inode to disk.
64  */
65 void
66 xfs_synchronize_times(
67         xfs_inode_t     *ip)
68 {
69         struct inode    *inode = VFS_I(ip);
70
71         ip->i_d.di_atime.t_sec = (__int32_t)inode->i_atime.tv_sec;
72         ip->i_d.di_atime.t_nsec = (__int32_t)inode->i_atime.tv_nsec;
73         ip->i_d.di_ctime.t_sec = (__int32_t)inode->i_ctime.tv_sec;
74         ip->i_d.di_ctime.t_nsec = (__int32_t)inode->i_ctime.tv_nsec;
75         ip->i_d.di_mtime.t_sec = (__int32_t)inode->i_mtime.tv_sec;
76         ip->i_d.di_mtime.t_nsec = (__int32_t)inode->i_mtime.tv_nsec;
77 }
78
79 /*
80  * If the linux inode is valid, mark it dirty.
81  * Used when commiting a dirty inode into a transaction so that
82  * the inode will get written back by the linux code
83  */
84 void
85 xfs_mark_inode_dirty_sync(
86         xfs_inode_t     *ip)
87 {
88         struct inode    *inode = VFS_I(ip);
89
90         if (!(inode->i_state & (I_WILL_FREE|I_FREEING|I_CLEAR)))
91                 mark_inode_dirty_sync(inode);
92 }
93
94 void
95 xfs_mark_inode_dirty(
96         xfs_inode_t     *ip)
97 {
98         struct inode    *inode = VFS_I(ip);
99
100         if (!(inode->i_state & (I_WILL_FREE|I_FREEING|I_CLEAR)))
101                 mark_inode_dirty(inode);
102 }
103
104 /*
105  * Change the requested timestamp in the given inode.
106  * We don't lock across timestamp updates, and we don't log them but
107  * we do record the fact that there is dirty information in core.
108  */
109 void
110 xfs_ichgtime(
111         xfs_inode_t     *ip,
112         int             flags)
113 {
114         struct inode    *inode = VFS_I(ip);
115         timespec_t      tv;
116         int             sync_it = 0;
117
118         tv = current_fs_time(inode->i_sb);
119
120         if ((flags & XFS_ICHGTIME_MOD) &&
121             !timespec_equal(&inode->i_mtime, &tv)) {
122                 inode->i_mtime = tv;
123                 sync_it = 1;
124         }
125         if ((flags & XFS_ICHGTIME_CHG) &&
126             !timespec_equal(&inode->i_ctime, &tv)) {
127                 inode->i_ctime = tv;
128                 sync_it = 1;
129         }
130
131         /*
132          * Update complete - now make sure everyone knows that the inode
133          * is dirty.
134          */
135         if (sync_it)
136                 xfs_mark_inode_dirty_sync(ip);
137 }
138
139 /*
140  * Hook in SELinux.  This is not quite correct yet, what we really need
141  * here (as we do for default ACLs) is a mechanism by which creation of
142  * these attrs can be journalled at inode creation time (along with the
143  * inode, of course, such that log replay can't cause these to be lost).
144  */
145 STATIC int
146 xfs_init_security(
147         struct inode    *inode,
148         struct inode    *dir)
149 {
150         struct xfs_inode *ip = XFS_I(inode);
151         size_t          length;
152         void            *value;
153         unsigned char   *name;
154         int             error;
155
156         error = security_inode_init_security(inode, dir, (char **)&name,
157                                              &value, &length);
158         if (error) {
159                 if (error == -EOPNOTSUPP)
160                         return 0;
161                 return -error;
162         }
163
164         error = xfs_attr_set(ip, name, value, length, ATTR_SECURE);
165
166         kfree(name);
167         kfree(value);
168         return error;
169 }
170
171 static void
172 xfs_dentry_to_name(
173         struct xfs_name *namep,
174         struct dentry   *dentry)
175 {
176         namep->name = dentry->d_name.name;
177         namep->len = dentry->d_name.len;
178 }
179
180 STATIC void
181 xfs_cleanup_inode(
182         struct inode    *dir,
183         struct inode    *inode,
184         struct dentry   *dentry)
185 {
186         struct xfs_name teardown;
187
188         /* Oh, the horror.
189          * If we can't add the ACL or we fail in
190          * xfs_init_security we must back out.
191          * ENOSPC can hit here, among other things.
192          */
193         xfs_dentry_to_name(&teardown, dentry);
194
195         xfs_remove(XFS_I(dir), &teardown, XFS_I(inode));
196         iput(inode);
197 }
198
199 STATIC int
200 xfs_vn_mknod(
201         struct inode    *dir,
202         struct dentry   *dentry,
203         int             mode,
204         dev_t           rdev)
205 {
206         struct inode    *inode;
207         struct xfs_inode *ip = NULL;
208         struct posix_acl *default_acl = NULL;
209         struct xfs_name name;
210         int             error;
211
212         /*
213          * Irix uses Missed'em'V split, but doesn't want to see
214          * the upper 5 bits of (14bit) major.
215          */
216         if (S_ISCHR(mode) || S_ISBLK(mode)) {
217                 if (unlikely(!sysv_valid_dev(rdev) || MAJOR(rdev) & ~0x1ff))
218                         return -EINVAL;
219                 rdev = sysv_encode_dev(rdev);
220         } else {
221                 rdev = 0;
222         }
223
224         if (IS_POSIXACL(dir)) {
225                 default_acl = xfs_get_acl(dir, ACL_TYPE_DEFAULT);
226                 if (IS_ERR(default_acl))
227                         return -PTR_ERR(default_acl);
228
229                 if (!default_acl)
230                         mode &= ~current_umask();
231         }
232
233         xfs_dentry_to_name(&name, dentry);
234         error = xfs_create(XFS_I(dir), &name, mode, rdev, &ip, NULL);
235         if (unlikely(error))
236                 goto out_free_acl;
237
238         inode = VFS_I(ip);
239
240         error = xfs_init_security(inode, dir);
241         if (unlikely(error))
242                 goto out_cleanup_inode;
243
244         if (default_acl) {
245                 error = -xfs_inherit_acl(inode, default_acl);
246                 if (unlikely(error))
247                         goto out_cleanup_inode;
248                 posix_acl_release(default_acl);
249         }
250
251
252         d_instantiate(dentry, inode);
253         return -error;
254
255  out_cleanup_inode:
256         xfs_cleanup_inode(dir, inode, dentry);
257  out_free_acl:
258         posix_acl_release(default_acl);
259         return -error;
260 }
261
262 STATIC int
263 xfs_vn_create(
264         struct inode    *dir,
265         struct dentry   *dentry,
266         int             mode,
267         struct nameidata *nd)
268 {
269         return xfs_vn_mknod(dir, dentry, mode, 0);
270 }
271
272 STATIC int
273 xfs_vn_mkdir(
274         struct inode    *dir,
275         struct dentry   *dentry,
276         int             mode)
277 {
278         return xfs_vn_mknod(dir, dentry, mode|S_IFDIR, 0);
279 }
280
281 STATIC struct dentry *
282 xfs_vn_lookup(
283         struct inode    *dir,
284         struct dentry   *dentry,
285         struct nameidata *nd)
286 {
287         struct xfs_inode *cip;
288         struct xfs_name name;
289         int             error;
290
291         if (dentry->d_name.len >= MAXNAMELEN)
292                 return ERR_PTR(-ENAMETOOLONG);
293
294         xfs_dentry_to_name(&name, dentry);
295         error = xfs_lookup(XFS_I(dir), &name, &cip, NULL);
296         if (unlikely(error)) {
297                 if (unlikely(error != ENOENT))
298                         return ERR_PTR(-error);
299                 d_add(dentry, NULL);
300                 return NULL;
301         }
302
303         return d_splice_alias(VFS_I(cip), dentry);
304 }
305
306 STATIC struct dentry *
307 xfs_vn_ci_lookup(
308         struct inode    *dir,
309         struct dentry   *dentry,
310         struct nameidata *nd)
311 {
312         struct xfs_inode *ip;
313         struct xfs_name xname;
314         struct xfs_name ci_name;
315         struct qstr     dname;
316         int             error;
317
318         if (dentry->d_name.len >= MAXNAMELEN)
319                 return ERR_PTR(-ENAMETOOLONG);
320
321         xfs_dentry_to_name(&xname, dentry);
322         error = xfs_lookup(XFS_I(dir), &xname, &ip, &ci_name);
323         if (unlikely(error)) {
324                 if (unlikely(error != ENOENT))
325                         return ERR_PTR(-error);
326                 /*
327                  * call d_add(dentry, NULL) here when d_drop_negative_children
328                  * is called in xfs_vn_mknod (ie. allow negative dentries
329                  * with CI filesystems).
330                  */
331                 return NULL;
332         }
333
334         /* if exact match, just splice and exit */
335         if (!ci_name.name)
336                 return d_splice_alias(VFS_I(ip), dentry);
337
338         /* else case-insensitive match... */
339         dname.name = ci_name.name;
340         dname.len = ci_name.len;
341         dentry = d_add_ci(dentry, VFS_I(ip), &dname);
342         kmem_free(ci_name.name);
343         return dentry;
344 }
345
346 STATIC int
347 xfs_vn_link(
348         struct dentry   *old_dentry,
349         struct inode    *dir,
350         struct dentry   *dentry)
351 {
352         struct inode    *inode = old_dentry->d_inode;
353         struct xfs_name name;
354         int             error;
355
356         xfs_dentry_to_name(&name, dentry);
357
358         error = xfs_link(XFS_I(dir), XFS_I(inode), &name);
359         if (unlikely(error))
360                 return -error;
361
362         atomic_inc(&inode->i_count);
363         d_instantiate(dentry, inode);
364         return 0;
365 }
366
367 STATIC int
368 xfs_vn_unlink(
369         struct inode    *dir,
370         struct dentry   *dentry)
371 {
372         struct xfs_name name;
373         int             error;
374
375         xfs_dentry_to_name(&name, dentry);
376
377         error = -xfs_remove(XFS_I(dir), &name, XFS_I(dentry->d_inode));
378         if (error)
379                 return error;
380
381         /*
382          * With unlink, the VFS makes the dentry "negative": no inode,
383          * but still hashed. This is incompatible with case-insensitive
384          * mode, so invalidate (unhash) the dentry in CI-mode.
385          */
386         if (xfs_sb_version_hasasciici(&XFS_M(dir->i_sb)->m_sb))
387                 d_invalidate(dentry);
388         return 0;
389 }
390
391 STATIC int
392 xfs_vn_symlink(
393         struct inode    *dir,
394         struct dentry   *dentry,
395         const char      *symname)
396 {
397         struct inode    *inode;
398         struct xfs_inode *cip = NULL;
399         struct xfs_name name;
400         int             error;
401         mode_t          mode;
402
403         mode = S_IFLNK |
404                 (irix_symlink_mode ? 0777 & ~current_umask() : S_IRWXUGO);
405         xfs_dentry_to_name(&name, dentry);
406
407         error = xfs_symlink(XFS_I(dir), &name, symname, mode, &cip, NULL);
408         if (unlikely(error))
409                 goto out;
410
411         inode = VFS_I(cip);
412
413         error = xfs_init_security(inode, dir);
414         if (unlikely(error))
415                 goto out_cleanup_inode;
416
417         d_instantiate(dentry, inode);
418         return 0;
419
420  out_cleanup_inode:
421         xfs_cleanup_inode(dir, inode, dentry);
422  out:
423         return -error;
424 }
425
426 STATIC int
427 xfs_vn_rename(
428         struct inode    *odir,
429         struct dentry   *odentry,
430         struct inode    *ndir,
431         struct dentry   *ndentry)
432 {
433         struct inode    *new_inode = ndentry->d_inode;
434         struct xfs_name oname;
435         struct xfs_name nname;
436
437         xfs_dentry_to_name(&oname, odentry);
438         xfs_dentry_to_name(&nname, ndentry);
439
440         return -xfs_rename(XFS_I(odir), &oname, XFS_I(odentry->d_inode),
441                            XFS_I(ndir), &nname, new_inode ?
442                                                 XFS_I(new_inode) : NULL);
443 }
444
445 /*
446  * careful here - this function can get called recursively, so
447  * we need to be very careful about how much stack we use.
448  * uio is kmalloced for this reason...
449  */
450 STATIC void *
451 xfs_vn_follow_link(
452         struct dentry           *dentry,
453         struct nameidata        *nd)
454 {
455         char                    *link;
456         int                     error = -ENOMEM;
457
458         link = kmalloc(MAXPATHLEN+1, GFP_KERNEL);
459         if (!link)
460                 goto out_err;
461
462         error = -xfs_readlink(XFS_I(dentry->d_inode), link);
463         if (unlikely(error))
464                 goto out_kfree;
465
466         nd_set_link(nd, link);
467         return NULL;
468
469  out_kfree:
470         kfree(link);
471  out_err:
472         nd_set_link(nd, ERR_PTR(error));
473         return NULL;
474 }
475
476 STATIC void
477 xfs_vn_put_link(
478         struct dentry   *dentry,
479         struct nameidata *nd,
480         void            *p)
481 {
482         char            *s = nd_get_link(nd);
483
484         if (!IS_ERR(s))
485                 kfree(s);
486 }
487
488 STATIC int
489 xfs_vn_getattr(
490         struct vfsmount         *mnt,
491         struct dentry           *dentry,
492         struct kstat            *stat)
493 {
494         struct inode            *inode = dentry->d_inode;
495         struct xfs_inode        *ip = XFS_I(inode);
496         struct xfs_mount        *mp = ip->i_mount;
497
498         xfs_itrace_entry(ip);
499
500         if (XFS_FORCED_SHUTDOWN(mp))
501                 return XFS_ERROR(EIO);
502
503         stat->size = XFS_ISIZE(ip);
504         stat->dev = inode->i_sb->s_dev;
505         stat->mode = ip->i_d.di_mode;
506         stat->nlink = ip->i_d.di_nlink;
507         stat->uid = ip->i_d.di_uid;
508         stat->gid = ip->i_d.di_gid;
509         stat->ino = ip->i_ino;
510         stat->atime = inode->i_atime;
511         stat->mtime = inode->i_mtime;
512         stat->ctime = inode->i_ctime;
513         stat->blocks =
514                 XFS_FSB_TO_BB(mp, ip->i_d.di_nblocks + ip->i_delayed_blks);
515
516
517         switch (inode->i_mode & S_IFMT) {
518         case S_IFBLK:
519         case S_IFCHR:
520                 stat->blksize = BLKDEV_IOSIZE;
521                 stat->rdev = MKDEV(sysv_major(ip->i_df.if_u2.if_rdev) & 0x1ff,
522                                    sysv_minor(ip->i_df.if_u2.if_rdev));
523                 break;
524         default:
525                 if (XFS_IS_REALTIME_INODE(ip)) {
526                         /*
527                          * If the file blocks are being allocated from a
528                          * realtime volume, then return the inode's realtime
529                          * extent size or the realtime volume's extent size.
530                          */
531                         stat->blksize =
532                                 xfs_get_extsz_hint(ip) << mp->m_sb.sb_blocklog;
533                 } else
534                         stat->blksize = xfs_preferred_iosize(mp);
535                 stat->rdev = 0;
536                 break;
537         }
538
539         return 0;
540 }
541
542 STATIC int
543 xfs_vn_setattr(
544         struct dentry   *dentry,
545         struct iattr    *iattr)
546 {
547         return -xfs_setattr(XFS_I(dentry->d_inode), iattr, 0);
548 }
549
550 /*
551  * block_truncate_page can return an error, but we can't propagate it
552  * at all here. Leave a complaint + stack trace in the syslog because
553  * this could be bad. If it is bad, we need to propagate the error further.
554  */
555 STATIC void
556 xfs_vn_truncate(
557         struct inode    *inode)
558 {
559         int     error;
560         error = block_truncate_page(inode->i_mapping, inode->i_size,
561                                                         xfs_get_blocks);
562         WARN_ON(error);
563 }
564
565 STATIC long
566 xfs_vn_fallocate(
567         struct inode    *inode,
568         int             mode,
569         loff_t          offset,
570         loff_t          len)
571 {
572         long            error;
573         loff_t          new_size = 0;
574         xfs_flock64_t   bf;
575         xfs_inode_t     *ip = XFS_I(inode);
576
577         /* preallocation on directories not yet supported */
578         error = -ENODEV;
579         if (S_ISDIR(inode->i_mode))
580                 goto out_error;
581
582         bf.l_whence = 0;
583         bf.l_start = offset;
584         bf.l_len = len;
585
586         xfs_ilock(ip, XFS_IOLOCK_EXCL);
587
588         /* check the new inode size is valid before allocating */
589         if (!(mode & FALLOC_FL_KEEP_SIZE) &&
590             offset + len > i_size_read(inode)) {
591                 new_size = offset + len;
592                 error = inode_newsize_ok(inode, new_size);
593                 if (error)
594                         goto out_unlock;
595         }
596
597         error = -xfs_change_file_space(ip, XFS_IOC_RESVSP, &bf,
598                                        0, XFS_ATTR_NOLOCK);
599         if (error)
600                 goto out_unlock;
601
602         /* Change file size if needed */
603         if (new_size) {
604                 struct iattr iattr;
605
606                 iattr.ia_valid = ATTR_SIZE;
607                 iattr.ia_size = new_size;
608                 error = -xfs_setattr(ip, &iattr, XFS_ATTR_NOLOCK);
609         }
610
611 out_unlock:
612         xfs_iunlock(ip, XFS_IOLOCK_EXCL);
613 out_error:
614         return error;
615 }
616
617 #define XFS_FIEMAP_FLAGS        (FIEMAP_FLAG_SYNC|FIEMAP_FLAG_XATTR)
618
619 /*
620  * Call fiemap helper to fill in user data.
621  * Returns positive errors to xfs_getbmap.
622  */
623 STATIC int
624 xfs_fiemap_format(
625         void                    **arg,
626         struct getbmapx         *bmv,
627         int                     *full)
628 {
629         int                     error;
630         struct fiemap_extent_info *fieinfo = *arg;
631         u32                     fiemap_flags = 0;
632         u64                     logical, physical, length;
633
634         /* Do nothing for a hole */
635         if (bmv->bmv_block == -1LL)
636                 return 0;
637
638         logical = BBTOB(bmv->bmv_offset);
639         physical = BBTOB(bmv->bmv_block);
640         length = BBTOB(bmv->bmv_length);
641
642         if (bmv->bmv_oflags & BMV_OF_PREALLOC)
643                 fiemap_flags |= FIEMAP_EXTENT_UNWRITTEN;
644         else if (bmv->bmv_oflags & BMV_OF_DELALLOC) {
645                 fiemap_flags |= FIEMAP_EXTENT_DELALLOC;
646                 physical = 0;   /* no block yet */
647         }
648         if (bmv->bmv_oflags & BMV_OF_LAST)
649                 fiemap_flags |= FIEMAP_EXTENT_LAST;
650
651         error = fiemap_fill_next_extent(fieinfo, logical, physical,
652                                         length, fiemap_flags);
653         if (error > 0) {
654                 error = 0;
655                 *full = 1;      /* user array now full */
656         }
657
658         return -error;
659 }
660
661 STATIC int
662 xfs_vn_fiemap(
663         struct inode            *inode,
664         struct fiemap_extent_info *fieinfo,
665         u64                     start,
666         u64                     length)
667 {
668         xfs_inode_t             *ip = XFS_I(inode);
669         struct getbmapx         bm;
670         int                     error;
671
672         error = fiemap_check_flags(fieinfo, XFS_FIEMAP_FLAGS);
673         if (error)
674                 return error;
675
676         /* Set up bmap header for xfs internal routine */
677         bm.bmv_offset = BTOBB(start);
678         /* Special case for whole file */
679         if (length == FIEMAP_MAX_OFFSET)
680                 bm.bmv_length = -1LL;
681         else
682                 bm.bmv_length = BTOBB(length);
683
684         /* We add one because in getbmap world count includes the header */
685         bm.bmv_count = !fieinfo->fi_extents_max ? MAXEXTNUM :
686                                         fieinfo->fi_extents_max + 1;
687         bm.bmv_count = min_t(__s32, bm.bmv_count,
688                              (PAGE_SIZE * 16 / sizeof(struct getbmapx)));
689         bm.bmv_iflags = BMV_IF_PREALLOC;
690         if (fieinfo->fi_flags & FIEMAP_FLAG_XATTR)
691                 bm.bmv_iflags |= BMV_IF_ATTRFORK;
692         if (!(fieinfo->fi_flags & FIEMAP_FLAG_SYNC))
693                 bm.bmv_iflags |= BMV_IF_DELALLOC;
694
695         error = xfs_getbmap(ip, &bm, xfs_fiemap_format, fieinfo);
696         if (error)
697                 return -error;
698
699         return 0;
700 }
701
702 static const struct inode_operations xfs_inode_operations = {
703         .check_acl              = xfs_check_acl,
704         .truncate               = xfs_vn_truncate,
705         .getattr                = xfs_vn_getattr,
706         .setattr                = xfs_vn_setattr,
707         .setxattr               = generic_setxattr,
708         .getxattr               = generic_getxattr,
709         .removexattr            = generic_removexattr,
710         .listxattr              = xfs_vn_listxattr,
711         .fallocate              = xfs_vn_fallocate,
712         .fiemap                 = xfs_vn_fiemap,
713 };
714
715 static const struct inode_operations xfs_dir_inode_operations = {
716         .create                 = xfs_vn_create,
717         .lookup                 = xfs_vn_lookup,
718         .link                   = xfs_vn_link,
719         .unlink                 = xfs_vn_unlink,
720         .symlink                = xfs_vn_symlink,
721         .mkdir                  = xfs_vn_mkdir,
722         /*
723          * Yes, XFS uses the same method for rmdir and unlink.
724          *
725          * There are some subtile differences deeper in the code,
726          * but we use S_ISDIR to check for those.
727          */
728         .rmdir                  = xfs_vn_unlink,
729         .mknod                  = xfs_vn_mknod,
730         .rename                 = xfs_vn_rename,
731         .check_acl              = xfs_check_acl,
732         .getattr                = xfs_vn_getattr,
733         .setattr                = xfs_vn_setattr,
734         .setxattr               = generic_setxattr,
735         .getxattr               = generic_getxattr,
736         .removexattr            = generic_removexattr,
737         .listxattr              = xfs_vn_listxattr,
738 };
739
740 static const struct inode_operations xfs_dir_ci_inode_operations = {
741         .create                 = xfs_vn_create,
742         .lookup                 = xfs_vn_ci_lookup,
743         .link                   = xfs_vn_link,
744         .unlink                 = xfs_vn_unlink,
745         .symlink                = xfs_vn_symlink,
746         .mkdir                  = xfs_vn_mkdir,
747         /*
748          * Yes, XFS uses the same method for rmdir and unlink.
749          *
750          * There are some subtile differences deeper in the code,
751          * but we use S_ISDIR to check for those.
752          */
753         .rmdir                  = xfs_vn_unlink,
754         .mknod                  = xfs_vn_mknod,
755         .rename                 = xfs_vn_rename,
756         .check_acl              = xfs_check_acl,
757         .getattr                = xfs_vn_getattr,
758         .setattr                = xfs_vn_setattr,
759         .setxattr               = generic_setxattr,
760         .getxattr               = generic_getxattr,
761         .removexattr            = generic_removexattr,
762         .listxattr              = xfs_vn_listxattr,
763 };
764
765 static const struct inode_operations xfs_symlink_inode_operations = {
766         .readlink               = generic_readlink,
767         .follow_link            = xfs_vn_follow_link,
768         .put_link               = xfs_vn_put_link,
769         .check_acl              = xfs_check_acl,
770         .getattr                = xfs_vn_getattr,
771         .setattr                = xfs_vn_setattr,
772         .setxattr               = generic_setxattr,
773         .getxattr               = generic_getxattr,
774         .removexattr            = generic_removexattr,
775         .listxattr              = xfs_vn_listxattr,
776 };
777
778 STATIC void
779 xfs_diflags_to_iflags(
780         struct inode            *inode,
781         struct xfs_inode        *ip)
782 {
783         if (ip->i_d.di_flags & XFS_DIFLAG_IMMUTABLE)
784                 inode->i_flags |= S_IMMUTABLE;
785         else
786                 inode->i_flags &= ~S_IMMUTABLE;
787         if (ip->i_d.di_flags & XFS_DIFLAG_APPEND)
788                 inode->i_flags |= S_APPEND;
789         else
790                 inode->i_flags &= ~S_APPEND;
791         if (ip->i_d.di_flags & XFS_DIFLAG_SYNC)
792                 inode->i_flags |= S_SYNC;
793         else
794                 inode->i_flags &= ~S_SYNC;
795         if (ip->i_d.di_flags & XFS_DIFLAG_NOATIME)
796                 inode->i_flags |= S_NOATIME;
797         else
798                 inode->i_flags &= ~S_NOATIME;
799 }
800
801 /*
802  * Initialize the Linux inode, set up the operation vectors and
803  * unlock the inode.
804  *
805  * When reading existing inodes from disk this is called directly
806  * from xfs_iget, when creating a new inode it is called from
807  * xfs_ialloc after setting up the inode.
808  *
809  * We are always called with an uninitialised linux inode here.
810  * We need to initialise the necessary fields and take a reference
811  * on it.
812  */
813 void
814 xfs_setup_inode(
815         struct xfs_inode        *ip)
816 {
817         struct inode            *inode = &ip->i_vnode;
818
819         inode->i_ino = ip->i_ino;
820         inode->i_state = I_NEW;
821         inode_add_to_lists(ip->i_mount->m_super, inode);
822
823         inode->i_mode   = ip->i_d.di_mode;
824         inode->i_nlink  = ip->i_d.di_nlink;
825         inode->i_uid    = ip->i_d.di_uid;
826         inode->i_gid    = ip->i_d.di_gid;
827
828         switch (inode->i_mode & S_IFMT) {
829         case S_IFBLK:
830         case S_IFCHR:
831                 inode->i_rdev =
832                         MKDEV(sysv_major(ip->i_df.if_u2.if_rdev) & 0x1ff,
833                               sysv_minor(ip->i_df.if_u2.if_rdev));
834                 break;
835         default:
836                 inode->i_rdev = 0;
837                 break;
838         }
839
840         inode->i_generation = ip->i_d.di_gen;
841         i_size_write(inode, ip->i_d.di_size);
842         inode->i_atime.tv_sec   = ip->i_d.di_atime.t_sec;
843         inode->i_atime.tv_nsec  = ip->i_d.di_atime.t_nsec;
844         inode->i_mtime.tv_sec   = ip->i_d.di_mtime.t_sec;
845         inode->i_mtime.tv_nsec  = ip->i_d.di_mtime.t_nsec;
846         inode->i_ctime.tv_sec   = ip->i_d.di_ctime.t_sec;
847         inode->i_ctime.tv_nsec  = ip->i_d.di_ctime.t_nsec;
848         xfs_diflags_to_iflags(inode, ip);
849
850         switch (inode->i_mode & S_IFMT) {
851         case S_IFREG:
852                 inode->i_op = &xfs_inode_operations;
853                 inode->i_fop = &xfs_file_operations;
854                 inode->i_mapping->a_ops = &xfs_address_space_operations;
855                 break;
856         case S_IFDIR:
857                 if (xfs_sb_version_hasasciici(&XFS_M(inode->i_sb)->m_sb))
858                         inode->i_op = &xfs_dir_ci_inode_operations;
859                 else
860                         inode->i_op = &xfs_dir_inode_operations;
861                 inode->i_fop = &xfs_dir_file_operations;
862                 break;
863         case S_IFLNK:
864                 inode->i_op = &xfs_symlink_inode_operations;
865                 if (!(ip->i_df.if_flags & XFS_IFINLINE))
866                         inode->i_mapping->a_ops = &xfs_address_space_operations;
867                 break;
868         default:
869                 inode->i_op = &xfs_inode_operations;
870                 init_special_inode(inode, inode->i_mode, inode->i_rdev);
871                 break;
872         }
873
874         xfs_iflags_clear(ip, XFS_INEW);
875         barrier();
876
877         unlock_new_inode(inode);
878 }