1
2
3
4
5
6#include <linux/log2.h>
7#include <linux/iversion.h>
8
9#include "xfs.h"
10#include "xfs_fs.h"
11#include "xfs_shared.h"
12#include "xfs_format.h"
13#include "xfs_log_format.h"
14#include "xfs_trans_resv.h"
15#include "xfs_sb.h"
16#include "xfs_mount.h"
17#include "xfs_defer.h"
18#include "xfs_inode.h"
19#include "xfs_da_format.h"
20#include "xfs_da_btree.h"
21#include "xfs_dir2.h"
22#include "xfs_attr_sf.h"
23#include "xfs_attr.h"
24#include "xfs_trans_space.h"
25#include "xfs_trans.h"
26#include "xfs_buf_item.h"
27#include "xfs_inode_item.h"
28#include "xfs_ialloc.h"
29#include "xfs_bmap.h"
30#include "xfs_bmap_util.h"
31#include "xfs_errortag.h"
32#include "xfs_error.h"
33#include "xfs_quota.h"
34#include "xfs_filestream.h"
35#include "xfs_cksum.h"
36#include "xfs_trace.h"
37#include "xfs_icache.h"
38#include "xfs_symlink.h"
39#include "xfs_trans_priv.h"
40#include "xfs_log.h"
41#include "xfs_bmap_btree.h"
42#include "xfs_reflink.h"
43#include "xfs_dir2_priv.h"
44
45kmem_zone_t *xfs_inode_zone;
46
47
48
49
50
51#define XFS_ITRUNC_MAX_EXTENTS 2
52
53STATIC int xfs_iflush_int(struct xfs_inode *, struct xfs_buf *);
54STATIC int xfs_iunlink(struct xfs_trans *, struct xfs_inode *);
55STATIC int xfs_iunlink_remove(struct xfs_trans *, struct xfs_inode *);
56
57
58
59
60xfs_extlen_t
61xfs_get_extsz_hint(
62 struct xfs_inode *ip)
63{
64 if ((ip->i_d.di_flags & XFS_DIFLAG_EXTSIZE) && ip->i_d.di_extsize)
65 return ip->i_d.di_extsize;
66 if (XFS_IS_REALTIME_INODE(ip))
67 return ip->i_mount->m_sb.sb_rextsize;
68 return 0;
69}
70
71
72
73
74
75
76
77xfs_extlen_t
78xfs_get_cowextsz_hint(
79 struct xfs_inode *ip)
80{
81 xfs_extlen_t a, b;
82
83 a = 0;
84 if (ip->i_d.di_flags2 & XFS_DIFLAG2_COWEXTSIZE)
85 a = ip->i_d.di_cowextsize;
86 b = xfs_get_extsz_hint(ip);
87
88 a = max(a, b);
89 if (a == 0)
90 return XFS_DEFAULT_COWEXTSZ_HINT;
91 return a;
92}
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109uint
110xfs_ilock_data_map_shared(
111 struct xfs_inode *ip)
112{
113 uint lock_mode = XFS_ILOCK_SHARED;
114
115 if (ip->i_d.di_format == XFS_DINODE_FMT_BTREE &&
116 (ip->i_df.if_flags & XFS_IFEXTENTS) == 0)
117 lock_mode = XFS_ILOCK_EXCL;
118 xfs_ilock(ip, lock_mode);
119 return lock_mode;
120}
121
122uint
123xfs_ilock_attr_map_shared(
124 struct xfs_inode *ip)
125{
126 uint lock_mode = XFS_ILOCK_SHARED;
127
128 if (ip->i_d.di_aformat == XFS_DINODE_FMT_BTREE &&
129 (ip->i_afp->if_flags & XFS_IFEXTENTS) == 0)
130 lock_mode = XFS_ILOCK_EXCL;
131 xfs_ilock(ip, lock_mode);
132 return lock_mode;
133}
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165void
166xfs_ilock(
167 xfs_inode_t *ip,
168 uint lock_flags)
169{
170 trace_xfs_ilock(ip, lock_flags, _RET_IP_);
171
172
173
174
175
176
177 ASSERT((lock_flags & (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)) !=
178 (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL));
179 ASSERT((lock_flags & (XFS_MMAPLOCK_SHARED | XFS_MMAPLOCK_EXCL)) !=
180 (XFS_MMAPLOCK_SHARED | XFS_MMAPLOCK_EXCL));
181 ASSERT((lock_flags & (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)) !=
182 (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL));
183 ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_SUBCLASS_MASK)) == 0);
184
185 if (lock_flags & XFS_IOLOCK_EXCL) {
186 down_write_nested(&VFS_I(ip)->i_rwsem,
187 XFS_IOLOCK_DEP(lock_flags));
188 } else if (lock_flags & XFS_IOLOCK_SHARED) {
189 down_read_nested(&VFS_I(ip)->i_rwsem,
190 XFS_IOLOCK_DEP(lock_flags));
191 }
192
193 if (lock_flags & XFS_MMAPLOCK_EXCL)
194 mrupdate_nested(&ip->i_mmaplock, XFS_MMAPLOCK_DEP(lock_flags));
195 else if (lock_flags & XFS_MMAPLOCK_SHARED)
196 mraccess_nested(&ip->i_mmaplock, XFS_MMAPLOCK_DEP(lock_flags));
197
198 if (lock_flags & XFS_ILOCK_EXCL)
199 mrupdate_nested(&ip->i_lock, XFS_ILOCK_DEP(lock_flags));
200 else if (lock_flags & XFS_ILOCK_SHARED)
201 mraccess_nested(&ip->i_lock, XFS_ILOCK_DEP(lock_flags));
202}
203
204
205
206
207
208
209
210
211
212
213
214
215
216int
217xfs_ilock_nowait(
218 xfs_inode_t *ip,
219 uint lock_flags)
220{
221 trace_xfs_ilock_nowait(ip, lock_flags, _RET_IP_);
222
223
224
225
226
227
228 ASSERT((lock_flags & (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)) !=
229 (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL));
230 ASSERT((lock_flags & (XFS_MMAPLOCK_SHARED | XFS_MMAPLOCK_EXCL)) !=
231 (XFS_MMAPLOCK_SHARED | XFS_MMAPLOCK_EXCL));
232 ASSERT((lock_flags & (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)) !=
233 (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL));
234 ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_SUBCLASS_MASK)) == 0);
235
236 if (lock_flags & XFS_IOLOCK_EXCL) {
237 if (!down_write_trylock(&VFS_I(ip)->i_rwsem))
238 goto out;
239 } else if (lock_flags & XFS_IOLOCK_SHARED) {
240 if (!down_read_trylock(&VFS_I(ip)->i_rwsem))
241 goto out;
242 }
243
244 if (lock_flags & XFS_MMAPLOCK_EXCL) {
245 if (!mrtryupdate(&ip->i_mmaplock))
246 goto out_undo_iolock;
247 } else if (lock_flags & XFS_MMAPLOCK_SHARED) {
248 if (!mrtryaccess(&ip->i_mmaplock))
249 goto out_undo_iolock;
250 }
251
252 if (lock_flags & XFS_ILOCK_EXCL) {
253 if (!mrtryupdate(&ip->i_lock))
254 goto out_undo_mmaplock;
255 } else if (lock_flags & XFS_ILOCK_SHARED) {
256 if (!mrtryaccess(&ip->i_lock))
257 goto out_undo_mmaplock;
258 }
259 return 1;
260
261out_undo_mmaplock:
262 if (lock_flags & XFS_MMAPLOCK_EXCL)
263 mrunlock_excl(&ip->i_mmaplock);
264 else if (lock_flags & XFS_MMAPLOCK_SHARED)
265 mrunlock_shared(&ip->i_mmaplock);
266out_undo_iolock:
267 if (lock_flags & XFS_IOLOCK_EXCL)
268 up_write(&VFS_I(ip)->i_rwsem);
269 else if (lock_flags & XFS_IOLOCK_SHARED)
270 up_read(&VFS_I(ip)->i_rwsem);
271out:
272 return 0;
273}
274
275
276
277
278
279
280
281
282
283
284
285
286
287void
288xfs_iunlock(
289 xfs_inode_t *ip,
290 uint lock_flags)
291{
292
293
294
295
296
297 ASSERT((lock_flags & (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)) !=
298 (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL));
299 ASSERT((lock_flags & (XFS_MMAPLOCK_SHARED | XFS_MMAPLOCK_EXCL)) !=
300 (XFS_MMAPLOCK_SHARED | XFS_MMAPLOCK_EXCL));
301 ASSERT((lock_flags & (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)) !=
302 (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL));
303 ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_SUBCLASS_MASK)) == 0);
304 ASSERT(lock_flags != 0);
305
306 if (lock_flags & XFS_IOLOCK_EXCL)
307 up_write(&VFS_I(ip)->i_rwsem);
308 else if (lock_flags & XFS_IOLOCK_SHARED)
309 up_read(&VFS_I(ip)->i_rwsem);
310
311 if (lock_flags & XFS_MMAPLOCK_EXCL)
312 mrunlock_excl(&ip->i_mmaplock);
313 else if (lock_flags & XFS_MMAPLOCK_SHARED)
314 mrunlock_shared(&ip->i_mmaplock);
315
316 if (lock_flags & XFS_ILOCK_EXCL)
317 mrunlock_excl(&ip->i_lock);
318 else if (lock_flags & XFS_ILOCK_SHARED)
319 mrunlock_shared(&ip->i_lock);
320
321 trace_xfs_iunlock(ip, lock_flags, _RET_IP_);
322}
323
324
325
326
327
328void
329xfs_ilock_demote(
330 xfs_inode_t *ip,
331 uint lock_flags)
332{
333 ASSERT(lock_flags & (XFS_IOLOCK_EXCL|XFS_MMAPLOCK_EXCL|XFS_ILOCK_EXCL));
334 ASSERT((lock_flags &
335 ~(XFS_IOLOCK_EXCL|XFS_MMAPLOCK_EXCL|XFS_ILOCK_EXCL)) == 0);
336
337 if (lock_flags & XFS_ILOCK_EXCL)
338 mrdemote(&ip->i_lock);
339 if (lock_flags & XFS_MMAPLOCK_EXCL)
340 mrdemote(&ip->i_mmaplock);
341 if (lock_flags & XFS_IOLOCK_EXCL)
342 downgrade_write(&VFS_I(ip)->i_rwsem);
343
344 trace_xfs_ilock_demote(ip, lock_flags, _RET_IP_);
345}
346
347#if defined(DEBUG) || defined(XFS_WARN)
348int
349xfs_isilocked(
350 xfs_inode_t *ip,
351 uint lock_flags)
352{
353 if (lock_flags & (XFS_ILOCK_EXCL|XFS_ILOCK_SHARED)) {
354 if (!(lock_flags & XFS_ILOCK_SHARED))
355 return !!ip->i_lock.mr_writer;
356 return rwsem_is_locked(&ip->i_lock.mr_lock);
357 }
358
359 if (lock_flags & (XFS_MMAPLOCK_EXCL|XFS_MMAPLOCK_SHARED)) {
360 if (!(lock_flags & XFS_MMAPLOCK_SHARED))
361 return !!ip->i_mmaplock.mr_writer;
362 return rwsem_is_locked(&ip->i_mmaplock.mr_lock);
363 }
364
365 if (lock_flags & (XFS_IOLOCK_EXCL|XFS_IOLOCK_SHARED)) {
366 if (!(lock_flags & XFS_IOLOCK_SHARED))
367 return !debug_locks ||
368 lockdep_is_held_type(&VFS_I(ip)->i_rwsem, 0);
369 return rwsem_is_locked(&VFS_I(ip)->i_rwsem);
370 }
371
372 ASSERT(0);
373 return 0;
374}
375#endif
376
377
378
379
380
381
382
383#if (defined(DEBUG) || defined(XFS_WARN)) && defined(CONFIG_LOCKDEP)
384static bool
385xfs_lockdep_subclass_ok(
386 int subclass)
387{
388 return subclass < MAX_LOCKDEP_SUBCLASSES;
389}
390#else
391#define xfs_lockdep_subclass_ok(subclass) (true)
392#endif
393
394
395
396
397
398
399
400static inline int
401xfs_lock_inumorder(int lock_mode, int subclass)
402{
403 int class = 0;
404
405 ASSERT(!(lock_mode & (XFS_ILOCK_PARENT | XFS_ILOCK_RTBITMAP |
406 XFS_ILOCK_RTSUM)));
407 ASSERT(xfs_lockdep_subclass_ok(subclass));
408
409 if (lock_mode & (XFS_IOLOCK_SHARED|XFS_IOLOCK_EXCL)) {
410 ASSERT(subclass <= XFS_IOLOCK_MAX_SUBCLASS);
411 class += subclass << XFS_IOLOCK_SHIFT;
412 }
413
414 if (lock_mode & (XFS_MMAPLOCK_SHARED|XFS_MMAPLOCK_EXCL)) {
415 ASSERT(subclass <= XFS_MMAPLOCK_MAX_SUBCLASS);
416 class += subclass << XFS_MMAPLOCK_SHIFT;
417 }
418
419 if (lock_mode & (XFS_ILOCK_SHARED|XFS_ILOCK_EXCL)) {
420 ASSERT(subclass <= XFS_ILOCK_MAX_SUBCLASS);
421 class += subclass << XFS_ILOCK_SHIFT;
422 }
423
424 return (lock_mode & ~XFS_LOCK_SUBCLASS_MASK) | class;
425}
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442static void
443xfs_lock_inodes(
444 xfs_inode_t **ips,
445 int inodes,
446 uint lock_mode)
447{
448 int attempts = 0, i, j, try_lock;
449 xfs_log_item_t *lp;
450
451
452
453
454
455
456
457
458 ASSERT(ips && inodes >= 2 && inodes <= 5);
459 ASSERT(lock_mode & (XFS_IOLOCK_EXCL | XFS_MMAPLOCK_EXCL |
460 XFS_ILOCK_EXCL));
461 ASSERT(!(lock_mode & (XFS_IOLOCK_SHARED | XFS_MMAPLOCK_SHARED |
462 XFS_ILOCK_SHARED)));
463 ASSERT(!(lock_mode & XFS_MMAPLOCK_EXCL) ||
464 inodes <= XFS_MMAPLOCK_MAX_SUBCLASS + 1);
465 ASSERT(!(lock_mode & XFS_ILOCK_EXCL) ||
466 inodes <= XFS_ILOCK_MAX_SUBCLASS + 1);
467
468 if (lock_mode & XFS_IOLOCK_EXCL) {
469 ASSERT(!(lock_mode & (XFS_MMAPLOCK_EXCL | XFS_ILOCK_EXCL)));
470 } else if (lock_mode & XFS_MMAPLOCK_EXCL)
471 ASSERT(!(lock_mode & XFS_ILOCK_EXCL));
472
473 try_lock = 0;
474 i = 0;
475again:
476 for (; i < inodes; i++) {
477 ASSERT(ips[i]);
478
479 if (i && (ips[i] == ips[i - 1]))
480 continue;
481
482
483
484
485
486 if (!try_lock) {
487 for (j = (i - 1); j >= 0 && !try_lock; j--) {
488 lp = (xfs_log_item_t *)ips[j]->i_itemp;
489 if (lp && test_bit(XFS_LI_IN_AIL, &lp->li_flags))
490 try_lock++;
491 }
492 }
493
494
495
496
497
498
499
500 if (!try_lock) {
501 xfs_ilock(ips[i], xfs_lock_inumorder(lock_mode, i));
502 continue;
503 }
504
505
506 ASSERT(i != 0);
507 if (xfs_ilock_nowait(ips[i], xfs_lock_inumorder(lock_mode, i)))
508 continue;
509
510
511
512
513
514 attempts++;
515 for (j = i - 1; j >= 0; j--) {
516
517
518
519
520
521 if (j != (i - 1) && ips[j] == ips[j + 1])
522 continue;
523
524 xfs_iunlock(ips[j], lock_mode);
525 }
526
527 if ((attempts % 5) == 0) {
528 delay(1);
529 }
530 i = 0;
531 try_lock = 0;
532 goto again;
533 }
534}
535
536
537
538
539
540
541
542
543
544void
545xfs_lock_two_inodes(
546 struct xfs_inode *ip0,
547 uint ip0_mode,
548 struct xfs_inode *ip1,
549 uint ip1_mode)
550{
551 struct xfs_inode *temp;
552 uint mode_temp;
553 int attempts = 0;
554 xfs_log_item_t *lp;
555
556 ASSERT(hweight32(ip0_mode) == 1);
557 ASSERT(hweight32(ip1_mode) == 1);
558 ASSERT(!(ip0_mode & (XFS_IOLOCK_SHARED|XFS_IOLOCK_EXCL)));
559 ASSERT(!(ip1_mode & (XFS_IOLOCK_SHARED|XFS_IOLOCK_EXCL)));
560 ASSERT(!(ip0_mode & (XFS_MMAPLOCK_SHARED|XFS_MMAPLOCK_EXCL)) ||
561 !(ip0_mode & (XFS_ILOCK_SHARED|XFS_ILOCK_EXCL)));
562 ASSERT(!(ip1_mode & (XFS_MMAPLOCK_SHARED|XFS_MMAPLOCK_EXCL)) ||
563 !(ip1_mode & (XFS_ILOCK_SHARED|XFS_ILOCK_EXCL)));
564 ASSERT(!(ip1_mode & (XFS_MMAPLOCK_SHARED|XFS_MMAPLOCK_EXCL)) ||
565 !(ip0_mode & (XFS_ILOCK_SHARED|XFS_ILOCK_EXCL)));
566 ASSERT(!(ip0_mode & (XFS_MMAPLOCK_SHARED|XFS_MMAPLOCK_EXCL)) ||
567 !(ip1_mode & (XFS_ILOCK_SHARED|XFS_ILOCK_EXCL)));
568
569 ASSERT(ip0->i_ino != ip1->i_ino);
570
571 if (ip0->i_ino > ip1->i_ino) {
572 temp = ip0;
573 ip0 = ip1;
574 ip1 = temp;
575 mode_temp = ip0_mode;
576 ip0_mode = ip1_mode;
577 ip1_mode = mode_temp;
578 }
579
580 again:
581 xfs_ilock(ip0, xfs_lock_inumorder(ip0_mode, 0));
582
583
584
585
586
587
588 lp = (xfs_log_item_t *)ip0->i_itemp;
589 if (lp && test_bit(XFS_LI_IN_AIL, &lp->li_flags)) {
590 if (!xfs_ilock_nowait(ip1, xfs_lock_inumorder(ip1_mode, 1))) {
591 xfs_iunlock(ip0, ip0_mode);
592 if ((++attempts % 5) == 0)
593 delay(1);
594 goto again;
595 }
596 } else {
597 xfs_ilock(ip1, xfs_lock_inumorder(ip1_mode, 1));
598 }
599}
600
601void
602__xfs_iflock(
603 struct xfs_inode *ip)
604{
605 wait_queue_head_t *wq = bit_waitqueue(&ip->i_flags, __XFS_IFLOCK_BIT);
606 DEFINE_WAIT_BIT(wait, &ip->i_flags, __XFS_IFLOCK_BIT);
607
608 do {
609 prepare_to_wait_exclusive(wq, &wait.wq_entry, TASK_UNINTERRUPTIBLE);
610 if (xfs_isiflocked(ip))
611 io_schedule();
612 } while (!xfs_iflock_nowait(ip));
613
614 finish_wait(wq, &wait.wq_entry);
615}
616
617STATIC uint
618_xfs_dic2xflags(
619 uint16_t di_flags,
620 uint64_t di_flags2,
621 bool has_attr)
622{
623 uint flags = 0;
624
625 if (di_flags & XFS_DIFLAG_ANY) {
626 if (di_flags & XFS_DIFLAG_REALTIME)
627 flags |= FS_XFLAG_REALTIME;
628 if (di_flags & XFS_DIFLAG_PREALLOC)
629 flags |= FS_XFLAG_PREALLOC;
630 if (di_flags & XFS_DIFLAG_IMMUTABLE)
631 flags |= FS_XFLAG_IMMUTABLE;
632 if (di_flags & XFS_DIFLAG_APPEND)
633 flags |= FS_XFLAG_APPEND;
634 if (di_flags & XFS_DIFLAG_SYNC)
635 flags |= FS_XFLAG_SYNC;
636 if (di_flags & XFS_DIFLAG_NOATIME)
637 flags |= FS_XFLAG_NOATIME;
638 if (di_flags & XFS_DIFLAG_NODUMP)
639 flags |= FS_XFLAG_NODUMP;
640 if (di_flags & XFS_DIFLAG_RTINHERIT)
641 flags |= FS_XFLAG_RTINHERIT;
642 if (di_flags & XFS_DIFLAG_PROJINHERIT)
643 flags |= FS_XFLAG_PROJINHERIT;
644 if (di_flags & XFS_DIFLAG_NOSYMLINKS)
645 flags |= FS_XFLAG_NOSYMLINKS;
646 if (di_flags & XFS_DIFLAG_EXTSIZE)
647 flags |= FS_XFLAG_EXTSIZE;
648 if (di_flags & XFS_DIFLAG_EXTSZINHERIT)
649 flags |= FS_XFLAG_EXTSZINHERIT;
650 if (di_flags & XFS_DIFLAG_NODEFRAG)
651 flags |= FS_XFLAG_NODEFRAG;
652 if (di_flags & XFS_DIFLAG_FILESTREAM)
653 flags |= FS_XFLAG_FILESTREAM;
654 }
655
656 if (di_flags2 & XFS_DIFLAG2_ANY) {
657 if (di_flags2 & XFS_DIFLAG2_DAX)
658 flags |= FS_XFLAG_DAX;
659 if (di_flags2 & XFS_DIFLAG2_COWEXTSIZE)
660 flags |= FS_XFLAG_COWEXTSIZE;
661 }
662
663 if (has_attr)
664 flags |= FS_XFLAG_HASATTR;
665
666 return flags;
667}
668
669uint
670xfs_ip2xflags(
671 struct xfs_inode *ip)
672{
673 struct xfs_icdinode *dic = &ip->i_d;
674
675 return _xfs_dic2xflags(dic->di_flags, dic->di_flags2, XFS_IFORK_Q(ip));
676}
677
678
679
680
681
682
683
684int
685xfs_lookup(
686 xfs_inode_t *dp,
687 struct xfs_name *name,
688 xfs_inode_t **ipp,
689 struct xfs_name *ci_name)
690{
691 xfs_ino_t inum;
692 int error;
693
694 trace_xfs_lookup(dp, name);
695
696 if (XFS_FORCED_SHUTDOWN(dp->i_mount))
697 return -EIO;
698
699 error = xfs_dir_lookup(NULL, dp, name, &inum, ci_name);
700 if (error)
701 goto out_unlock;
702
703 error = xfs_iget(dp->i_mount, NULL, inum, 0, 0, ipp);
704 if (error)
705 goto out_free_name;
706
707 return 0;
708
709out_free_name:
710 if (ci_name)
711 kmem_free(ci_name->name);
712out_unlock:
713 *ipp = NULL;
714 return error;
715}
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748static int
749xfs_ialloc(
750 xfs_trans_t *tp,
751 xfs_inode_t *pip,
752 umode_t mode,
753 xfs_nlink_t nlink,
754 dev_t rdev,
755 prid_t prid,
756 xfs_buf_t **ialloc_context,
757 xfs_inode_t **ipp)
758{
759 struct xfs_mount *mp = tp->t_mountp;
760 xfs_ino_t ino;
761 xfs_inode_t *ip;
762 uint flags;
763 int error;
764 struct timespec64 tv;
765 struct inode *inode;
766
767
768
769
770
771 error = xfs_dialloc(tp, pip ? pip->i_ino : 0, mode,
772 ialloc_context, &ino);
773 if (error)
774 return error;
775 if (*ialloc_context || ino == NULLFSINO) {
776 *ipp = NULL;
777 return 0;
778 }
779 ASSERT(*ialloc_context == NULL);
780
781
782
783
784
785
786
787
788 if ((pip && ino == pip->i_ino) || !xfs_verify_dir_ino(mp, ino)) {
789 xfs_alert(mp, "Allocated a known in-use inode 0x%llx!", ino);
790 return -EFSCORRUPTED;
791 }
792
793
794
795
796
797
798 error = xfs_iget(mp, tp, ino, XFS_IGET_CREATE,
799 XFS_ILOCK_EXCL, &ip);
800 if (error)
801 return error;
802 ASSERT(ip != NULL);
803 inode = VFS_I(ip);
804
805
806
807
808
809
810 if (ip->i_d.di_version == 1)
811 ip->i_d.di_version = 2;
812
813 inode->i_mode = mode;
814 set_nlink(inode, nlink);
815 ip->i_d.di_uid = xfs_kuid_to_uid(current_fsuid());
816 ip->i_d.di_gid = xfs_kgid_to_gid(current_fsgid());
817 inode->i_rdev = rdev;
818 xfs_set_projid(ip, prid);
819
820 if (pip && XFS_INHERIT_GID(pip)) {
821 ip->i_d.di_gid = pip->i_d.di_gid;
822 if ((VFS_I(pip)->i_mode & S_ISGID) && S_ISDIR(mode))
823 inode->i_mode |= S_ISGID;
824 }
825
826
827
828
829
830
831 if ((irix_sgid_inherit) &&
832 (inode->i_mode & S_ISGID) &&
833 (!in_group_p(xfs_gid_to_kgid(ip->i_d.di_gid))))
834 inode->i_mode &= ~S_ISGID;
835
836 ip->i_d.di_size = 0;
837 ip->i_d.di_nextents = 0;
838 ASSERT(ip->i_d.di_nblocks == 0);
839
840 tv = current_time(inode);
841 inode->i_mtime = tv;
842 inode->i_atime = tv;
843 inode->i_ctime = tv;
844
845 ip->i_d.di_extsize = 0;
846 ip->i_d.di_dmevmask = 0;
847 ip->i_d.di_dmstate = 0;
848 ip->i_d.di_flags = 0;
849
850 if (ip->i_d.di_version == 3) {
851 inode_set_iversion(inode, 1);
852 ip->i_d.di_flags2 = 0;
853 ip->i_d.di_cowextsize = 0;
854 ip->i_d.di_crtime.t_sec = (int32_t)tv.tv_sec;
855 ip->i_d.di_crtime.t_nsec = (int32_t)tv.tv_nsec;
856 }
857
858
859 flags = XFS_ILOG_CORE;
860 switch (mode & S_IFMT) {
861 case S_IFIFO:
862 case S_IFCHR:
863 case S_IFBLK:
864 case S_IFSOCK:
865 ip->i_d.di_format = XFS_DINODE_FMT_DEV;
866 ip->i_df.if_flags = 0;
867 flags |= XFS_ILOG_DEV;
868 break;
869 case S_IFREG:
870 case S_IFDIR:
871 if (pip && (pip->i_d.di_flags & XFS_DIFLAG_ANY)) {
872 uint di_flags = 0;
873
874 if (S_ISDIR(mode)) {
875 if (pip->i_d.di_flags & XFS_DIFLAG_RTINHERIT)
876 di_flags |= XFS_DIFLAG_RTINHERIT;
877 if (pip->i_d.di_flags & XFS_DIFLAG_EXTSZINHERIT) {
878 di_flags |= XFS_DIFLAG_EXTSZINHERIT;
879 ip->i_d.di_extsize = pip->i_d.di_extsize;
880 }
881 if (pip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT)
882 di_flags |= XFS_DIFLAG_PROJINHERIT;
883 } else if (S_ISREG(mode)) {
884 if (pip->i_d.di_flags & XFS_DIFLAG_RTINHERIT)
885 di_flags |= XFS_DIFLAG_REALTIME;
886 if (pip->i_d.di_flags & XFS_DIFLAG_EXTSZINHERIT) {
887 di_flags |= XFS_DIFLAG_EXTSIZE;
888 ip->i_d.di_extsize = pip->i_d.di_extsize;
889 }
890 }
891 if ((pip->i_d.di_flags & XFS_DIFLAG_NOATIME) &&
892 xfs_inherit_noatime)
893 di_flags |= XFS_DIFLAG_NOATIME;
894 if ((pip->i_d.di_flags & XFS_DIFLAG_NODUMP) &&
895 xfs_inherit_nodump)
896 di_flags |= XFS_DIFLAG_NODUMP;
897 if ((pip->i_d.di_flags & XFS_DIFLAG_SYNC) &&
898 xfs_inherit_sync)
899 di_flags |= XFS_DIFLAG_SYNC;
900 if ((pip->i_d.di_flags & XFS_DIFLAG_NOSYMLINKS) &&
901 xfs_inherit_nosymlinks)
902 di_flags |= XFS_DIFLAG_NOSYMLINKS;
903 if ((pip->i_d.di_flags & XFS_DIFLAG_NODEFRAG) &&
904 xfs_inherit_nodefrag)
905 di_flags |= XFS_DIFLAG_NODEFRAG;
906 if (pip->i_d.di_flags & XFS_DIFLAG_FILESTREAM)
907 di_flags |= XFS_DIFLAG_FILESTREAM;
908
909 ip->i_d.di_flags |= di_flags;
910 }
911 if (pip &&
912 (pip->i_d.di_flags2 & XFS_DIFLAG2_ANY) &&
913 pip->i_d.di_version == 3 &&
914 ip->i_d.di_version == 3) {
915 uint64_t di_flags2 = 0;
916
917 if (pip->i_d.di_flags2 & XFS_DIFLAG2_COWEXTSIZE) {
918 di_flags2 |= XFS_DIFLAG2_COWEXTSIZE;
919 ip->i_d.di_cowextsize = pip->i_d.di_cowextsize;
920 }
921 if (pip->i_d.di_flags2 & XFS_DIFLAG2_DAX)
922 di_flags2 |= XFS_DIFLAG2_DAX;
923
924 ip->i_d.di_flags2 |= di_flags2;
925 }
926
927 case S_IFLNK:
928 ip->i_d.di_format = XFS_DINODE_FMT_EXTENTS;
929 ip->i_df.if_flags = XFS_IFEXTENTS;
930 ip->i_df.if_bytes = 0;
931 ip->i_df.if_u1.if_root = NULL;
932 break;
933 default:
934 ASSERT(0);
935 }
936
937
938
939 ip->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS;
940 ip->i_d.di_anextents = 0;
941
942
943
944
945 xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
946 xfs_trans_log_inode(tp, ip, flags);
947
948
949 xfs_setup_inode(ip);
950
951 *ipp = ip;
952 return 0;
953}
954
955
956
957
958
959
960
961
962
963
964
965int
966xfs_dir_ialloc(
967 xfs_trans_t **tpp,
968
969 xfs_inode_t *dp,
970
971 umode_t mode,
972 xfs_nlink_t nlink,
973 dev_t rdev,
974 prid_t prid,
975 xfs_inode_t **ipp)
976
977{
978 xfs_trans_t *tp;
979 xfs_inode_t *ip;
980 xfs_buf_t *ialloc_context = NULL;
981 int code;
982 void *dqinfo;
983 uint tflags;
984
985 tp = *tpp;
986 ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES);
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003 code = xfs_ialloc(tp, dp, mode, nlink, rdev, prid, &ialloc_context,
1004 &ip);
1005
1006
1007
1008
1009
1010
1011 if (code) {
1012 *ipp = NULL;
1013 return code;
1014 }
1015 if (!ialloc_context && !ip) {
1016 *ipp = NULL;
1017 return -ENOSPC;
1018 }
1019
1020
1021
1022
1023
1024
1025
1026 if (ialloc_context) {
1027
1028
1029
1030
1031
1032
1033
1034 xfs_trans_bhold(tp, ialloc_context);
1035
1036
1037
1038
1039
1040
1041 dqinfo = NULL;
1042 tflags = 0;
1043 if (tp->t_dqinfo) {
1044 dqinfo = (void *)tp->t_dqinfo;
1045 tp->t_dqinfo = NULL;
1046 tflags = tp->t_flags & XFS_TRANS_DQ_DIRTY;
1047 tp->t_flags &= ~(XFS_TRANS_DQ_DIRTY);
1048 }
1049
1050 code = xfs_trans_roll(&tp);
1051
1052
1053
1054
1055 if (dqinfo) {
1056 tp->t_dqinfo = dqinfo;
1057 tp->t_flags |= tflags;
1058 }
1059
1060 if (code) {
1061 xfs_buf_relse(ialloc_context);
1062 *tpp = tp;
1063 *ipp = NULL;
1064 return code;
1065 }
1066 xfs_trans_bjoin(tp, ialloc_context);
1067
1068
1069
1070
1071
1072
1073 code = xfs_ialloc(tp, dp, mode, nlink, rdev, prid,
1074 &ialloc_context, &ip);
1075
1076
1077
1078
1079
1080 if (code) {
1081 *tpp = tp;
1082 *ipp = NULL;
1083 return code;
1084 }
1085 ASSERT(!ialloc_context && ip);
1086
1087 }
1088
1089 *ipp = ip;
1090 *tpp = tp;
1091
1092 return 0;
1093}
1094
1095
1096
1097
1098
1099
1100static int
1101xfs_droplink(
1102 xfs_trans_t *tp,
1103 xfs_inode_t *ip)
1104{
1105 xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_CHG);
1106
1107 drop_nlink(VFS_I(ip));
1108 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
1109
1110 if (VFS_I(ip)->i_nlink)
1111 return 0;
1112
1113 return xfs_iunlink(tp, ip);
1114}
1115
1116
1117
1118
1119static int
1120xfs_bumplink(
1121 xfs_trans_t *tp,
1122 xfs_inode_t *ip)
1123{
1124 xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_CHG);
1125
1126 ASSERT(ip->i_d.di_version > 1);
1127 inc_nlink(VFS_I(ip));
1128 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
1129 return 0;
1130}
1131
1132int
1133xfs_create(
1134 xfs_inode_t *dp,
1135 struct xfs_name *name,
1136 umode_t mode,
1137 dev_t rdev,
1138 xfs_inode_t **ipp)
1139{
1140 int is_dir = S_ISDIR(mode);
1141 struct xfs_mount *mp = dp->i_mount;
1142 struct xfs_inode *ip = NULL;
1143 struct xfs_trans *tp = NULL;
1144 int error;
1145 bool unlock_dp_on_error = false;
1146 prid_t prid;
1147 struct xfs_dquot *udqp = NULL;
1148 struct xfs_dquot *gdqp = NULL;
1149 struct xfs_dquot *pdqp = NULL;
1150 struct xfs_trans_res *tres;
1151 uint resblks;
1152
1153 trace_xfs_create(dp, name);
1154
1155 if (XFS_FORCED_SHUTDOWN(mp))
1156 return -EIO;
1157
1158 prid = xfs_get_initial_prid(dp);
1159
1160
1161
1162
1163 error = xfs_qm_vop_dqalloc(dp, xfs_kuid_to_uid(current_fsuid()),
1164 xfs_kgid_to_gid(current_fsgid()), prid,
1165 XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT,
1166 &udqp, &gdqp, &pdqp);
1167 if (error)
1168 return error;
1169
1170 if (is_dir) {
1171 resblks = XFS_MKDIR_SPACE_RES(mp, name->len);
1172 tres = &M_RES(mp)->tr_mkdir;
1173 } else {
1174 resblks = XFS_CREATE_SPACE_RES(mp, name->len);
1175 tres = &M_RES(mp)->tr_create;
1176 }
1177
1178
1179
1180
1181
1182
1183
1184 error = xfs_trans_alloc(mp, tres, resblks, 0, 0, &tp);
1185 if (error == -ENOSPC) {
1186
1187 xfs_flush_inodes(mp);
1188 error = xfs_trans_alloc(mp, tres, resblks, 0, 0, &tp);
1189 }
1190 if (error)
1191 goto out_release_inode;
1192
1193 xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT);
1194 unlock_dp_on_error = true;
1195
1196
1197
1198
1199 error = xfs_trans_reserve_quota(tp, mp, udqp, gdqp,
1200 pdqp, resblks, 1, 0);
1201 if (error)
1202 goto out_trans_cancel;
1203
1204
1205
1206
1207
1208
1209 error = xfs_dir_ialloc(&tp, dp, mode, is_dir ? 2 : 1, rdev, prid, &ip);
1210 if (error)
1211 goto out_trans_cancel;
1212
1213
1214
1215
1216
1217
1218
1219
1220 xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL);
1221 unlock_dp_on_error = false;
1222
1223 error = xfs_dir_createname(tp, dp, name, ip->i_ino,
1224 resblks ?
1225 resblks - XFS_IALLOC_SPACE_RES(mp) : 0);
1226 if (error) {
1227 ASSERT(error != -ENOSPC);
1228 goto out_trans_cancel;
1229 }
1230 xfs_trans_ichgtime(tp, dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
1231 xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE);
1232
1233 if (is_dir) {
1234 error = xfs_dir_init(tp, ip, dp);
1235 if (error)
1236 goto out_trans_cancel;
1237
1238 error = xfs_bumplink(tp, dp);
1239 if (error)
1240 goto out_trans_cancel;
1241 }
1242
1243
1244
1245
1246
1247
1248 if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC))
1249 xfs_trans_set_sync(tp);
1250
1251
1252
1253
1254
1255
1256 xfs_qm_vop_create_dqattach(tp, ip, udqp, gdqp, pdqp);
1257
1258 error = xfs_trans_commit(tp);
1259 if (error)
1260 goto out_release_inode;
1261
1262 xfs_qm_dqrele(udqp);
1263 xfs_qm_dqrele(gdqp);
1264 xfs_qm_dqrele(pdqp);
1265
1266 *ipp = ip;
1267 return 0;
1268
1269 out_trans_cancel:
1270 xfs_trans_cancel(tp);
1271 out_release_inode:
1272
1273
1274
1275
1276
1277 if (ip) {
1278 xfs_finish_inode_setup(ip);
1279 xfs_irele(ip);
1280 }
1281
1282 xfs_qm_dqrele(udqp);
1283 xfs_qm_dqrele(gdqp);
1284 xfs_qm_dqrele(pdqp);
1285
1286 if (unlock_dp_on_error)
1287 xfs_iunlock(dp, XFS_ILOCK_EXCL);
1288 return error;
1289}
1290
1291int
1292xfs_create_tmpfile(
1293 struct xfs_inode *dp,
1294 umode_t mode,
1295 struct xfs_inode **ipp)
1296{
1297 struct xfs_mount *mp = dp->i_mount;
1298 struct xfs_inode *ip = NULL;
1299 struct xfs_trans *tp = NULL;
1300 int error;
1301 prid_t prid;
1302 struct xfs_dquot *udqp = NULL;
1303 struct xfs_dquot *gdqp = NULL;
1304 struct xfs_dquot *pdqp = NULL;
1305 struct xfs_trans_res *tres;
1306 uint resblks;
1307
1308 if (XFS_FORCED_SHUTDOWN(mp))
1309 return -EIO;
1310
1311 prid = xfs_get_initial_prid(dp);
1312
1313
1314
1315
1316 error = xfs_qm_vop_dqalloc(dp, xfs_kuid_to_uid(current_fsuid()),
1317 xfs_kgid_to_gid(current_fsgid()), prid,
1318 XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT,
1319 &udqp, &gdqp, &pdqp);
1320 if (error)
1321 return error;
1322
1323 resblks = XFS_IALLOC_SPACE_RES(mp);
1324 tres = &M_RES(mp)->tr_create_tmpfile;
1325
1326 error = xfs_trans_alloc(mp, tres, resblks, 0, 0, &tp);
1327 if (error)
1328 goto out_release_inode;
1329
1330 error = xfs_trans_reserve_quota(tp, mp, udqp, gdqp,
1331 pdqp, resblks, 1, 0);
1332 if (error)
1333 goto out_trans_cancel;
1334
1335 error = xfs_dir_ialloc(&tp, dp, mode, 1, 0, prid, &ip);
1336 if (error)
1337 goto out_trans_cancel;
1338
1339 if (mp->m_flags & XFS_MOUNT_WSYNC)
1340 xfs_trans_set_sync(tp);
1341
1342
1343
1344
1345
1346
1347 xfs_qm_vop_create_dqattach(tp, ip, udqp, gdqp, pdqp);
1348
1349 error = xfs_iunlink(tp, ip);
1350 if (error)
1351 goto out_trans_cancel;
1352
1353 error = xfs_trans_commit(tp);
1354 if (error)
1355 goto out_release_inode;
1356
1357 xfs_qm_dqrele(udqp);
1358 xfs_qm_dqrele(gdqp);
1359 xfs_qm_dqrele(pdqp);
1360
1361 *ipp = ip;
1362 return 0;
1363
1364 out_trans_cancel:
1365 xfs_trans_cancel(tp);
1366 out_release_inode:
1367
1368
1369
1370
1371
1372 if (ip) {
1373 xfs_finish_inode_setup(ip);
1374 xfs_irele(ip);
1375 }
1376
1377 xfs_qm_dqrele(udqp);
1378 xfs_qm_dqrele(gdqp);
1379 xfs_qm_dqrele(pdqp);
1380
1381 return error;
1382}
1383
1384int
1385xfs_link(
1386 xfs_inode_t *tdp,
1387 xfs_inode_t *sip,
1388 struct xfs_name *target_name)
1389{
1390 xfs_mount_t *mp = tdp->i_mount;
1391 xfs_trans_t *tp;
1392 int error;
1393 int resblks;
1394
1395 trace_xfs_link(tdp, target_name);
1396
1397 ASSERT(!S_ISDIR(VFS_I(sip)->i_mode));
1398
1399 if (XFS_FORCED_SHUTDOWN(mp))
1400 return -EIO;
1401
1402 error = xfs_qm_dqattach(sip);
1403 if (error)
1404 goto std_return;
1405
1406 error = xfs_qm_dqattach(tdp);
1407 if (error)
1408 goto std_return;
1409
1410 resblks = XFS_LINK_SPACE_RES(mp, target_name->len);
1411 error = xfs_trans_alloc(mp, &M_RES(mp)->tr_link, resblks, 0, 0, &tp);
1412 if (error == -ENOSPC) {
1413 resblks = 0;
1414 error = xfs_trans_alloc(mp, &M_RES(mp)->tr_link, 0, 0, 0, &tp);
1415 }
1416 if (error)
1417 goto std_return;
1418
1419 xfs_lock_two_inodes(sip, XFS_ILOCK_EXCL, tdp, XFS_ILOCK_EXCL);
1420
1421 xfs_trans_ijoin(tp, sip, XFS_ILOCK_EXCL);
1422 xfs_trans_ijoin(tp, tdp, XFS_ILOCK_EXCL);
1423
1424
1425
1426
1427
1428
1429 if (unlikely((tdp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) &&
1430 (xfs_get_projid(tdp) != xfs_get_projid(sip)))) {
1431 error = -EXDEV;
1432 goto error_return;
1433 }
1434
1435 if (!resblks) {
1436 error = xfs_dir_canenter(tp, tdp, target_name);
1437 if (error)
1438 goto error_return;
1439 }
1440
1441
1442
1443
1444 if (VFS_I(sip)->i_nlink == 0) {
1445 error = xfs_iunlink_remove(tp, sip);
1446 if (error)
1447 goto error_return;
1448 }
1449
1450 error = xfs_dir_createname(tp, tdp, target_name, sip->i_ino,
1451 resblks);
1452 if (error)
1453 goto error_return;
1454 xfs_trans_ichgtime(tp, tdp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
1455 xfs_trans_log_inode(tp, tdp, XFS_ILOG_CORE);
1456
1457 error = xfs_bumplink(tp, sip);
1458 if (error)
1459 goto error_return;
1460
1461
1462
1463
1464
1465
1466 if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC))
1467 xfs_trans_set_sync(tp);
1468
1469 return xfs_trans_commit(tp);
1470
1471 error_return:
1472 xfs_trans_cancel(tp);
1473 std_return:
1474 return error;
1475}
1476
1477
1478static void
1479xfs_itruncate_clear_reflink_flags(
1480 struct xfs_inode *ip)
1481{
1482 struct xfs_ifork *dfork;
1483 struct xfs_ifork *cfork;
1484
1485 if (!xfs_is_reflink_inode(ip))
1486 return;
1487 dfork = XFS_IFORK_PTR(ip, XFS_DATA_FORK);
1488 cfork = XFS_IFORK_PTR(ip, XFS_COW_FORK);
1489 if (dfork->if_bytes == 0 && cfork->if_bytes == 0)
1490 ip->i_d.di_flags2 &= ~XFS_DIFLAG2_REFLINK;
1491 if (cfork->if_bytes == 0)
1492 xfs_inode_clear_cowblocks_tag(ip);
1493}
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516int
1517xfs_itruncate_extents_flags(
1518 struct xfs_trans **tpp,
1519 struct xfs_inode *ip,
1520 int whichfork,
1521 xfs_fsize_t new_size,
1522 int flags)
1523{
1524 struct xfs_mount *mp = ip->i_mount;
1525 struct xfs_trans *tp = *tpp;
1526 xfs_fileoff_t first_unmap_block;
1527 xfs_fileoff_t last_block;
1528 xfs_filblks_t unmap_len;
1529 int error = 0;
1530 int done = 0;
1531
1532 ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
1533 ASSERT(!atomic_read(&VFS_I(ip)->i_count) ||
1534 xfs_isilocked(ip, XFS_IOLOCK_EXCL));
1535 ASSERT(new_size <= XFS_ISIZE(ip));
1536 ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES);
1537 ASSERT(ip->i_itemp != NULL);
1538 ASSERT(ip->i_itemp->ili_lock_flags == 0);
1539 ASSERT(!XFS_NOT_DQATTACHED(mp, ip));
1540
1541 trace_xfs_itruncate_extents_start(ip, new_size);
1542
1543 flags |= xfs_bmapi_aflag(whichfork);
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554 first_unmap_block = XFS_B_TO_FSB(mp, (xfs_ufsize_t)new_size);
1555 last_block = XFS_B_TO_FSB(mp, mp->m_super->s_maxbytes);
1556 if (first_unmap_block == last_block)
1557 return 0;
1558
1559 ASSERT(first_unmap_block < last_block);
1560 unmap_len = last_block - first_unmap_block + 1;
1561 while (!done) {
1562 ASSERT(tp->t_firstblock == NULLFSBLOCK);
1563 error = xfs_bunmapi(tp, ip, first_unmap_block, unmap_len, flags,
1564 XFS_ITRUNC_MAX_EXTENTS, &done);
1565 if (error)
1566 goto out;
1567
1568
1569
1570
1571
1572 error = xfs_defer_finish(&tp);
1573 if (error)
1574 goto out;
1575
1576 error = xfs_trans_roll_inode(&tp, ip);
1577 if (error)
1578 goto out;
1579 }
1580
1581 if (whichfork == XFS_DATA_FORK) {
1582
1583 error = xfs_reflink_cancel_cow_blocks(ip, &tp,
1584 first_unmap_block, last_block, true);
1585 if (error)
1586 goto out;
1587
1588 xfs_itruncate_clear_reflink_flags(ip);
1589 }
1590
1591
1592
1593
1594
1595 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
1596
1597 trace_xfs_itruncate_extents_end(ip, new_size);
1598
1599out:
1600 *tpp = tp;
1601 return error;
1602}
1603
1604int
1605xfs_release(
1606 xfs_inode_t *ip)
1607{
1608 xfs_mount_t *mp = ip->i_mount;
1609 int error;
1610
1611 if (!S_ISREG(VFS_I(ip)->i_mode) || (VFS_I(ip)->i_mode == 0))
1612 return 0;
1613
1614
1615 if (mp->m_flags & XFS_MOUNT_RDONLY)
1616 return 0;
1617
1618 if (!XFS_FORCED_SHUTDOWN(mp)) {
1619 int truncated;
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631 truncated = xfs_iflags_test_and_clear(ip, XFS_ITRUNCATED);
1632 if (truncated) {
1633 xfs_iflags_clear(ip, XFS_IDIRTY_RELEASE);
1634 if (ip->i_delayed_blks > 0) {
1635 error = filemap_flush(VFS_I(ip)->i_mapping);
1636 if (error)
1637 return error;
1638 }
1639 }
1640 }
1641
1642 if (VFS_I(ip)->i_nlink == 0)
1643 return 0;
1644
1645 if (xfs_can_free_eofblocks(ip, false)) {
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661 if (xfs_iflags_test(ip, XFS_IDIRTY_RELEASE))
1662 return 0;
1663
1664
1665
1666
1667
1668
1669
1670 if (xfs_ilock_nowait(ip, XFS_IOLOCK_EXCL)) {
1671 error = xfs_free_eofblocks(ip);
1672 xfs_iunlock(ip, XFS_IOLOCK_EXCL);
1673 if (error)
1674 return error;
1675 }
1676
1677
1678 if (ip->i_delayed_blks)
1679 xfs_iflags_set(ip, XFS_IDIRTY_RELEASE);
1680 }
1681 return 0;
1682}
1683
1684
1685
1686
1687
1688
1689STATIC int
1690xfs_inactive_truncate(
1691 struct xfs_inode *ip)
1692{
1693 struct xfs_mount *mp = ip->i_mount;
1694 struct xfs_trans *tp;
1695 int error;
1696
1697 error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate, 0, 0, 0, &tp);
1698 if (error) {
1699 ASSERT(XFS_FORCED_SHUTDOWN(mp));
1700 return error;
1701 }
1702 xfs_ilock(ip, XFS_ILOCK_EXCL);
1703 xfs_trans_ijoin(tp, ip, 0);
1704
1705
1706
1707
1708
1709
1710 ip->i_d.di_size = 0;
1711 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
1712
1713 error = xfs_itruncate_extents(&tp, ip, XFS_DATA_FORK, 0);
1714 if (error)
1715 goto error_trans_cancel;
1716
1717 ASSERT(ip->i_d.di_nextents == 0);
1718
1719 error = xfs_trans_commit(tp);
1720 if (error)
1721 goto error_unlock;
1722
1723 xfs_iunlock(ip, XFS_ILOCK_EXCL);
1724 return 0;
1725
1726error_trans_cancel:
1727 xfs_trans_cancel(tp);
1728error_unlock:
1729 xfs_iunlock(ip, XFS_ILOCK_EXCL);
1730 return error;
1731}
1732
1733
1734
1735
1736
1737
1738STATIC int
1739xfs_inactive_ifree(
1740 struct xfs_inode *ip)
1741{
1742 struct xfs_mount *mp = ip->i_mount;
1743 struct xfs_trans *tp;
1744 int error;
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757 if (unlikely(mp->m_inotbt_nores)) {
1758 error = xfs_trans_alloc(mp, &M_RES(mp)->tr_ifree,
1759 XFS_IFREE_SPACE_RES(mp), 0, XFS_TRANS_RESERVE,
1760 &tp);
1761 } else {
1762 error = xfs_trans_alloc(mp, &M_RES(mp)->tr_ifree, 0, 0, 0, &tp);
1763 }
1764 if (error) {
1765 if (error == -ENOSPC) {
1766 xfs_warn_ratelimited(mp,
1767 "Failed to remove inode(s) from unlinked list. "
1768 "Please free space, unmount and run xfs_repair.");
1769 } else {
1770 ASSERT(XFS_FORCED_SHUTDOWN(mp));
1771 }
1772 return error;
1773 }
1774
1775 xfs_ilock(ip, XFS_ILOCK_EXCL);
1776 xfs_trans_ijoin(tp, ip, 0);
1777
1778 error = xfs_ifree(tp, ip);
1779 if (error) {
1780
1781
1782
1783
1784
1785 if (!XFS_FORCED_SHUTDOWN(mp)) {
1786 xfs_notice(mp, "%s: xfs_ifree returned error %d",
1787 __func__, error);
1788 xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR);
1789 }
1790 xfs_trans_cancel(tp);
1791 xfs_iunlock(ip, XFS_ILOCK_EXCL);
1792 return error;
1793 }
1794
1795
1796
1797
1798 xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_ICOUNT, -1);
1799
1800
1801
1802
1803
1804 error = xfs_trans_commit(tp);
1805 if (error)
1806 xfs_notice(mp, "%s: xfs_trans_commit returned error %d",
1807 __func__, error);
1808
1809 xfs_iunlock(ip, XFS_ILOCK_EXCL);
1810 return 0;
1811}
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821void
1822xfs_inactive(
1823 xfs_inode_t *ip)
1824{
1825 struct xfs_mount *mp;
1826 int error;
1827 int truncate = 0;
1828
1829
1830
1831
1832
1833 if (VFS_I(ip)->i_mode == 0) {
1834 ASSERT(ip->i_df.if_broot_bytes == 0);
1835 return;
1836 }
1837
1838 mp = ip->i_mount;
1839 ASSERT(!xfs_iflags_test(ip, XFS_IRECOVERY));
1840
1841
1842 if (mp->m_flags & XFS_MOUNT_RDONLY)
1843 return;
1844
1845
1846 if (xfs_inode_has_cow_data(ip))
1847 xfs_reflink_cancel_cow_range(ip, 0, NULLFILEOFF, true);
1848
1849 if (VFS_I(ip)->i_nlink != 0) {
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859 if (xfs_can_free_eofblocks(ip, true))
1860 xfs_free_eofblocks(ip);
1861
1862 return;
1863 }
1864
1865 if (S_ISREG(VFS_I(ip)->i_mode) &&
1866 (ip->i_d.di_size != 0 || XFS_ISIZE(ip) != 0 ||
1867 ip->i_d.di_nextents > 0 || ip->i_delayed_blks > 0))
1868 truncate = 1;
1869
1870 error = xfs_qm_dqattach(ip);
1871 if (error)
1872 return;
1873
1874 if (S_ISLNK(VFS_I(ip)->i_mode))
1875 error = xfs_inactive_symlink(ip);
1876 else if (truncate)
1877 error = xfs_inactive_truncate(ip);
1878 if (error)
1879 return;
1880
1881
1882
1883
1884
1885
1886 if (XFS_IFORK_Q(ip)) {
1887 error = xfs_attr_inactive(ip);
1888 if (error)
1889 return;
1890 }
1891
1892 ASSERT(!ip->i_afp);
1893 ASSERT(ip->i_d.di_anextents == 0);
1894 ASSERT(ip->i_d.di_forkoff == 0);
1895
1896
1897
1898
1899 error = xfs_inactive_ifree(ip);
1900 if (error)
1901 return;
1902
1903
1904
1905
1906 xfs_qm_dqdetach(ip);
1907}
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919STATIC int
1920xfs_iunlink(
1921 struct xfs_trans *tp,
1922 struct xfs_inode *ip)
1923{
1924 xfs_mount_t *mp = tp->t_mountp;
1925 xfs_agi_t *agi;
1926 xfs_dinode_t *dip;
1927 xfs_buf_t *agibp;
1928 xfs_buf_t *ibp;
1929 xfs_agino_t agino;
1930 short bucket_index;
1931 int offset;
1932 int error;
1933
1934 ASSERT(VFS_I(ip)->i_mode != 0);
1935
1936
1937
1938
1939
1940 error = xfs_read_agi(mp, tp, XFS_INO_TO_AGNO(mp, ip->i_ino), &agibp);
1941 if (error)
1942 return error;
1943 agi = XFS_BUF_TO_AGI(agibp);
1944
1945
1946
1947
1948
1949 agino = XFS_INO_TO_AGINO(mp, ip->i_ino);
1950 ASSERT(agino != 0);
1951 bucket_index = agino % XFS_AGI_UNLINKED_BUCKETS;
1952 ASSERT(agi->agi_unlinked[bucket_index]);
1953 ASSERT(be32_to_cpu(agi->agi_unlinked[bucket_index]) != agino);
1954
1955 if (agi->agi_unlinked[bucket_index] != cpu_to_be32(NULLAGINO)) {
1956
1957
1958
1959
1960
1961
1962 error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &dip, &ibp,
1963 0, 0);
1964 if (error)
1965 return error;
1966
1967 ASSERT(dip->di_next_unlinked == cpu_to_be32(NULLAGINO));
1968 dip->di_next_unlinked = agi->agi_unlinked[bucket_index];
1969 offset = ip->i_imap.im_boffset +
1970 offsetof(xfs_dinode_t, di_next_unlinked);
1971
1972
1973 xfs_dinode_calc_crc(mp, dip);
1974
1975 xfs_trans_inode_buf(tp, ibp);
1976 xfs_trans_log_buf(tp, ibp, offset,
1977 (offset + sizeof(xfs_agino_t) - 1));
1978 xfs_inobp_check(mp, ibp);
1979 }
1980
1981
1982
1983
1984 ASSERT(agino != 0);
1985 agi->agi_unlinked[bucket_index] = cpu_to_be32(agino);
1986 offset = offsetof(xfs_agi_t, agi_unlinked) +
1987 (sizeof(xfs_agino_t) * bucket_index);
1988 xfs_trans_log_buf(tp, agibp, offset,
1989 (offset + sizeof(xfs_agino_t) - 1));
1990 return 0;
1991}
1992
1993
1994
1995
1996STATIC int
1997xfs_iunlink_remove(
1998 xfs_trans_t *tp,
1999 xfs_inode_t *ip)
2000{
2001 xfs_ino_t next_ino;
2002 xfs_mount_t *mp;
2003 xfs_agi_t *agi;
2004 xfs_dinode_t *dip;
2005 xfs_buf_t *agibp;
2006 xfs_buf_t *ibp;
2007 xfs_agnumber_t agno;
2008 xfs_agino_t agino;
2009 xfs_agino_t next_agino;
2010 xfs_buf_t *last_ibp;
2011 xfs_dinode_t *last_dip = NULL;
2012 short bucket_index;
2013 int offset, last_offset = 0;
2014 int error;
2015
2016 mp = tp->t_mountp;
2017 agno = XFS_INO_TO_AGNO(mp, ip->i_ino);
2018
2019
2020
2021
2022
2023 error = xfs_read_agi(mp, tp, agno, &agibp);
2024 if (error)
2025 return error;
2026
2027 agi = XFS_BUF_TO_AGI(agibp);
2028
2029
2030
2031
2032
2033 agino = XFS_INO_TO_AGINO(mp, ip->i_ino);
2034 if (!xfs_verify_agino(mp, agno, agino))
2035 return -EFSCORRUPTED;
2036 bucket_index = agino % XFS_AGI_UNLINKED_BUCKETS;
2037 if (!xfs_verify_agino(mp, agno,
2038 be32_to_cpu(agi->agi_unlinked[bucket_index]))) {
2039 XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
2040 agi, sizeof(*agi));
2041 return -EFSCORRUPTED;
2042 }
2043
2044 if (be32_to_cpu(agi->agi_unlinked[bucket_index]) == agino) {
2045
2046
2047
2048
2049
2050
2051
2052 error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &dip, &ibp,
2053 0, 0);
2054 if (error) {
2055 xfs_warn(mp, "%s: xfs_imap_to_bp returned error %d.",
2056 __func__, error);
2057 return error;
2058 }
2059 next_agino = be32_to_cpu(dip->di_next_unlinked);
2060 ASSERT(next_agino != 0);
2061 if (next_agino != NULLAGINO) {
2062 dip->di_next_unlinked = cpu_to_be32(NULLAGINO);
2063 offset = ip->i_imap.im_boffset +
2064 offsetof(xfs_dinode_t, di_next_unlinked);
2065
2066
2067 xfs_dinode_calc_crc(mp, dip);
2068
2069 xfs_trans_inode_buf(tp, ibp);
2070 xfs_trans_log_buf(tp, ibp, offset,
2071 (offset + sizeof(xfs_agino_t) - 1));
2072 xfs_inobp_check(mp, ibp);
2073 } else {
2074 xfs_trans_brelse(tp, ibp);
2075 }
2076
2077
2078
2079 ASSERT(next_agino != 0);
2080 ASSERT(next_agino != agino);
2081 agi->agi_unlinked[bucket_index] = cpu_to_be32(next_agino);
2082 offset = offsetof(xfs_agi_t, agi_unlinked) +
2083 (sizeof(xfs_agino_t) * bucket_index);
2084 xfs_trans_log_buf(tp, agibp, offset,
2085 (offset + sizeof(xfs_agino_t) - 1));
2086 } else {
2087
2088
2089
2090 next_agino = be32_to_cpu(agi->agi_unlinked[bucket_index]);
2091 last_ibp = NULL;
2092 while (next_agino != agino) {
2093 struct xfs_imap imap;
2094
2095 if (last_ibp)
2096 xfs_trans_brelse(tp, last_ibp);
2097
2098 imap.im_blkno = 0;
2099 next_ino = XFS_AGINO_TO_INO(mp, agno, next_agino);
2100
2101 error = xfs_imap(mp, tp, next_ino, &imap, 0);
2102 if (error) {
2103 xfs_warn(mp,
2104 "%s: xfs_imap returned error %d.",
2105 __func__, error);
2106 return error;
2107 }
2108
2109 error = xfs_imap_to_bp(mp, tp, &imap, &last_dip,
2110 &last_ibp, 0, 0);
2111 if (error) {
2112 xfs_warn(mp,
2113 "%s: xfs_imap_to_bp returned error %d.",
2114 __func__, error);
2115 return error;
2116 }
2117
2118 last_offset = imap.im_boffset;
2119 next_agino = be32_to_cpu(last_dip->di_next_unlinked);
2120 if (!xfs_verify_agino(mp, agno, next_agino)) {
2121 XFS_CORRUPTION_ERROR(__func__,
2122 XFS_ERRLEVEL_LOW, mp,
2123 last_dip, sizeof(*last_dip));
2124 return -EFSCORRUPTED;
2125 }
2126 }
2127
2128
2129
2130
2131
2132 error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &dip, &ibp,
2133 0, 0);
2134 if (error) {
2135 xfs_warn(mp, "%s: xfs_imap_to_bp(2) returned error %d.",
2136 __func__, error);
2137 return error;
2138 }
2139 next_agino = be32_to_cpu(dip->di_next_unlinked);
2140 ASSERT(next_agino != 0);
2141 ASSERT(next_agino != agino);
2142 if (next_agino != NULLAGINO) {
2143 dip->di_next_unlinked = cpu_to_be32(NULLAGINO);
2144 offset = ip->i_imap.im_boffset +
2145 offsetof(xfs_dinode_t, di_next_unlinked);
2146
2147
2148 xfs_dinode_calc_crc(mp, dip);
2149
2150 xfs_trans_inode_buf(tp, ibp);
2151 xfs_trans_log_buf(tp, ibp, offset,
2152 (offset + sizeof(xfs_agino_t) - 1));
2153 xfs_inobp_check(mp, ibp);
2154 } else {
2155 xfs_trans_brelse(tp, ibp);
2156 }
2157
2158
2159
2160 last_dip->di_next_unlinked = cpu_to_be32(next_agino);
2161 ASSERT(next_agino != 0);
2162 offset = last_offset + offsetof(xfs_dinode_t, di_next_unlinked);
2163
2164
2165 xfs_dinode_calc_crc(mp, last_dip);
2166
2167 xfs_trans_inode_buf(tp, last_ibp);
2168 xfs_trans_log_buf(tp, last_ibp, offset,
2169 (offset + sizeof(xfs_agino_t) - 1));
2170 xfs_inobp_check(mp, last_ibp);
2171 }
2172 return 0;
2173}
2174
2175
2176
2177
2178
2179
2180STATIC int
2181xfs_ifree_cluster(
2182 xfs_inode_t *free_ip,
2183 xfs_trans_t *tp,
2184 struct xfs_icluster *xic)
2185{
2186 xfs_mount_t *mp = free_ip->i_mount;
2187 int blks_per_cluster;
2188 int inodes_per_cluster;
2189 int nbufs;
2190 int i, j;
2191 int ioffset;
2192 xfs_daddr_t blkno;
2193 xfs_buf_t *bp;
2194 xfs_inode_t *ip;
2195 xfs_inode_log_item_t *iip;
2196 struct xfs_log_item *lip;
2197 struct xfs_perag *pag;
2198 xfs_ino_t inum;
2199
2200 inum = xic->first_ino;
2201 pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, inum));
2202 blks_per_cluster = xfs_icluster_size_fsb(mp);
2203 inodes_per_cluster = blks_per_cluster << mp->m_sb.sb_inopblog;
2204 nbufs = mp->m_ialloc_blks / blks_per_cluster;
2205
2206 for (j = 0; j < nbufs; j++, inum += inodes_per_cluster) {
2207
2208
2209
2210
2211
2212 ioffset = inum - xic->first_ino;
2213 if ((xic->alloc & XFS_INOBT_MASK(ioffset)) == 0) {
2214 ASSERT(ioffset % inodes_per_cluster == 0);
2215 continue;
2216 }
2217
2218 blkno = XFS_AGB_TO_DADDR(mp, XFS_INO_TO_AGNO(mp, inum),
2219 XFS_INO_TO_AGBNO(mp, inum));
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229 bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, blkno,
2230 mp->m_bsize * blks_per_cluster,
2231 XBF_UNMAPPED);
2232
2233 if (!bp)
2234 return -ENOMEM;
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245 bp->b_ops = &xfs_inode_buf_ops;
2246
2247
2248
2249
2250
2251
2252
2253
2254 list_for_each_entry(lip, &bp->b_li_list, li_bio_list) {
2255 if (lip->li_type == XFS_LI_INODE) {
2256 iip = (xfs_inode_log_item_t *)lip;
2257 ASSERT(iip->ili_logged == 1);
2258 lip->li_cb = xfs_istale_done;
2259 xfs_trans_ail_copy_lsn(mp->m_ail,
2260 &iip->ili_flush_lsn,
2261 &iip->ili_item.li_lsn);
2262 xfs_iflags_set(iip->ili_inode, XFS_ISTALE);
2263 }
2264 }
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277 for (i = 0; i < inodes_per_cluster; i++) {
2278retry:
2279 rcu_read_lock();
2280 ip = radix_tree_lookup(&pag->pag_ici_root,
2281 XFS_INO_TO_AGINO(mp, (inum + i)));
2282
2283
2284 if (!ip) {
2285 rcu_read_unlock();
2286 continue;
2287 }
2288
2289
2290
2291
2292
2293
2294
2295
2296 spin_lock(&ip->i_flags_lock);
2297 if (ip->i_ino != inum + i ||
2298 __xfs_iflags_test(ip, XFS_ISTALE)) {
2299 spin_unlock(&ip->i_flags_lock);
2300 rcu_read_unlock();
2301 continue;
2302 }
2303 spin_unlock(&ip->i_flags_lock);
2304
2305
2306
2307
2308
2309
2310
2311
2312 if (ip != free_ip) {
2313 if (!xfs_ilock_nowait(ip, XFS_ILOCK_EXCL)) {
2314 rcu_read_unlock();
2315 delay(1);
2316 goto retry;
2317 }
2318
2319
2320
2321
2322
2323
2324
2325
2326 if (ip->i_ino != inum + i) {
2327 xfs_iunlock(ip, XFS_ILOCK_EXCL);
2328 rcu_read_unlock();
2329 continue;
2330 }
2331 }
2332 rcu_read_unlock();
2333
2334 xfs_iflock(ip);
2335 xfs_iflags_set(ip, XFS_ISTALE);
2336
2337
2338
2339
2340
2341 iip = ip->i_itemp;
2342 if (!iip || xfs_inode_clean(ip)) {
2343 ASSERT(ip != free_ip);
2344 xfs_ifunlock(ip);
2345 xfs_iunlock(ip, XFS_ILOCK_EXCL);
2346 continue;
2347 }
2348
2349 iip->ili_last_fields = iip->ili_fields;
2350 iip->ili_fields = 0;
2351 iip->ili_fsync_fields = 0;
2352 iip->ili_logged = 1;
2353 xfs_trans_ail_copy_lsn(mp->m_ail, &iip->ili_flush_lsn,
2354 &iip->ili_item.li_lsn);
2355
2356 xfs_buf_attach_iodone(bp, xfs_istale_done,
2357 &iip->ili_item);
2358
2359 if (ip != free_ip)
2360 xfs_iunlock(ip, XFS_ILOCK_EXCL);
2361 }
2362
2363 xfs_trans_stale_inode_buf(tp, bp);
2364 xfs_trans_binval(tp, bp);
2365 }
2366
2367 xfs_perag_put(pag);
2368 return 0;
2369}
2370
2371
2372
2373
2374
2375static inline void
2376xfs_ifree_local_data(
2377 struct xfs_inode *ip,
2378 int whichfork)
2379{
2380 struct xfs_ifork *ifp;
2381
2382 if (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_LOCAL)
2383 return;
2384
2385 ifp = XFS_IFORK_PTR(ip, whichfork);
2386 xfs_idata_realloc(ip, -ifp->if_bytes, whichfork);
2387}
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399int
2400xfs_ifree(
2401 struct xfs_trans *tp,
2402 struct xfs_inode *ip)
2403{
2404 int error;
2405 struct xfs_icluster xic = { 0 };
2406
2407 ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
2408 ASSERT(VFS_I(ip)->i_nlink == 0);
2409 ASSERT(ip->i_d.di_nextents == 0);
2410 ASSERT(ip->i_d.di_anextents == 0);
2411 ASSERT(ip->i_d.di_size == 0 || !S_ISREG(VFS_I(ip)->i_mode));
2412 ASSERT(ip->i_d.di_nblocks == 0);
2413
2414
2415
2416
2417 error = xfs_iunlink_remove(tp, ip);
2418 if (error)
2419 return error;
2420
2421 error = xfs_difree(tp, ip->i_ino, &xic);
2422 if (error)
2423 return error;
2424
2425 xfs_ifree_local_data(ip, XFS_DATA_FORK);
2426 xfs_ifree_local_data(ip, XFS_ATTR_FORK);
2427
2428 VFS_I(ip)->i_mode = 0;
2429 ip->i_d.di_flags = 0;
2430 ip->i_d.di_flags2 = 0;
2431 ip->i_d.di_dmevmask = 0;
2432 ip->i_d.di_forkoff = 0;
2433 ip->i_d.di_format = XFS_DINODE_FMT_EXTENTS;
2434 ip->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS;
2435
2436
2437 ip->i_itemp->ili_fields &= ~(XFS_ILOG_AOWNER|XFS_ILOG_DOWNER);
2438
2439
2440
2441
2442
2443 VFS_I(ip)->i_generation++;
2444 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
2445
2446 if (xic.deleted)
2447 error = xfs_ifree_cluster(ip, tp, &xic);
2448
2449 return error;
2450}
2451
2452
2453
2454
2455
2456
2457static void
2458xfs_iunpin(
2459 struct xfs_inode *ip)
2460{
2461 ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED));
2462
2463 trace_xfs_inode_unpin_nowait(ip, _RET_IP_);
2464
2465
2466 xfs_log_force_lsn(ip->i_mount, ip->i_itemp->ili_last_lsn, 0, NULL);
2467
2468}
2469
2470static void
2471__xfs_iunpin_wait(
2472 struct xfs_inode *ip)
2473{
2474 wait_queue_head_t *wq = bit_waitqueue(&ip->i_flags, __XFS_IPINNED_BIT);
2475 DEFINE_WAIT_BIT(wait, &ip->i_flags, __XFS_IPINNED_BIT);
2476
2477 xfs_iunpin(ip);
2478
2479 do {
2480 prepare_to_wait(wq, &wait.wq_entry, TASK_UNINTERRUPTIBLE);
2481 if (xfs_ipincount(ip))
2482 io_schedule();
2483 } while (xfs_ipincount(ip));
2484 finish_wait(wq, &wait.wq_entry);
2485}
2486
2487void
2488xfs_iunpin_wait(
2489 struct xfs_inode *ip)
2490{
2491 if (xfs_ipincount(ip))
2492 __xfs_iunpin_wait(ip);
2493}
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522int
2523xfs_remove(
2524 xfs_inode_t *dp,
2525 struct xfs_name *name,
2526 xfs_inode_t *ip)
2527{
2528 xfs_mount_t *mp = dp->i_mount;
2529 xfs_trans_t *tp = NULL;
2530 int is_dir = S_ISDIR(VFS_I(ip)->i_mode);
2531 int error = 0;
2532 uint resblks;
2533
2534 trace_xfs_remove(dp, name);
2535
2536 if (XFS_FORCED_SHUTDOWN(mp))
2537 return -EIO;
2538
2539 error = xfs_qm_dqattach(dp);
2540 if (error)
2541 goto std_return;
2542
2543 error = xfs_qm_dqattach(ip);
2544 if (error)
2545 goto std_return;
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556 resblks = XFS_REMOVE_SPACE_RES(mp);
2557 error = xfs_trans_alloc(mp, &M_RES(mp)->tr_remove, resblks, 0, 0, &tp);
2558 if (error == -ENOSPC) {
2559 resblks = 0;
2560 error = xfs_trans_alloc(mp, &M_RES(mp)->tr_remove, 0, 0, 0,
2561 &tp);
2562 }
2563 if (error) {
2564 ASSERT(error != -ENOSPC);
2565 goto std_return;
2566 }
2567
2568 xfs_lock_two_inodes(dp, XFS_ILOCK_EXCL, ip, XFS_ILOCK_EXCL);
2569
2570 xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL);
2571 xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
2572
2573
2574
2575
2576 if (is_dir) {
2577 ASSERT(VFS_I(ip)->i_nlink >= 2);
2578 if (VFS_I(ip)->i_nlink != 2) {
2579 error = -ENOTEMPTY;
2580 goto out_trans_cancel;
2581 }
2582 if (!xfs_dir_isempty(ip)) {
2583 error = -ENOTEMPTY;
2584 goto out_trans_cancel;
2585 }
2586
2587
2588 error = xfs_droplink(tp, dp);
2589 if (error)
2590 goto out_trans_cancel;
2591
2592
2593 error = xfs_droplink(tp, ip);
2594 if (error)
2595 goto out_trans_cancel;
2596 } else {
2597
2598
2599
2600
2601
2602 xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE);
2603 }
2604 xfs_trans_ichgtime(tp, dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
2605
2606
2607 error = xfs_droplink(tp, ip);
2608 if (error)
2609 goto out_trans_cancel;
2610
2611 error = xfs_dir_removename(tp, dp, name, ip->i_ino, resblks);
2612 if (error) {
2613 ASSERT(error != -ENOENT);
2614 goto out_trans_cancel;
2615 }
2616
2617
2618
2619
2620
2621
2622 if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC))
2623 xfs_trans_set_sync(tp);
2624
2625 error = xfs_trans_commit(tp);
2626 if (error)
2627 goto std_return;
2628
2629 if (is_dir && xfs_inode_is_filestream(ip))
2630 xfs_filestream_deassociate(ip);
2631
2632 return 0;
2633
2634 out_trans_cancel:
2635 xfs_trans_cancel(tp);
2636 std_return:
2637 return error;
2638}
2639
2640
2641
2642
2643#define __XFS_SORT_INODES 5
2644STATIC void
2645xfs_sort_for_rename(
2646 struct xfs_inode *dp1,
2647 struct xfs_inode *dp2,
2648 struct xfs_inode *ip1,
2649 struct xfs_inode *ip2,
2650 struct xfs_inode *wip,
2651 struct xfs_inode **i_tab,
2652 int *num_inodes)
2653{
2654 int i, j;
2655
2656 ASSERT(*num_inodes == __XFS_SORT_INODES);
2657 memset(i_tab, 0, *num_inodes * sizeof(struct xfs_inode *));
2658
2659
2660
2661
2662
2663
2664
2665
2666 i = 0;
2667 i_tab[i++] = dp1;
2668 i_tab[i++] = dp2;
2669 i_tab[i++] = ip1;
2670 if (ip2)
2671 i_tab[i++] = ip2;
2672 if (wip)
2673 i_tab[i++] = wip;
2674 *num_inodes = i;
2675
2676
2677
2678
2679
2680 for (i = 0; i < *num_inodes; i++) {
2681 for (j = 1; j < *num_inodes; j++) {
2682 if (i_tab[j]->i_ino < i_tab[j-1]->i_ino) {
2683 struct xfs_inode *temp = i_tab[j];
2684 i_tab[j] = i_tab[j-1];
2685 i_tab[j-1] = temp;
2686 }
2687 }
2688 }
2689}
2690
2691static int
2692xfs_finish_rename(
2693 struct xfs_trans *tp)
2694{
2695
2696
2697
2698
2699 if (tp->t_mountp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC))
2700 xfs_trans_set_sync(tp);
2701
2702 return xfs_trans_commit(tp);
2703}
2704
2705
2706
2707
2708
2709
2710STATIC int
2711xfs_cross_rename(
2712 struct xfs_trans *tp,
2713 struct xfs_inode *dp1,
2714 struct xfs_name *name1,
2715 struct xfs_inode *ip1,
2716 struct xfs_inode *dp2,
2717 struct xfs_name *name2,
2718 struct xfs_inode *ip2,
2719 int spaceres)
2720{
2721 int error = 0;
2722 int ip1_flags = 0;
2723 int ip2_flags = 0;
2724 int dp2_flags = 0;
2725
2726
2727 error = xfs_dir_replace(tp, dp1, name1, ip2->i_ino, spaceres);
2728 if (error)
2729 goto out_trans_abort;
2730
2731
2732 error = xfs_dir_replace(tp, dp2, name2, ip1->i_ino, spaceres);
2733 if (error)
2734 goto out_trans_abort;
2735
2736
2737
2738
2739
2740
2741 if (dp1 != dp2) {
2742 dp2_flags = XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG;
2743
2744 if (S_ISDIR(VFS_I(ip2)->i_mode)) {
2745 error = xfs_dir_replace(tp, ip2, &xfs_name_dotdot,
2746 dp1->i_ino, spaceres);
2747 if (error)
2748 goto out_trans_abort;
2749
2750
2751 if (!S_ISDIR(VFS_I(ip1)->i_mode)) {
2752 error = xfs_droplink(tp, dp2);
2753 if (error)
2754 goto out_trans_abort;
2755 error = xfs_bumplink(tp, dp1);
2756 if (error)
2757 goto out_trans_abort;
2758 }
2759
2760
2761
2762
2763
2764
2765
2766 ip1_flags |= XFS_ICHGTIME_CHG;
2767 ip2_flags |= XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG;
2768 }
2769
2770 if (S_ISDIR(VFS_I(ip1)->i_mode)) {
2771 error = xfs_dir_replace(tp, ip1, &xfs_name_dotdot,
2772 dp2->i_ino, spaceres);
2773 if (error)
2774 goto out_trans_abort;
2775
2776
2777 if (!S_ISDIR(VFS_I(ip2)->i_mode)) {
2778 error = xfs_droplink(tp, dp1);
2779 if (error)
2780 goto out_trans_abort;
2781 error = xfs_bumplink(tp, dp2);
2782 if (error)
2783 goto out_trans_abort;
2784 }
2785
2786
2787
2788
2789
2790
2791
2792 ip1_flags |= XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG;
2793 ip2_flags |= XFS_ICHGTIME_CHG;
2794 }
2795 }
2796
2797 if (ip1_flags) {
2798 xfs_trans_ichgtime(tp, ip1, ip1_flags);
2799 xfs_trans_log_inode(tp, ip1, XFS_ILOG_CORE);
2800 }
2801 if (ip2_flags) {
2802 xfs_trans_ichgtime(tp, ip2, ip2_flags);
2803 xfs_trans_log_inode(tp, ip2, XFS_ILOG_CORE);
2804 }
2805 if (dp2_flags) {
2806 xfs_trans_ichgtime(tp, dp2, dp2_flags);
2807 xfs_trans_log_inode(tp, dp2, XFS_ILOG_CORE);
2808 }
2809 xfs_trans_ichgtime(tp, dp1, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
2810 xfs_trans_log_inode(tp, dp1, XFS_ILOG_CORE);
2811 return xfs_finish_rename(tp);
2812
2813out_trans_abort:
2814 xfs_trans_cancel(tp);
2815 return error;
2816}
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826static int
2827xfs_rename_alloc_whiteout(
2828 struct xfs_inode *dp,
2829 struct xfs_inode **wip)
2830{
2831 struct xfs_inode *tmpfile;
2832 int error;
2833
2834 error = xfs_create_tmpfile(dp, S_IFCHR | WHITEOUT_MODE, &tmpfile);
2835 if (error)
2836 return error;
2837
2838
2839
2840
2841
2842
2843
2844 drop_nlink(VFS_I(tmpfile));
2845 xfs_setup_iops(tmpfile);
2846 xfs_finish_inode_setup(tmpfile);
2847 VFS_I(tmpfile)->i_state |= I_LINKABLE;
2848
2849 *wip = tmpfile;
2850 return 0;
2851}
2852
2853
2854
2855
2856int
2857xfs_rename(
2858 struct xfs_inode *src_dp,
2859 struct xfs_name *src_name,
2860 struct xfs_inode *src_ip,
2861 struct xfs_inode *target_dp,
2862 struct xfs_name *target_name,
2863 struct xfs_inode *target_ip,
2864 unsigned int flags)
2865{
2866 struct xfs_mount *mp = src_dp->i_mount;
2867 struct xfs_trans *tp;
2868 struct xfs_inode *wip = NULL;
2869 struct xfs_inode *inodes[__XFS_SORT_INODES];
2870 int num_inodes = __XFS_SORT_INODES;
2871 bool new_parent = (src_dp != target_dp);
2872 bool src_is_directory = S_ISDIR(VFS_I(src_ip)->i_mode);
2873 int spaceres;
2874 int error;
2875
2876 trace_xfs_rename(src_dp, target_dp, src_name, target_name);
2877
2878 if ((flags & RENAME_EXCHANGE) && !target_ip)
2879 return -EINVAL;
2880
2881
2882
2883
2884
2885
2886 if (flags & RENAME_WHITEOUT) {
2887 ASSERT(!(flags & (RENAME_NOREPLACE | RENAME_EXCHANGE)));
2888 error = xfs_rename_alloc_whiteout(target_dp, &wip);
2889 if (error)
2890 return error;
2891
2892
2893 src_name->type = XFS_DIR3_FT_CHRDEV;
2894 }
2895
2896 xfs_sort_for_rename(src_dp, target_dp, src_ip, target_ip, wip,
2897 inodes, &num_inodes);
2898
2899 spaceres = XFS_RENAME_SPACE_RES(mp, target_name->len);
2900 error = xfs_trans_alloc(mp, &M_RES(mp)->tr_rename, spaceres, 0, 0, &tp);
2901 if (error == -ENOSPC) {
2902 spaceres = 0;
2903 error = xfs_trans_alloc(mp, &M_RES(mp)->tr_rename, 0, 0, 0,
2904 &tp);
2905 }
2906 if (error)
2907 goto out_release_wip;
2908
2909
2910
2911
2912 error = xfs_qm_vop_rename_dqattach(inodes);
2913 if (error)
2914 goto out_trans_cancel;
2915
2916
2917
2918
2919
2920
2921
2922 xfs_lock_inodes(inodes, num_inodes, XFS_ILOCK_EXCL);
2923
2924
2925
2926
2927
2928
2929 xfs_trans_ijoin(tp, src_dp, XFS_ILOCK_EXCL);
2930 if (new_parent)
2931 xfs_trans_ijoin(tp, target_dp, XFS_ILOCK_EXCL);
2932 xfs_trans_ijoin(tp, src_ip, XFS_ILOCK_EXCL);
2933 if (target_ip)
2934 xfs_trans_ijoin(tp, target_ip, XFS_ILOCK_EXCL);
2935 if (wip)
2936 xfs_trans_ijoin(tp, wip, XFS_ILOCK_EXCL);
2937
2938
2939
2940
2941
2942
2943 if (unlikely((target_dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) &&
2944 (xfs_get_projid(target_dp) != xfs_get_projid(src_ip)))) {
2945 error = -EXDEV;
2946 goto out_trans_cancel;
2947 }
2948
2949
2950 if (flags & RENAME_EXCHANGE)
2951 return xfs_cross_rename(tp, src_dp, src_name, src_ip,
2952 target_dp, target_name, target_ip,
2953 spaceres);
2954
2955
2956
2957
2958 if (target_ip == NULL) {
2959
2960
2961
2962
2963 if (!spaceres) {
2964 error = xfs_dir_canenter(tp, target_dp, target_name);
2965 if (error)
2966 goto out_trans_cancel;
2967 }
2968
2969
2970
2971
2972
2973 error = xfs_dir_createname(tp, target_dp, target_name,
2974 src_ip->i_ino, spaceres);
2975 if (error)
2976 goto out_trans_cancel;
2977
2978 xfs_trans_ichgtime(tp, target_dp,
2979 XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
2980
2981 if (new_parent && src_is_directory) {
2982 error = xfs_bumplink(tp, target_dp);
2983 if (error)
2984 goto out_trans_cancel;
2985 }
2986 } else {
2987
2988
2989
2990
2991
2992 if (S_ISDIR(VFS_I(target_ip)->i_mode)) {
2993
2994
2995
2996 if (!(xfs_dir_isempty(target_ip)) ||
2997 (VFS_I(target_ip)->i_nlink > 2)) {
2998 error = -EEXIST;
2999 goto out_trans_cancel;
3000 }
3001 }
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012 error = xfs_dir_replace(tp, target_dp, target_name,
3013 src_ip->i_ino, spaceres);
3014 if (error)
3015 goto out_trans_cancel;
3016
3017 xfs_trans_ichgtime(tp, target_dp,
3018 XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
3019
3020
3021
3022
3023
3024 error = xfs_droplink(tp, target_ip);
3025 if (error)
3026 goto out_trans_cancel;
3027
3028 if (src_is_directory) {
3029
3030
3031
3032 error = xfs_droplink(tp, target_ip);
3033 if (error)
3034 goto out_trans_cancel;
3035 }
3036 }
3037
3038
3039
3040
3041 if (new_parent && src_is_directory) {
3042
3043
3044
3045
3046 error = xfs_dir_replace(tp, src_ip, &xfs_name_dotdot,
3047 target_dp->i_ino, spaceres);
3048 ASSERT(error != -EEXIST);
3049 if (error)
3050 goto out_trans_cancel;
3051 }
3052
3053
3054
3055
3056
3057
3058
3059
3060 xfs_trans_ichgtime(tp, src_ip, XFS_ICHGTIME_CHG);
3061 xfs_trans_log_inode(tp, src_ip, XFS_ILOG_CORE);
3062
3063
3064
3065
3066
3067
3068 if (src_is_directory && (new_parent || target_ip != NULL)) {
3069
3070
3071
3072
3073
3074 error = xfs_droplink(tp, src_dp);
3075 if (error)
3076 goto out_trans_cancel;
3077 }
3078
3079
3080
3081
3082
3083
3084 if (wip) {
3085 error = xfs_dir_replace(tp, src_dp, src_name, wip->i_ino,
3086 spaceres);
3087 } else
3088 error = xfs_dir_removename(tp, src_dp, src_name, src_ip->i_ino,
3089 spaceres);
3090 if (error)
3091 goto out_trans_cancel;
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101 if (wip) {
3102 ASSERT(VFS_I(wip)->i_nlink == 0);
3103 error = xfs_bumplink(tp, wip);
3104 if (error)
3105 goto out_trans_cancel;
3106 error = xfs_iunlink_remove(tp, wip);
3107 if (error)
3108 goto out_trans_cancel;
3109 xfs_trans_log_inode(tp, wip, XFS_ILOG_CORE);
3110
3111
3112
3113
3114
3115
3116 VFS_I(wip)->i_state &= ~I_LINKABLE;
3117 }
3118
3119 xfs_trans_ichgtime(tp, src_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
3120 xfs_trans_log_inode(tp, src_dp, XFS_ILOG_CORE);
3121 if (new_parent)
3122 xfs_trans_log_inode(tp, target_dp, XFS_ILOG_CORE);
3123
3124 error = xfs_finish_rename(tp);
3125 if (wip)
3126 xfs_irele(wip);
3127 return error;
3128
3129out_trans_cancel:
3130 xfs_trans_cancel(tp);
3131out_release_wip:
3132 if (wip)
3133 xfs_irele(wip);
3134 return error;
3135}
3136
3137STATIC int
3138xfs_iflush_cluster(
3139 struct xfs_inode *ip,
3140 struct xfs_buf *bp)
3141{
3142 struct xfs_mount *mp = ip->i_mount;
3143 struct xfs_perag *pag;
3144 unsigned long first_index, mask;
3145 unsigned long inodes_per_cluster;
3146 int cilist_size;
3147 struct xfs_inode **cilist;
3148 struct xfs_inode *cip;
3149 int nr_found;
3150 int clcount = 0;
3151 int i;
3152
3153 pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino));
3154
3155 inodes_per_cluster = mp->m_inode_cluster_size >> mp->m_sb.sb_inodelog;
3156 cilist_size = inodes_per_cluster * sizeof(xfs_inode_t *);
3157 cilist = kmem_alloc(cilist_size, KM_MAYFAIL|KM_NOFS);
3158 if (!cilist)
3159 goto out_put;
3160
3161 mask = ~(((mp->m_inode_cluster_size >> mp->m_sb.sb_inodelog)) - 1);
3162 first_index = XFS_INO_TO_AGINO(mp, ip->i_ino) & mask;
3163 rcu_read_lock();
3164
3165 nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, (void**)cilist,
3166 first_index, inodes_per_cluster);
3167 if (nr_found == 0)
3168 goto out_free;
3169
3170 for (i = 0; i < nr_found; i++) {
3171 cip = cilist[i];
3172 if (cip == ip)
3173 continue;
3174
3175
3176
3177
3178
3179
3180
3181 spin_lock(&cip->i_flags_lock);
3182 if (!cip->i_ino ||
3183 __xfs_iflags_test(cip, XFS_ISTALE)) {
3184 spin_unlock(&cip->i_flags_lock);
3185 continue;
3186 }
3187
3188
3189
3190
3191
3192
3193 if ((XFS_INO_TO_AGINO(mp, cip->i_ino) & mask) != first_index) {
3194 spin_unlock(&cip->i_flags_lock);
3195 break;
3196 }
3197 spin_unlock(&cip->i_flags_lock);
3198
3199
3200
3201
3202
3203
3204 if (xfs_inode_clean(cip) && xfs_ipincount(cip) == 0)
3205 continue;
3206
3207
3208
3209
3210
3211
3212 if (!xfs_ilock_nowait(cip, XFS_ILOCK_SHARED))
3213 continue;
3214 if (!xfs_iflock_nowait(cip)) {
3215 xfs_iunlock(cip, XFS_ILOCK_SHARED);
3216 continue;
3217 }
3218 if (xfs_ipincount(cip)) {
3219 xfs_ifunlock(cip);
3220 xfs_iunlock(cip, XFS_ILOCK_SHARED);
3221 continue;
3222 }
3223
3224
3225
3226
3227
3228
3229
3230
3231 if (!cip->i_ino) {
3232 xfs_ifunlock(cip);
3233 xfs_iunlock(cip, XFS_ILOCK_SHARED);
3234 continue;
3235 }
3236
3237
3238
3239
3240
3241 if (!xfs_inode_clean(cip)) {
3242 int error;
3243 error = xfs_iflush_int(cip, bp);
3244 if (error) {
3245 xfs_iunlock(cip, XFS_ILOCK_SHARED);
3246 goto cluster_corrupt_out;
3247 }
3248 clcount++;
3249 } else {
3250 xfs_ifunlock(cip);
3251 }
3252 xfs_iunlock(cip, XFS_ILOCK_SHARED);
3253 }
3254
3255 if (clcount) {
3256 XFS_STATS_INC(mp, xs_icluster_flushcnt);
3257 XFS_STATS_ADD(mp, xs_icluster_flushinode, clcount);
3258 }
3259
3260out_free:
3261 rcu_read_unlock();
3262 kmem_free(cilist);
3263out_put:
3264 xfs_perag_put(pag);
3265 return 0;
3266
3267
3268cluster_corrupt_out:
3269
3270
3271
3272
3273 rcu_read_unlock();
3274 xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
3275
3276
3277
3278
3279
3280
3281
3282
3283 ASSERT(bp->b_iodone);
3284 bp->b_flags &= ~XBF_DONE;
3285 xfs_buf_stale(bp);
3286 xfs_buf_ioerror(bp, -EIO);
3287 xfs_buf_ioend(bp);
3288
3289
3290 xfs_iflush_abort(cip, false);
3291 kmem_free(cilist);
3292 xfs_perag_put(pag);
3293 return -EFSCORRUPTED;
3294}
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305int
3306xfs_iflush(
3307 struct xfs_inode *ip,
3308 struct xfs_buf **bpp)
3309{
3310 struct xfs_mount *mp = ip->i_mount;
3311 struct xfs_buf *bp = NULL;
3312 struct xfs_dinode *dip;
3313 int error;
3314
3315 XFS_STATS_INC(mp, xs_iflush_count);
3316
3317 ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED));
3318 ASSERT(xfs_isiflocked(ip));
3319 ASSERT(ip->i_d.di_format != XFS_DINODE_FMT_BTREE ||
3320 ip->i_d.di_nextents > XFS_IFORK_MAXEXT(ip, XFS_DATA_FORK));
3321
3322 *bpp = NULL;
3323
3324 xfs_iunpin_wait(ip);
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334 if (xfs_iflags_test(ip, XFS_ISTALE)) {
3335 xfs_ifunlock(ip);
3336 return 0;
3337 }
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347 if (XFS_FORCED_SHUTDOWN(mp)) {
3348 error = -EIO;
3349 goto abort_out;
3350 }
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361 error = xfs_imap_to_bp(mp, NULL, &ip->i_imap, &dip, &bp, XBF_TRYLOCK,
3362 0);
3363 if (error == -EAGAIN) {
3364 xfs_ifunlock(ip);
3365 return error;
3366 }
3367 if (error)
3368 goto corrupt_out;
3369
3370
3371
3372
3373 error = xfs_iflush_int(ip, bp);
3374 if (error)
3375 goto corrupt_out;
3376
3377
3378
3379
3380
3381 if (xfs_buf_ispinned(bp))
3382 xfs_log_force(mp, 0);
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393 error = xfs_iflush_cluster(ip, bp);
3394 if (error)
3395 return error;
3396
3397 *bpp = bp;
3398 return 0;
3399
3400corrupt_out:
3401 if (bp)
3402 xfs_buf_relse(bp);
3403 xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
3404abort_out:
3405
3406 xfs_iflush_abort(ip, false);
3407 return error;
3408}
3409
3410
3411
3412
3413
3414bool
3415xfs_inode_verify_forks(
3416 struct xfs_inode *ip)
3417{
3418 struct xfs_ifork *ifp;
3419 xfs_failaddr_t fa;
3420
3421 fa = xfs_ifork_verify_data(ip, &xfs_default_ifork_ops);
3422 if (fa) {
3423 ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK);
3424 xfs_inode_verifier_error(ip, -EFSCORRUPTED, "data fork",
3425 ifp->if_u1.if_data, ifp->if_bytes, fa);
3426 return false;
3427 }
3428
3429 fa = xfs_ifork_verify_attr(ip, &xfs_default_ifork_ops);
3430 if (fa) {
3431 ifp = XFS_IFORK_PTR(ip, XFS_ATTR_FORK);
3432 xfs_inode_verifier_error(ip, -EFSCORRUPTED, "attr fork",
3433 ifp ? ifp->if_u1.if_data : NULL,
3434 ifp ? ifp->if_bytes : 0, fa);
3435 return false;
3436 }
3437 return true;
3438}
3439
3440STATIC int
3441xfs_iflush_int(
3442 struct xfs_inode *ip,
3443 struct xfs_buf *bp)
3444{
3445 struct xfs_inode_log_item *iip = ip->i_itemp;
3446 struct xfs_dinode *dip;
3447 struct xfs_mount *mp = ip->i_mount;
3448
3449 ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED));
3450 ASSERT(xfs_isiflocked(ip));
3451 ASSERT(ip->i_d.di_format != XFS_DINODE_FMT_BTREE ||
3452 ip->i_d.di_nextents > XFS_IFORK_MAXEXT(ip, XFS_DATA_FORK));
3453 ASSERT(iip != NULL && iip->ili_fields != 0);
3454 ASSERT(ip->i_d.di_version > 1);
3455
3456
3457 dip = xfs_buf_offset(bp, ip->i_imap.im_boffset);
3458
3459 if (XFS_TEST_ERROR(dip->di_magic != cpu_to_be16(XFS_DINODE_MAGIC),
3460 mp, XFS_ERRTAG_IFLUSH_1)) {
3461 xfs_alert_tag(mp, XFS_PTAG_IFLUSH,
3462 "%s: Bad inode %Lu magic number 0x%x, ptr "PTR_FMT,
3463 __func__, ip->i_ino, be16_to_cpu(dip->di_magic), dip);
3464 goto corrupt_out;
3465 }
3466 if (S_ISREG(VFS_I(ip)->i_mode)) {
3467 if (XFS_TEST_ERROR(
3468 (ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS) &&
3469 (ip->i_d.di_format != XFS_DINODE_FMT_BTREE),
3470 mp, XFS_ERRTAG_IFLUSH_3)) {
3471 xfs_alert_tag(mp, XFS_PTAG_IFLUSH,
3472 "%s: Bad regular inode %Lu, ptr "PTR_FMT,
3473 __func__, ip->i_ino, ip);
3474 goto corrupt_out;
3475 }
3476 } else if (S_ISDIR(VFS_I(ip)->i_mode)) {
3477 if (XFS_TEST_ERROR(
3478 (ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS) &&
3479 (ip->i_d.di_format != XFS_DINODE_FMT_BTREE) &&
3480 (ip->i_d.di_format != XFS_DINODE_FMT_LOCAL),
3481 mp, XFS_ERRTAG_IFLUSH_4)) {
3482 xfs_alert_tag(mp, XFS_PTAG_IFLUSH,
3483 "%s: Bad directory inode %Lu, ptr "PTR_FMT,
3484 __func__, ip->i_ino, ip);
3485 goto corrupt_out;
3486 }
3487 }
3488 if (XFS_TEST_ERROR(ip->i_d.di_nextents + ip->i_d.di_anextents >
3489 ip->i_d.di_nblocks, mp, XFS_ERRTAG_IFLUSH_5)) {
3490 xfs_alert_tag(mp, XFS_PTAG_IFLUSH,
3491 "%s: detected corrupt incore inode %Lu, "
3492 "total extents = %d, nblocks = %Ld, ptr "PTR_FMT,
3493 __func__, ip->i_ino,
3494 ip->i_d.di_nextents + ip->i_d.di_anextents,
3495 ip->i_d.di_nblocks, ip);
3496 goto corrupt_out;
3497 }
3498 if (XFS_TEST_ERROR(ip->i_d.di_forkoff > mp->m_sb.sb_inodesize,
3499 mp, XFS_ERRTAG_IFLUSH_6)) {
3500 xfs_alert_tag(mp, XFS_PTAG_IFLUSH,
3501 "%s: bad inode %Lu, forkoff 0x%x, ptr "PTR_FMT,
3502 __func__, ip->i_ino, ip->i_d.di_forkoff, ip);
3503 goto corrupt_out;
3504 }
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515 if (ip->i_d.di_version < 3)
3516 ip->i_d.di_flushiter++;
3517
3518
3519 if (!xfs_inode_verify_forks(ip))
3520 goto corrupt_out;
3521
3522
3523
3524
3525
3526
3527 xfs_inode_to_disk(ip, dip, iip->ili_item.li_lsn);
3528
3529
3530 if (ip->i_d.di_flushiter == DI_MAX_FLUSH)
3531 ip->i_d.di_flushiter = 0;
3532
3533 xfs_iflush_fork(ip, dip, iip, XFS_DATA_FORK);
3534 if (XFS_IFORK_Q(ip))
3535 xfs_iflush_fork(ip, dip, iip, XFS_ATTR_FORK);
3536 xfs_inobp_check(mp, bp);
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563 iip->ili_last_fields = iip->ili_fields;
3564 iip->ili_fields = 0;
3565 iip->ili_fsync_fields = 0;
3566 iip->ili_logged = 1;
3567
3568 xfs_trans_ail_copy_lsn(mp->m_ail, &iip->ili_flush_lsn,
3569 &iip->ili_item.li_lsn);
3570
3571
3572
3573
3574
3575
3576
3577 xfs_buf_attach_iodone(bp, xfs_iflush_done, &iip->ili_item);
3578
3579
3580 xfs_dinode_calc_crc(mp, dip);
3581
3582 ASSERT(!list_empty(&bp->b_li_list));
3583 ASSERT(bp->b_iodone != NULL);
3584 return 0;
3585
3586corrupt_out:
3587 return -EFSCORRUPTED;
3588}
3589
3590
3591void
3592xfs_irele(
3593 struct xfs_inode *ip)
3594{
3595 trace_xfs_irele(ip, _RET_IP_);
3596 iput(VFS_I(ip));
3597}
3598