1
2
3
4
5
6#include "xfs.h"
7#include "xfs_fs.h"
8#include "xfs_shared.h"
9#include "xfs_format.h"
10#include "xfs_log_format.h"
11#include "xfs_trans_resv.h"
12#include "xfs_mount.h"
13#include "xfs_inode.h"
14#include "xfs_acl.h"
15#include "xfs_quota.h"
16#include "xfs_attr.h"
17#include "xfs_trans.h"
18#include "xfs_trace.h"
19#include "xfs_icache.h"
20#include "xfs_symlink.h"
21#include "xfs_dir2.h"
22#include "xfs_iomap.h"
23#include "xfs_error.h"
24
25#include <linux/xattr.h>
26#include <linux/posix_acl.h>
27#include <linux/security.h>
28#include <linux/iversion.h>
29
30
31
32
33
34
35
36
37
38
39static struct lock_class_key xfs_nondir_ilock_class;
40static struct lock_class_key xfs_dir_ilock_class;
41
42static int
43xfs_initxattrs(
44 struct inode *inode,
45 const struct xattr *xattr_array,
46 void *fs_info)
47{
48 const struct xattr *xattr;
49 struct xfs_inode *ip = XFS_I(inode);
50 int error = 0;
51
52 for (xattr = xattr_array; xattr->name != NULL; xattr++) {
53 error = xfs_attr_set(ip, xattr->name,
54 strlen(xattr->name),
55 xattr->value, xattr->value_len,
56 ATTR_SECURE);
57 if (error < 0)
58 break;
59 }
60 return error;
61}
62
63
64
65
66
67
68
69
70STATIC int
71xfs_init_security(
72 struct inode *inode,
73 struct inode *dir,
74 const struct qstr *qstr)
75{
76 return security_inode_init_security(inode, dir, qstr,
77 &xfs_initxattrs, NULL);
78}
79
80static void
81xfs_dentry_to_name(
82 struct xfs_name *namep,
83 struct dentry *dentry)
84{
85 namep->name = dentry->d_name.name;
86 namep->len = dentry->d_name.len;
87 namep->type = XFS_DIR3_FT_UNKNOWN;
88}
89
90static int
91xfs_dentry_mode_to_name(
92 struct xfs_name *namep,
93 struct dentry *dentry,
94 int mode)
95{
96 namep->name = dentry->d_name.name;
97 namep->len = dentry->d_name.len;
98 namep->type = xfs_mode_to_ftype(mode);
99
100 if (unlikely(namep->type == XFS_DIR3_FT_UNKNOWN))
101 return -EFSCORRUPTED;
102
103 return 0;
104}
105
106STATIC void
107xfs_cleanup_inode(
108 struct inode *dir,
109 struct inode *inode,
110 struct dentry *dentry)
111{
112 struct xfs_name teardown;
113
114
115
116
117
118
119 xfs_dentry_to_name(&teardown, dentry);
120
121 xfs_remove(XFS_I(dir), &teardown, XFS_I(inode));
122}
123
124STATIC int
125xfs_generic_create(
126 struct inode *dir,
127 struct dentry *dentry,
128 umode_t mode,
129 dev_t rdev,
130 bool tmpfile)
131{
132 struct inode *inode;
133 struct xfs_inode *ip = NULL;
134 struct posix_acl *default_acl, *acl;
135 struct xfs_name name;
136 int error;
137
138
139
140
141
142 if (S_ISCHR(mode) || S_ISBLK(mode)) {
143 if (unlikely(!sysv_valid_dev(rdev) || MAJOR(rdev) & ~0x1ff))
144 return -EINVAL;
145 } else {
146 rdev = 0;
147 }
148
149 error = posix_acl_create(dir, &mode, &default_acl, &acl);
150 if (error)
151 return error;
152
153
154 error = xfs_dentry_mode_to_name(&name, dentry, mode);
155 if (unlikely(error))
156 goto out_free_acl;
157
158 if (!tmpfile) {
159 error = xfs_create(XFS_I(dir), &name, mode, rdev, &ip);
160 } else {
161 error = xfs_create_tmpfile(XFS_I(dir), mode, &ip);
162 }
163 if (unlikely(error))
164 goto out_free_acl;
165
166 inode = VFS_I(ip);
167
168 error = xfs_init_security(inode, dir, &dentry->d_name);
169 if (unlikely(error))
170 goto out_cleanup_inode;
171
172#ifdef CONFIG_XFS_POSIX_ACL
173 if (default_acl) {
174 error = __xfs_set_acl(inode, default_acl, ACL_TYPE_DEFAULT);
175 if (error)
176 goto out_cleanup_inode;
177 }
178 if (acl) {
179 error = __xfs_set_acl(inode, acl, ACL_TYPE_ACCESS);
180 if (error)
181 goto out_cleanup_inode;
182 }
183#endif
184
185 xfs_setup_iops(ip);
186
187 if (tmpfile) {
188
189
190
191
192
193
194
195
196 set_nlink(inode, 1);
197 d_tmpfile(dentry, inode);
198 } else
199 d_instantiate(dentry, inode);
200
201 xfs_finish_inode_setup(ip);
202
203 out_free_acl:
204 if (default_acl)
205 posix_acl_release(default_acl);
206 if (acl)
207 posix_acl_release(acl);
208 return error;
209
210 out_cleanup_inode:
211 xfs_finish_inode_setup(ip);
212 if (!tmpfile)
213 xfs_cleanup_inode(dir, inode, dentry);
214 xfs_irele(ip);
215 goto out_free_acl;
216}
217
218STATIC int
219xfs_vn_mknod(
220 struct inode *dir,
221 struct dentry *dentry,
222 umode_t mode,
223 dev_t rdev)
224{
225 return xfs_generic_create(dir, dentry, mode, rdev, false);
226}
227
228STATIC int
229xfs_vn_create(
230 struct inode *dir,
231 struct dentry *dentry,
232 umode_t mode,
233 bool flags)
234{
235 return xfs_vn_mknod(dir, dentry, mode, 0);
236}
237
238STATIC int
239xfs_vn_mkdir(
240 struct inode *dir,
241 struct dentry *dentry,
242 umode_t mode)
243{
244 return xfs_vn_mknod(dir, dentry, mode|S_IFDIR, 0);
245}
246
247STATIC struct dentry *
248xfs_vn_lookup(
249 struct inode *dir,
250 struct dentry *dentry,
251 unsigned int flags)
252{
253 struct inode *inode;
254 struct xfs_inode *cip;
255 struct xfs_name name;
256 int error;
257
258 if (dentry->d_name.len >= MAXNAMELEN)
259 return ERR_PTR(-ENAMETOOLONG);
260
261 xfs_dentry_to_name(&name, dentry);
262 error = xfs_lookup(XFS_I(dir), &name, &cip, NULL);
263 if (likely(!error))
264 inode = VFS_I(cip);
265 else if (likely(error == -ENOENT))
266 inode = NULL;
267 else
268 inode = ERR_PTR(error);
269 return d_splice_alias(inode, dentry);
270}
271
272STATIC struct dentry *
273xfs_vn_ci_lookup(
274 struct inode *dir,
275 struct dentry *dentry,
276 unsigned int flags)
277{
278 struct xfs_inode *ip;
279 struct xfs_name xname;
280 struct xfs_name ci_name;
281 struct qstr dname;
282 int error;
283
284 if (dentry->d_name.len >= MAXNAMELEN)
285 return ERR_PTR(-ENAMETOOLONG);
286
287 xfs_dentry_to_name(&xname, dentry);
288 error = xfs_lookup(XFS_I(dir), &xname, &ip, &ci_name);
289 if (unlikely(error)) {
290 if (unlikely(error != -ENOENT))
291 return ERR_PTR(error);
292
293
294
295
296
297 return NULL;
298 }
299
300
301 if (!ci_name.name)
302 return d_splice_alias(VFS_I(ip), dentry);
303
304
305 dname.name = ci_name.name;
306 dname.len = ci_name.len;
307 dentry = d_add_ci(dentry, VFS_I(ip), &dname);
308 kmem_free(ci_name.name);
309 return dentry;
310}
311
312STATIC int
313xfs_vn_link(
314 struct dentry *old_dentry,
315 struct inode *dir,
316 struct dentry *dentry)
317{
318 struct inode *inode = d_inode(old_dentry);
319 struct xfs_name name;
320 int error;
321
322 error = xfs_dentry_mode_to_name(&name, dentry, inode->i_mode);
323 if (unlikely(error))
324 return error;
325
326 error = xfs_link(XFS_I(dir), XFS_I(inode), &name);
327 if (unlikely(error))
328 return error;
329
330 ihold(inode);
331 d_instantiate(dentry, inode);
332 return 0;
333}
334
335STATIC int
336xfs_vn_unlink(
337 struct inode *dir,
338 struct dentry *dentry)
339{
340 struct xfs_name name;
341 int error;
342
343 xfs_dentry_to_name(&name, dentry);
344
345 error = xfs_remove(XFS_I(dir), &name, XFS_I(d_inode(dentry)));
346 if (error)
347 return error;
348
349
350
351
352
353
354 if (xfs_sb_version_hasasciici(&XFS_M(dir->i_sb)->m_sb))
355 d_invalidate(dentry);
356 return 0;
357}
358
359STATIC int
360xfs_vn_symlink(
361 struct inode *dir,
362 struct dentry *dentry,
363 const char *symname)
364{
365 struct inode *inode;
366 struct xfs_inode *cip = NULL;
367 struct xfs_name name;
368 int error;
369 umode_t mode;
370
371 mode = S_IFLNK |
372 (irix_symlink_mode ? 0777 & ~current_umask() : S_IRWXUGO);
373 error = xfs_dentry_mode_to_name(&name, dentry, mode);
374 if (unlikely(error))
375 goto out;
376
377 error = xfs_symlink(XFS_I(dir), &name, symname, mode, &cip);
378 if (unlikely(error))
379 goto out;
380
381 inode = VFS_I(cip);
382
383 error = xfs_init_security(inode, dir, &dentry->d_name);
384 if (unlikely(error))
385 goto out_cleanup_inode;
386
387 xfs_setup_iops(cip);
388
389 d_instantiate(dentry, inode);
390 xfs_finish_inode_setup(cip);
391 return 0;
392
393 out_cleanup_inode:
394 xfs_finish_inode_setup(cip);
395 xfs_cleanup_inode(dir, inode, dentry);
396 xfs_irele(cip);
397 out:
398 return error;
399}
400
401STATIC int
402xfs_vn_rename(
403 struct inode *odir,
404 struct dentry *odentry,
405 struct inode *ndir,
406 struct dentry *ndentry,
407 unsigned int flags)
408{
409 struct inode *new_inode = d_inode(ndentry);
410 int omode = 0;
411 int error;
412 struct xfs_name oname;
413 struct xfs_name nname;
414
415 if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE | RENAME_WHITEOUT))
416 return -EINVAL;
417
418
419 if (flags & RENAME_EXCHANGE)
420 omode = d_inode(ndentry)->i_mode;
421
422 error = xfs_dentry_mode_to_name(&oname, odentry, omode);
423 if (omode && unlikely(error))
424 return error;
425
426 error = xfs_dentry_mode_to_name(&nname, ndentry,
427 d_inode(odentry)->i_mode);
428 if (unlikely(error))
429 return error;
430
431 return xfs_rename(XFS_I(odir), &oname, XFS_I(d_inode(odentry)),
432 XFS_I(ndir), &nname,
433 new_inode ? XFS_I(new_inode) : NULL, flags);
434}
435
436
437
438
439
440
441STATIC const char *
442xfs_vn_get_link(
443 struct dentry *dentry,
444 struct inode *inode,
445 struct delayed_call *done)
446{
447 char *link;
448 int error = -ENOMEM;
449
450 if (!dentry)
451 return ERR_PTR(-ECHILD);
452
453 link = kmalloc(XFS_SYMLINK_MAXLEN+1, GFP_KERNEL);
454 if (!link)
455 goto out_err;
456
457 error = xfs_readlink(XFS_I(d_inode(dentry)), link);
458 if (unlikely(error))
459 goto out_kfree;
460
461 set_delayed_call(done, kfree_link, link);
462 return link;
463
464 out_kfree:
465 kfree(link);
466 out_err:
467 return ERR_PTR(error);
468}
469
470STATIC const char *
471xfs_vn_get_link_inline(
472 struct dentry *dentry,
473 struct inode *inode,
474 struct delayed_call *done)
475{
476 struct xfs_inode *ip = XFS_I(inode);
477 char *link;
478
479 ASSERT(ip->i_df.if_flags & XFS_IFINLINE);
480
481
482
483
484
485 link = ip->i_df.if_u1.if_data;
486 if (XFS_IS_CORRUPT(ip->i_mount, !link))
487 return ERR_PTR(-EFSCORRUPTED);
488 return link;
489}
490
491static uint32_t
492xfs_stat_blksize(
493 struct xfs_inode *ip)
494{
495 struct xfs_mount *mp = ip->i_mount;
496
497
498
499
500
501 if (XFS_IS_REALTIME_INODE(ip))
502 return xfs_get_extsz_hint(ip) << mp->m_sb.sb_blocklog;
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517 if (mp->m_flags & XFS_MOUNT_LARGEIO) {
518 if (mp->m_swidth)
519 return mp->m_swidth << mp->m_sb.sb_blocklog;
520 if (mp->m_flags & XFS_MOUNT_ALLOCSIZE)
521 return 1U << mp->m_allocsize_log;
522 }
523
524 return PAGE_SIZE;
525}
526
527STATIC int
528xfs_vn_getattr(
529 const struct path *path,
530 struct kstat *stat,
531 u32 request_mask,
532 unsigned int query_flags)
533{
534 struct inode *inode = d_inode(path->dentry);
535 struct xfs_inode *ip = XFS_I(inode);
536 struct xfs_mount *mp = ip->i_mount;
537
538 trace_xfs_getattr(ip);
539
540 if (XFS_FORCED_SHUTDOWN(mp))
541 return -EIO;
542
543 stat->size = XFS_ISIZE(ip);
544 stat->dev = inode->i_sb->s_dev;
545 stat->mode = inode->i_mode;
546 stat->nlink = inode->i_nlink;
547 stat->uid = inode->i_uid;
548 stat->gid = inode->i_gid;
549 stat->ino = ip->i_ino;
550 stat->atime = inode->i_atime;
551 stat->mtime = inode->i_mtime;
552 stat->ctime = inode->i_ctime;
553 stat->blocks =
554 XFS_FSB_TO_BB(mp, ip->i_d.di_nblocks + ip->i_delayed_blks);
555
556 if (ip->i_d.di_version == 3) {
557 if (request_mask & STATX_BTIME) {
558 stat->result_mask |= STATX_BTIME;
559 stat->btime = ip->i_d.di_crtime;
560 }
561 }
562
563
564
565
566
567 if (ip->i_d.di_flags & XFS_DIFLAG_IMMUTABLE)
568 stat->attributes |= STATX_ATTR_IMMUTABLE;
569 if (ip->i_d.di_flags & XFS_DIFLAG_APPEND)
570 stat->attributes |= STATX_ATTR_APPEND;
571 if (ip->i_d.di_flags & XFS_DIFLAG_NODUMP)
572 stat->attributes |= STATX_ATTR_NODUMP;
573
574 stat->attributes_mask |= (STATX_ATTR_IMMUTABLE |
575 STATX_ATTR_APPEND |
576 STATX_ATTR_NODUMP);
577
578 switch (inode->i_mode & S_IFMT) {
579 case S_IFBLK:
580 case S_IFCHR:
581 stat->blksize = BLKDEV_IOSIZE;
582 stat->rdev = inode->i_rdev;
583 break;
584 default:
585 stat->blksize = xfs_stat_blksize(ip);
586 stat->rdev = 0;
587 break;
588 }
589
590 return 0;
591}
592
593static void
594xfs_setattr_mode(
595 struct xfs_inode *ip,
596 struct iattr *iattr)
597{
598 struct inode *inode = VFS_I(ip);
599 umode_t mode = iattr->ia_mode;
600
601 ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
602
603 inode->i_mode &= S_IFMT;
604 inode->i_mode |= mode & ~S_IFMT;
605}
606
607void
608xfs_setattr_time(
609 struct xfs_inode *ip,
610 struct iattr *iattr)
611{
612 struct inode *inode = VFS_I(ip);
613
614 ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
615
616 if (iattr->ia_valid & ATTR_ATIME)
617 inode->i_atime = iattr->ia_atime;
618 if (iattr->ia_valid & ATTR_CTIME)
619 inode->i_ctime = iattr->ia_ctime;
620 if (iattr->ia_valid & ATTR_MTIME)
621 inode->i_mtime = iattr->ia_mtime;
622}
623
624static int
625xfs_vn_change_ok(
626 struct dentry *dentry,
627 struct iattr *iattr)
628{
629 struct xfs_mount *mp = XFS_I(d_inode(dentry))->i_mount;
630
631 if (mp->m_flags & XFS_MOUNT_RDONLY)
632 return -EROFS;
633
634 if (XFS_FORCED_SHUTDOWN(mp))
635 return -EIO;
636
637 return setattr_prepare(dentry, iattr);
638}
639
640
641
642
643
644
645
646int
647xfs_setattr_nonsize(
648 struct xfs_inode *ip,
649 struct iattr *iattr,
650 int flags)
651{
652 xfs_mount_t *mp = ip->i_mount;
653 struct inode *inode = VFS_I(ip);
654 int mask = iattr->ia_valid;
655 xfs_trans_t *tp;
656 int error;
657 kuid_t uid = GLOBAL_ROOT_UID, iuid = GLOBAL_ROOT_UID;
658 kgid_t gid = GLOBAL_ROOT_GID, igid = GLOBAL_ROOT_GID;
659 struct xfs_dquot *udqp = NULL, *gdqp = NULL;
660 struct xfs_dquot *olddquot1 = NULL, *olddquot2 = NULL;
661
662 ASSERT((mask & ATTR_SIZE) == 0);
663
664
665
666
667
668
669
670
671
672 if (XFS_IS_QUOTA_ON(mp) && (mask & (ATTR_UID|ATTR_GID))) {
673 uint qflags = 0;
674
675 if ((mask & ATTR_UID) && XFS_IS_UQUOTA_ON(mp)) {
676 uid = iattr->ia_uid;
677 qflags |= XFS_QMOPT_UQUOTA;
678 } else {
679 uid = inode->i_uid;
680 }
681 if ((mask & ATTR_GID) && XFS_IS_GQUOTA_ON(mp)) {
682 gid = iattr->ia_gid;
683 qflags |= XFS_QMOPT_GQUOTA;
684 } else {
685 gid = inode->i_gid;
686 }
687
688
689
690
691
692
693 ASSERT(udqp == NULL);
694 ASSERT(gdqp == NULL);
695 error = xfs_qm_vop_dqalloc(ip, xfs_kuid_to_uid(uid),
696 xfs_kgid_to_gid(gid),
697 ip->i_d.di_projid,
698 qflags, &udqp, &gdqp, NULL);
699 if (error)
700 return error;
701 }
702
703 error = xfs_trans_alloc(mp, &M_RES(mp)->tr_ichange, 0, 0, 0, &tp);
704 if (error)
705 goto out_dqrele;
706
707 xfs_ilock(ip, XFS_ILOCK_EXCL);
708 xfs_trans_ijoin(tp, ip, 0);
709
710
711
712
713 if (mask & (ATTR_UID|ATTR_GID)) {
714
715
716
717
718
719
720 iuid = inode->i_uid;
721 igid = inode->i_gid;
722 gid = (mask & ATTR_GID) ? iattr->ia_gid : igid;
723 uid = (mask & ATTR_UID) ? iattr->ia_uid : iuid;
724
725
726
727
728
729 if (XFS_IS_QUOTA_RUNNING(mp) &&
730 ((XFS_IS_UQUOTA_ON(mp) && !uid_eq(iuid, uid)) ||
731 (XFS_IS_GQUOTA_ON(mp) && !gid_eq(igid, gid)))) {
732 ASSERT(tp);
733 error = xfs_qm_vop_chown_reserve(tp, ip, udqp, gdqp,
734 NULL, capable(CAP_FOWNER) ?
735 XFS_QMOPT_FORCE_RES : 0);
736 if (error)
737 goto out_cancel;
738 }
739 }
740
741
742
743
744 if (mask & (ATTR_UID|ATTR_GID)) {
745
746
747
748
749
750
751 if ((inode->i_mode & (S_ISUID|S_ISGID)) &&
752 !capable(CAP_FSETID))
753 inode->i_mode &= ~(S_ISUID|S_ISGID);
754
755
756
757
758
759 if (!uid_eq(iuid, uid)) {
760 if (XFS_IS_QUOTA_RUNNING(mp) && XFS_IS_UQUOTA_ON(mp)) {
761 ASSERT(mask & ATTR_UID);
762 ASSERT(udqp);
763 olddquot1 = xfs_qm_vop_chown(tp, ip,
764 &ip->i_udquot, udqp);
765 }
766 ip->i_d.di_uid = xfs_kuid_to_uid(uid);
767 inode->i_uid = uid;
768 }
769 if (!gid_eq(igid, gid)) {
770 if (XFS_IS_QUOTA_RUNNING(mp) && XFS_IS_GQUOTA_ON(mp)) {
771 ASSERT(xfs_sb_version_has_pquotino(&mp->m_sb) ||
772 !XFS_IS_PQUOTA_ON(mp));
773 ASSERT(mask & ATTR_GID);
774 ASSERT(gdqp);
775 olddquot2 = xfs_qm_vop_chown(tp, ip,
776 &ip->i_gdquot, gdqp);
777 }
778 ip->i_d.di_gid = xfs_kgid_to_gid(gid);
779 inode->i_gid = gid;
780 }
781 }
782
783 if (mask & ATTR_MODE)
784 xfs_setattr_mode(ip, iattr);
785 if (mask & (ATTR_ATIME|ATTR_CTIME|ATTR_MTIME))
786 xfs_setattr_time(ip, iattr);
787
788 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
789
790 XFS_STATS_INC(mp, xs_ig_attrchg);
791
792 if (mp->m_flags & XFS_MOUNT_WSYNC)
793 xfs_trans_set_sync(tp);
794 error = xfs_trans_commit(tp);
795
796 xfs_iunlock(ip, XFS_ILOCK_EXCL);
797
798
799
800
801 xfs_qm_dqrele(olddquot1);
802 xfs_qm_dqrele(olddquot2);
803 xfs_qm_dqrele(udqp);
804 xfs_qm_dqrele(gdqp);
805
806 if (error)
807 return error;
808
809
810
811
812
813
814
815
816 if ((mask & ATTR_MODE) && !(flags & XFS_ATTR_NOACL)) {
817 error = posix_acl_chmod(inode, inode->i_mode);
818 if (error)
819 return error;
820 }
821
822 return 0;
823
824out_cancel:
825 xfs_trans_cancel(tp);
826 xfs_iunlock(ip, XFS_ILOCK_EXCL);
827out_dqrele:
828 xfs_qm_dqrele(udqp);
829 xfs_qm_dqrele(gdqp);
830 return error;
831}
832
833int
834xfs_vn_setattr_nonsize(
835 struct dentry *dentry,
836 struct iattr *iattr)
837{
838 struct xfs_inode *ip = XFS_I(d_inode(dentry));
839 int error;
840
841 trace_xfs_setattr(ip);
842
843 error = xfs_vn_change_ok(dentry, iattr);
844 if (error)
845 return error;
846 return xfs_setattr_nonsize(ip, iattr, 0);
847}
848
849
850
851
852
853
854
855STATIC int
856xfs_setattr_size(
857 struct xfs_inode *ip,
858 struct iattr *iattr)
859{
860 struct xfs_mount *mp = ip->i_mount;
861 struct inode *inode = VFS_I(ip);
862 xfs_off_t oldsize, newsize;
863 struct xfs_trans *tp;
864 int error;
865 uint lock_flags = 0;
866 bool did_zeroing = false;
867
868 ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL));
869 ASSERT(xfs_isilocked(ip, XFS_MMAPLOCK_EXCL));
870 ASSERT(S_ISREG(inode->i_mode));
871 ASSERT((iattr->ia_valid & (ATTR_UID|ATTR_GID|ATTR_ATIME|ATTR_ATIME_SET|
872 ATTR_MTIME_SET|ATTR_KILL_PRIV|ATTR_TIMES_SET)) == 0);
873
874 oldsize = inode->i_size;
875 newsize = iattr->ia_size;
876
877
878
879
880 if (newsize == 0 && oldsize == 0 && ip->i_d.di_nextents == 0) {
881 if (!(iattr->ia_valid & (ATTR_CTIME|ATTR_MTIME)))
882 return 0;
883
884
885
886
887 iattr->ia_valid &= ~ATTR_SIZE;
888 return xfs_setattr_nonsize(ip, iattr, 0);
889 }
890
891
892
893
894 error = xfs_qm_dqattach(ip);
895 if (error)
896 return error;
897
898
899
900
901 inode_dio_wait(inode);
902
903
904
905
906
907
908
909
910
911
912
913 if (newsize > oldsize) {
914 trace_xfs_zero_eof(ip, oldsize, newsize - oldsize);
915 error = iomap_zero_range(inode, oldsize, newsize - oldsize,
916 &did_zeroing, &xfs_buffered_write_iomap_ops);
917 } else {
918 error = iomap_truncate_page(inode, newsize, &did_zeroing,
919 &xfs_buffered_write_iomap_ops);
920 }
921
922 if (error)
923 return error;
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946 truncate_setsize(inode, newsize);
947
948
949
950
951
952
953
954
955
956 if (did_zeroing ||
957 (newsize > ip->i_d.di_size && oldsize != ip->i_d.di_size)) {
958 error = filemap_write_and_wait_range(VFS_I(ip)->i_mapping,
959 ip->i_d.di_size, newsize - 1);
960 if (error)
961 return error;
962 }
963
964 error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate, 0, 0, 0, &tp);
965 if (error)
966 return error;
967
968 lock_flags |= XFS_ILOCK_EXCL;
969 xfs_ilock(ip, XFS_ILOCK_EXCL);
970 xfs_trans_ijoin(tp, ip, 0);
971
972
973
974
975
976
977
978
979
980
981
982 if (newsize != oldsize &&
983 !(iattr->ia_valid & (ATTR_CTIME | ATTR_MTIME))) {
984 iattr->ia_ctime = iattr->ia_mtime =
985 current_time(inode);
986 iattr->ia_valid |= ATTR_CTIME | ATTR_MTIME;
987 }
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001 ip->i_d.di_size = newsize;
1002 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
1003
1004 if (newsize <= oldsize) {
1005 error = xfs_itruncate_extents(&tp, ip, XFS_DATA_FORK, newsize);
1006 if (error)
1007 goto out_trans_cancel;
1008
1009
1010
1011
1012
1013
1014
1015
1016 xfs_iflags_set(ip, XFS_ITRUNCATED);
1017
1018
1019 xfs_inode_clear_eofblocks_tag(ip);
1020 }
1021
1022 if (iattr->ia_valid & ATTR_MODE)
1023 xfs_setattr_mode(ip, iattr);
1024 if (iattr->ia_valid & (ATTR_ATIME|ATTR_CTIME|ATTR_MTIME))
1025 xfs_setattr_time(ip, iattr);
1026
1027 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
1028
1029 XFS_STATS_INC(mp, xs_ig_attrchg);
1030
1031 if (mp->m_flags & XFS_MOUNT_WSYNC)
1032 xfs_trans_set_sync(tp);
1033
1034 error = xfs_trans_commit(tp);
1035out_unlock:
1036 if (lock_flags)
1037 xfs_iunlock(ip, lock_flags);
1038 return error;
1039
1040out_trans_cancel:
1041 xfs_trans_cancel(tp);
1042 goto out_unlock;
1043}
1044
1045int
1046xfs_vn_setattr_size(
1047 struct dentry *dentry,
1048 struct iattr *iattr)
1049{
1050 struct xfs_inode *ip = XFS_I(d_inode(dentry));
1051 int error;
1052
1053 trace_xfs_setattr(ip);
1054
1055 error = xfs_vn_change_ok(dentry, iattr);
1056 if (error)
1057 return error;
1058 return xfs_setattr_size(ip, iattr);
1059}
1060
1061STATIC int
1062xfs_vn_setattr(
1063 struct dentry *dentry,
1064 struct iattr *iattr)
1065{
1066 int error;
1067
1068 if (iattr->ia_valid & ATTR_SIZE) {
1069 struct inode *inode = d_inode(dentry);
1070 struct xfs_inode *ip = XFS_I(inode);
1071 uint iolock;
1072
1073 xfs_ilock(ip, XFS_MMAPLOCK_EXCL);
1074 iolock = XFS_IOLOCK_EXCL | XFS_MMAPLOCK_EXCL;
1075
1076 error = xfs_break_layouts(inode, &iolock, BREAK_UNMAP);
1077 if (error) {
1078 xfs_iunlock(ip, XFS_MMAPLOCK_EXCL);
1079 return error;
1080 }
1081
1082 error = xfs_vn_setattr_size(dentry, iattr);
1083 xfs_iunlock(ip, XFS_MMAPLOCK_EXCL);
1084 } else {
1085 error = xfs_vn_setattr_nonsize(dentry, iattr);
1086 }
1087
1088 return error;
1089}
1090
1091STATIC int
1092xfs_vn_update_time(
1093 struct inode *inode,
1094 struct timespec64 *now,
1095 int flags)
1096{
1097 struct xfs_inode *ip = XFS_I(inode);
1098 struct xfs_mount *mp = ip->i_mount;
1099 int log_flags = XFS_ILOG_TIMESTAMP;
1100 struct xfs_trans *tp;
1101 int error;
1102
1103 trace_xfs_update_time(ip);
1104
1105 if (inode->i_sb->s_flags & SB_LAZYTIME) {
1106 if (!((flags & S_VERSION) &&
1107 inode_maybe_inc_iversion(inode, false)))
1108 return generic_update_time(inode, now, flags);
1109
1110
1111 log_flags |= XFS_ILOG_CORE;
1112 }
1113
1114 error = xfs_trans_alloc(mp, &M_RES(mp)->tr_fsyncts, 0, 0, 0, &tp);
1115 if (error)
1116 return error;
1117
1118 xfs_ilock(ip, XFS_ILOCK_EXCL);
1119 if (flags & S_CTIME)
1120 inode->i_ctime = *now;
1121 if (flags & S_MTIME)
1122 inode->i_mtime = *now;
1123 if (flags & S_ATIME)
1124 inode->i_atime = *now;
1125
1126 xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
1127 xfs_trans_log_inode(tp, ip, log_flags);
1128 return xfs_trans_commit(tp);
1129}
1130
1131STATIC int
1132xfs_vn_fiemap(
1133 struct inode *inode,
1134 struct fiemap_extent_info *fieinfo,
1135 u64 start,
1136 u64 length)
1137{
1138 int error;
1139
1140 xfs_ilock(XFS_I(inode), XFS_IOLOCK_SHARED);
1141 if (fieinfo->fi_flags & FIEMAP_FLAG_XATTR) {
1142 fieinfo->fi_flags &= ~FIEMAP_FLAG_XATTR;
1143 error = iomap_fiemap(inode, fieinfo, start, length,
1144 &xfs_xattr_iomap_ops);
1145 } else {
1146 error = iomap_fiemap(inode, fieinfo, start, length,
1147 &xfs_read_iomap_ops);
1148 }
1149 xfs_iunlock(XFS_I(inode), XFS_IOLOCK_SHARED);
1150
1151 return error;
1152}
1153
1154STATIC int
1155xfs_vn_tmpfile(
1156 struct inode *dir,
1157 struct dentry *dentry,
1158 umode_t mode)
1159{
1160 return xfs_generic_create(dir, dentry, mode, 0, true);
1161}
1162
1163static const struct inode_operations xfs_inode_operations = {
1164 .get_acl = xfs_get_acl,
1165 .set_acl = xfs_set_acl,
1166 .getattr = xfs_vn_getattr,
1167 .setattr = xfs_vn_setattr,
1168 .listxattr = xfs_vn_listxattr,
1169 .fiemap = xfs_vn_fiemap,
1170 .update_time = xfs_vn_update_time,
1171};
1172
1173static const struct inode_operations xfs_dir_inode_operations = {
1174 .create = xfs_vn_create,
1175 .lookup = xfs_vn_lookup,
1176 .link = xfs_vn_link,
1177 .unlink = xfs_vn_unlink,
1178 .symlink = xfs_vn_symlink,
1179 .mkdir = xfs_vn_mkdir,
1180
1181
1182
1183
1184
1185
1186 .rmdir = xfs_vn_unlink,
1187 .mknod = xfs_vn_mknod,
1188 .rename = xfs_vn_rename,
1189 .get_acl = xfs_get_acl,
1190 .set_acl = xfs_set_acl,
1191 .getattr = xfs_vn_getattr,
1192 .setattr = xfs_vn_setattr,
1193 .listxattr = xfs_vn_listxattr,
1194 .update_time = xfs_vn_update_time,
1195 .tmpfile = xfs_vn_tmpfile,
1196};
1197
1198static const struct inode_operations xfs_dir_ci_inode_operations = {
1199 .create = xfs_vn_create,
1200 .lookup = xfs_vn_ci_lookup,
1201 .link = xfs_vn_link,
1202 .unlink = xfs_vn_unlink,
1203 .symlink = xfs_vn_symlink,
1204 .mkdir = xfs_vn_mkdir,
1205
1206
1207
1208
1209
1210
1211 .rmdir = xfs_vn_unlink,
1212 .mknod = xfs_vn_mknod,
1213 .rename = xfs_vn_rename,
1214 .get_acl = xfs_get_acl,
1215 .set_acl = xfs_set_acl,
1216 .getattr = xfs_vn_getattr,
1217 .setattr = xfs_vn_setattr,
1218 .listxattr = xfs_vn_listxattr,
1219 .update_time = xfs_vn_update_time,
1220 .tmpfile = xfs_vn_tmpfile,
1221};
1222
1223static const struct inode_operations xfs_symlink_inode_operations = {
1224 .get_link = xfs_vn_get_link,
1225 .getattr = xfs_vn_getattr,
1226 .setattr = xfs_vn_setattr,
1227 .listxattr = xfs_vn_listxattr,
1228 .update_time = xfs_vn_update_time,
1229};
1230
1231static const struct inode_operations xfs_inline_symlink_inode_operations = {
1232 .get_link = xfs_vn_get_link_inline,
1233 .getattr = xfs_vn_getattr,
1234 .setattr = xfs_vn_setattr,
1235 .listxattr = xfs_vn_listxattr,
1236 .update_time = xfs_vn_update_time,
1237};
1238
1239
1240static bool
1241xfs_inode_supports_dax(
1242 struct xfs_inode *ip)
1243{
1244 struct xfs_mount *mp = ip->i_mount;
1245
1246
1247 if (!S_ISREG(VFS_I(ip)->i_mode) || xfs_is_reflink_inode(ip))
1248 return false;
1249
1250
1251 if (!(mp->m_flags & XFS_MOUNT_DAX) &&
1252 !(ip->i_d.di_flags2 & XFS_DIFLAG2_DAX))
1253 return false;
1254
1255
1256 if (mp->m_sb.sb_blocksize != PAGE_SIZE)
1257 return false;
1258
1259
1260 return xfs_inode_buftarg(ip)->bt_daxdev != NULL;
1261}
1262
1263STATIC void
1264xfs_diflags_to_iflags(
1265 struct inode *inode,
1266 struct xfs_inode *ip)
1267{
1268 uint16_t flags = ip->i_d.di_flags;
1269
1270 inode->i_flags &= ~(S_IMMUTABLE | S_APPEND | S_SYNC |
1271 S_NOATIME | S_DAX);
1272
1273 if (flags & XFS_DIFLAG_IMMUTABLE)
1274 inode->i_flags |= S_IMMUTABLE;
1275 if (flags & XFS_DIFLAG_APPEND)
1276 inode->i_flags |= S_APPEND;
1277 if (flags & XFS_DIFLAG_SYNC)
1278 inode->i_flags |= S_SYNC;
1279 if (flags & XFS_DIFLAG_NOATIME)
1280 inode->i_flags |= S_NOATIME;
1281 if (xfs_inode_supports_dax(ip))
1282 inode->i_flags |= S_DAX;
1283}
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293void
1294xfs_setup_inode(
1295 struct xfs_inode *ip)
1296{
1297 struct inode *inode = &ip->i_vnode;
1298 gfp_t gfp_mask;
1299
1300 inode->i_ino = ip->i_ino;
1301 inode->i_state = I_NEW;
1302
1303 inode_sb_list_add(inode);
1304
1305 inode_fake_hash(inode);
1306
1307 inode->i_uid = xfs_uid_to_kuid(ip->i_d.di_uid);
1308 inode->i_gid = xfs_gid_to_kgid(ip->i_d.di_gid);
1309
1310 i_size_write(inode, ip->i_d.di_size);
1311 xfs_diflags_to_iflags(inode, ip);
1312
1313 if (S_ISDIR(inode->i_mode)) {
1314
1315
1316
1317
1318
1319
1320 lockdep_set_class(&inode->i_rwsem,
1321 &inode->i_sb->s_type->i_mutex_dir_key);
1322 lockdep_set_class(&ip->i_lock.mr_lock, &xfs_dir_ilock_class);
1323 } else {
1324 lockdep_set_class(&ip->i_lock.mr_lock, &xfs_nondir_ilock_class);
1325 }
1326
1327
1328
1329
1330
1331
1332 gfp_mask = mapping_gfp_mask(inode->i_mapping);
1333 mapping_set_gfp_mask(inode->i_mapping, (gfp_mask & ~(__GFP_FS)));
1334
1335
1336
1337
1338
1339 if (!XFS_IFORK_Q(ip)) {
1340 inode_has_no_xattr(inode);
1341 cache_no_acl(inode);
1342 }
1343}
1344
1345void
1346xfs_setup_iops(
1347 struct xfs_inode *ip)
1348{
1349 struct inode *inode = &ip->i_vnode;
1350
1351 switch (inode->i_mode & S_IFMT) {
1352 case S_IFREG:
1353 inode->i_op = &xfs_inode_operations;
1354 inode->i_fop = &xfs_file_operations;
1355 if (IS_DAX(inode))
1356 inode->i_mapping->a_ops = &xfs_dax_aops;
1357 else
1358 inode->i_mapping->a_ops = &xfs_address_space_operations;
1359 break;
1360 case S_IFDIR:
1361 if (xfs_sb_version_hasasciici(&XFS_M(inode->i_sb)->m_sb))
1362 inode->i_op = &xfs_dir_ci_inode_operations;
1363 else
1364 inode->i_op = &xfs_dir_inode_operations;
1365 inode->i_fop = &xfs_dir_file_operations;
1366 break;
1367 case S_IFLNK:
1368 if (ip->i_df.if_flags & XFS_IFINLINE)
1369 inode->i_op = &xfs_inline_symlink_inode_operations;
1370 else
1371 inode->i_op = &xfs_symlink_inode_operations;
1372 break;
1373 default:
1374 inode->i_op = &xfs_inode_operations;
1375 init_special_inode(inode, inode->i_mode, inode->i_rdev);
1376 break;
1377 }
1378}
1379