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