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, 0);
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 tp = xfs_trans_alloc(mp, XFS_TRANS_MKDIR);
1165 } else {
1166 resblks = XFS_CREATE_SPACE_RES(mp, name->len);
1167 tres = &M_RES(mp)->tr_create;
1168 tp = xfs_trans_alloc(mp, XFS_TRANS_CREATE);
1169 }
1170
1171
1172
1173
1174
1175
1176
1177 error = xfs_trans_reserve(tp, tres, resblks, 0);
1178 if (error == -ENOSPC) {
1179
1180 xfs_flush_inodes(mp);
1181 error = xfs_trans_reserve(tp, tres, resblks, 0);
1182 }
1183 if (error == -ENOSPC) {
1184
1185 resblks = 0;
1186 error = xfs_trans_reserve(tp, tres, 0, 0);
1187 }
1188 if (error)
1189 goto out_trans_cancel;
1190
1191
1192 xfs_ilock(dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL |
1193 XFS_IOLOCK_PARENT | XFS_ILOCK_PARENT);
1194 unlock_dp_on_error = true;
1195
1196 xfs_bmap_init(&free_list, &first_block);
1197
1198
1199
1200
1201 error = xfs_trans_reserve_quota(tp, mp, udqp, gdqp,
1202 pdqp, resblks, 1, 0);
1203 if (error)
1204 goto out_trans_cancel;
1205
1206 if (!resblks) {
1207 error = xfs_dir_canenter(tp, dp, name);
1208 if (error)
1209 goto out_trans_cancel;
1210 }
1211
1212
1213
1214
1215
1216
1217 error = xfs_dir_ialloc(&tp, dp, mode, is_dir ? 2 : 1, rdev,
1218 prid, resblks > 0, &ip, NULL);
1219 if (error)
1220 goto out_trans_cancel;
1221
1222
1223
1224
1225
1226
1227
1228
1229 xfs_trans_ijoin(tp, dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL);
1230 unlock_dp_on_error = false;
1231
1232 error = xfs_dir_createname(tp, dp, name, ip->i_ino,
1233 &first_block, &free_list, resblks ?
1234 resblks - XFS_IALLOC_SPACE_RES(mp) : 0);
1235 if (error) {
1236 ASSERT(error != -ENOSPC);
1237 goto out_trans_cancel;
1238 }
1239 xfs_trans_ichgtime(tp, dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
1240 xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE);
1241
1242 if (is_dir) {
1243 error = xfs_dir_init(tp, ip, dp);
1244 if (error)
1245 goto out_bmap_cancel;
1246
1247 error = xfs_bumplink(tp, dp);
1248 if (error)
1249 goto out_bmap_cancel;
1250 }
1251
1252
1253
1254
1255
1256
1257 if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC))
1258 xfs_trans_set_sync(tp);
1259
1260
1261
1262
1263
1264
1265 xfs_qm_vop_create_dqattach(tp, ip, udqp, gdqp, pdqp);
1266
1267 error = xfs_bmap_finish(&tp, &free_list, NULL);
1268 if (error)
1269 goto out_bmap_cancel;
1270
1271 error = xfs_trans_commit(tp);
1272 if (error)
1273 goto out_release_inode;
1274
1275 xfs_qm_dqrele(udqp);
1276 xfs_qm_dqrele(gdqp);
1277 xfs_qm_dqrele(pdqp);
1278
1279 *ipp = ip;
1280 return 0;
1281
1282 out_bmap_cancel:
1283 xfs_bmap_cancel(&free_list);
1284 out_trans_cancel:
1285 xfs_trans_cancel(tp);
1286 out_release_inode:
1287
1288
1289
1290
1291
1292 if (ip) {
1293 xfs_finish_inode_setup(ip);
1294 IRELE(ip);
1295 }
1296
1297 xfs_qm_dqrele(udqp);
1298 xfs_qm_dqrele(gdqp);
1299 xfs_qm_dqrele(pdqp);
1300
1301 if (unlock_dp_on_error)
1302 xfs_iunlock(dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL);
1303 return error;
1304}
1305
1306int
1307xfs_create_tmpfile(
1308 struct xfs_inode *dp,
1309 struct dentry *dentry,
1310 umode_t mode,
1311 struct xfs_inode **ipp)
1312{
1313 struct xfs_mount *mp = dp->i_mount;
1314 struct xfs_inode *ip = NULL;
1315 struct xfs_trans *tp = NULL;
1316 int error;
1317 prid_t prid;
1318 struct xfs_dquot *udqp = NULL;
1319 struct xfs_dquot *gdqp = NULL;
1320 struct xfs_dquot *pdqp = NULL;
1321 struct xfs_trans_res *tres;
1322 uint resblks;
1323
1324 if (XFS_FORCED_SHUTDOWN(mp))
1325 return -EIO;
1326
1327 prid = xfs_get_initial_prid(dp);
1328
1329
1330
1331
1332 error = xfs_qm_vop_dqalloc(dp, xfs_kuid_to_uid(current_fsuid()),
1333 xfs_kgid_to_gid(current_fsgid()), prid,
1334 XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT,
1335 &udqp, &gdqp, &pdqp);
1336 if (error)
1337 return error;
1338
1339 resblks = XFS_IALLOC_SPACE_RES(mp);
1340 tp = xfs_trans_alloc(mp, XFS_TRANS_CREATE_TMPFILE);
1341
1342 tres = &M_RES(mp)->tr_create_tmpfile;
1343 error = xfs_trans_reserve(tp, tres, resblks, 0);
1344 if (error == -ENOSPC) {
1345
1346 resblks = 0;
1347 error = xfs_trans_reserve(tp, tres, 0, 0);
1348 }
1349 if (error)
1350 goto out_trans_cancel;
1351
1352 error = xfs_trans_reserve_quota(tp, mp, udqp, gdqp,
1353 pdqp, resblks, 1, 0);
1354 if (error)
1355 goto out_trans_cancel;
1356
1357 error = xfs_dir_ialloc(&tp, dp, mode, 1, 0,
1358 prid, resblks > 0, &ip, NULL);
1359 if (error)
1360 goto out_trans_cancel;
1361
1362 if (mp->m_flags & XFS_MOUNT_WSYNC)
1363 xfs_trans_set_sync(tp);
1364
1365
1366
1367
1368
1369
1370 xfs_qm_vop_create_dqattach(tp, ip, udqp, gdqp, pdqp);
1371
1372 error = xfs_iunlink(tp, ip);
1373 if (error)
1374 goto out_trans_cancel;
1375
1376 error = xfs_trans_commit(tp);
1377 if (error)
1378 goto out_release_inode;
1379
1380 xfs_qm_dqrele(udqp);
1381 xfs_qm_dqrele(gdqp);
1382 xfs_qm_dqrele(pdqp);
1383
1384 *ipp = ip;
1385 return 0;
1386
1387 out_trans_cancel:
1388 xfs_trans_cancel(tp);
1389 out_release_inode:
1390
1391
1392
1393
1394
1395 if (ip) {
1396 xfs_finish_inode_setup(ip);
1397 IRELE(ip);
1398 }
1399
1400 xfs_qm_dqrele(udqp);
1401 xfs_qm_dqrele(gdqp);
1402 xfs_qm_dqrele(pdqp);
1403
1404 return error;
1405}
1406
1407int
1408xfs_link(
1409 xfs_inode_t *tdp,
1410 xfs_inode_t *sip,
1411 struct xfs_name *target_name)
1412{
1413 xfs_mount_t *mp = tdp->i_mount;
1414 xfs_trans_t *tp;
1415 int error;
1416 xfs_bmap_free_t free_list;
1417 xfs_fsblock_t first_block;
1418 int resblks;
1419
1420 trace_xfs_link(tdp, target_name);
1421
1422 ASSERT(!S_ISDIR(VFS_I(sip)->i_mode));
1423
1424 if (XFS_FORCED_SHUTDOWN(mp))
1425 return -EIO;
1426
1427 error = xfs_qm_dqattach(sip, 0);
1428 if (error)
1429 goto std_return;
1430
1431 error = xfs_qm_dqattach(tdp, 0);
1432 if (error)
1433 goto std_return;
1434
1435 tp = xfs_trans_alloc(mp, XFS_TRANS_LINK);
1436 resblks = XFS_LINK_SPACE_RES(mp, target_name->len);
1437 error = xfs_trans_reserve(tp, &M_RES(mp)->tr_link, resblks, 0);
1438 if (error == -ENOSPC) {
1439 resblks = 0;
1440 error = xfs_trans_reserve(tp, &M_RES(mp)->tr_link, 0, 0);
1441 }
1442 if (error)
1443 goto error_return;
1444
1445 xfs_ilock(tdp, XFS_IOLOCK_EXCL | XFS_IOLOCK_PARENT);
1446 xfs_lock_two_inodes(sip, tdp, XFS_ILOCK_EXCL);
1447
1448 xfs_trans_ijoin(tp, sip, XFS_ILOCK_EXCL);
1449 xfs_trans_ijoin(tp, tdp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL);
1450
1451
1452
1453
1454
1455
1456 if (unlikely((tdp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) &&
1457 (xfs_get_projid(tdp) != xfs_get_projid(sip)))) {
1458 error = -EXDEV;
1459 goto error_return;
1460 }
1461
1462 if (!resblks) {
1463 error = xfs_dir_canenter(tp, tdp, target_name);
1464 if (error)
1465 goto error_return;
1466 }
1467
1468 xfs_bmap_init(&free_list, &first_block);
1469
1470
1471
1472
1473 if (VFS_I(sip)->i_nlink == 0) {
1474 error = xfs_iunlink_remove(tp, sip);
1475 if (error)
1476 goto error_return;
1477 }
1478
1479 error = xfs_dir_createname(tp, tdp, target_name, sip->i_ino,
1480 &first_block, &free_list, resblks);
1481 if (error)
1482 goto error_return;
1483 xfs_trans_ichgtime(tp, tdp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
1484 xfs_trans_log_inode(tp, tdp, XFS_ILOG_CORE);
1485
1486 error = xfs_bumplink(tp, sip);
1487 if (error)
1488 goto error_return;
1489
1490
1491
1492
1493
1494
1495 if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC))
1496 xfs_trans_set_sync(tp);
1497
1498 error = xfs_bmap_finish(&tp, &free_list, NULL);
1499 if (error) {
1500 xfs_bmap_cancel(&free_list);
1501 goto error_return;
1502 }
1503
1504 return xfs_trans_commit(tp);
1505
1506 error_return:
1507 xfs_trans_cancel(tp);
1508 std_return:
1509 return error;
1510}
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533int
1534xfs_itruncate_extents(
1535 struct xfs_trans **tpp,
1536 struct xfs_inode *ip,
1537 int whichfork,
1538 xfs_fsize_t new_size)
1539{
1540 struct xfs_mount *mp = ip->i_mount;
1541 struct xfs_trans *tp = *tpp;
1542 xfs_bmap_free_t free_list;
1543 xfs_fsblock_t first_block;
1544 xfs_fileoff_t first_unmap_block;
1545 xfs_fileoff_t last_block;
1546 xfs_filblks_t unmap_len;
1547 int error = 0;
1548 int done = 0;
1549
1550 ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
1551 ASSERT(!atomic_read(&VFS_I(ip)->i_count) ||
1552 xfs_isilocked(ip, XFS_IOLOCK_EXCL));
1553 ASSERT(new_size <= XFS_ISIZE(ip));
1554 ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES);
1555 ASSERT(ip->i_itemp != NULL);
1556 ASSERT(ip->i_itemp->ili_lock_flags == 0);
1557 ASSERT(!XFS_NOT_DQATTACHED(mp, ip));
1558
1559 trace_xfs_itruncate_extents_start(ip, new_size);
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570 first_unmap_block = XFS_B_TO_FSB(mp, (xfs_ufsize_t)new_size);
1571 last_block = XFS_B_TO_FSB(mp, mp->m_super->s_maxbytes);
1572 if (first_unmap_block == last_block)
1573 return 0;
1574
1575 ASSERT(first_unmap_block < last_block);
1576 unmap_len = last_block - first_unmap_block + 1;
1577 while (!done) {
1578 xfs_bmap_init(&free_list, &first_block);
1579 error = xfs_bunmapi(tp, ip,
1580 first_unmap_block, unmap_len,
1581 xfs_bmapi_aflag(whichfork),
1582 XFS_ITRUNC_MAX_EXTENTS,
1583 &first_block, &free_list,
1584 &done);
1585 if (error)
1586 goto out_bmap_cancel;
1587
1588
1589
1590
1591
1592 error = xfs_bmap_finish(&tp, &free_list, ip);
1593 if (error)
1594 goto out_bmap_cancel;
1595
1596 error = xfs_trans_roll(&tp, ip);
1597 if (error)
1598 goto out;
1599 }
1600
1601
1602
1603
1604
1605 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
1606
1607 trace_xfs_itruncate_extents_end(ip, new_size);
1608
1609out:
1610 *tpp = tp;
1611 return error;
1612out_bmap_cancel:
1613
1614
1615
1616
1617
1618 xfs_bmap_cancel(&free_list);
1619 goto out;
1620}
1621
1622int
1623xfs_release(
1624 xfs_inode_t *ip)
1625{
1626 xfs_mount_t *mp = ip->i_mount;
1627 int error;
1628
1629 if (!S_ISREG(VFS_I(ip)->i_mode) || (VFS_I(ip)->i_mode == 0))
1630 return 0;
1631
1632
1633 if (mp->m_flags & XFS_MOUNT_RDONLY)
1634 return 0;
1635
1636 if (!XFS_FORCED_SHUTDOWN(mp)) {
1637 int truncated;
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649 truncated = xfs_iflags_test_and_clear(ip, XFS_ITRUNCATED);
1650 if (truncated) {
1651 xfs_iflags_clear(ip, XFS_IDIRTY_RELEASE);
1652 if (ip->i_delayed_blks > 0) {
1653 error = filemap_flush(VFS_I(ip)->i_mapping);
1654 if (error)
1655 return error;
1656 }
1657 }
1658 }
1659
1660 if (VFS_I(ip)->i_nlink == 0)
1661 return 0;
1662
1663 if (xfs_can_free_eofblocks(ip, false)) {
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686 if (xfs_iflags_test(ip, XFS_IDIRTY_RELEASE))
1687 return 0;
1688
1689 error = xfs_free_eofblocks(mp, ip, true);
1690 if (error && error != -EAGAIN)
1691 return error;
1692
1693
1694 if (ip->i_delayed_blks)
1695 xfs_iflags_set(ip, XFS_IDIRTY_RELEASE);
1696 }
1697 return 0;
1698}
1699
1700
1701
1702
1703
1704
1705STATIC int
1706xfs_inactive_truncate(
1707 struct xfs_inode *ip)
1708{
1709 struct xfs_mount *mp = ip->i_mount;
1710 struct xfs_trans *tp;
1711 int error;
1712
1713 tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE);
1714 error = xfs_trans_reserve(tp, &M_RES(mp)->tr_itruncate, 0, 0);
1715 if (error) {
1716 ASSERT(XFS_FORCED_SHUTDOWN(mp));
1717 xfs_trans_cancel(tp);
1718 return error;
1719 }
1720
1721 xfs_ilock(ip, XFS_ILOCK_EXCL);
1722 xfs_trans_ijoin(tp, ip, 0);
1723
1724
1725
1726
1727
1728
1729 ip->i_d.di_size = 0;
1730 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
1731
1732 error = xfs_itruncate_extents(&tp, ip, XFS_DATA_FORK, 0);
1733 if (error)
1734 goto error_trans_cancel;
1735
1736 ASSERT(ip->i_d.di_nextents == 0);
1737
1738 error = xfs_trans_commit(tp);
1739 if (error)
1740 goto error_unlock;
1741
1742 xfs_iunlock(ip, XFS_ILOCK_EXCL);
1743 return 0;
1744
1745error_trans_cancel:
1746 xfs_trans_cancel(tp);
1747error_unlock:
1748 xfs_iunlock(ip, XFS_ILOCK_EXCL);
1749 return error;
1750}
1751
1752
1753
1754
1755
1756
1757STATIC int
1758xfs_inactive_ifree(
1759 struct xfs_inode *ip)
1760{
1761 xfs_bmap_free_t free_list;
1762 xfs_fsblock_t first_block;
1763 struct xfs_mount *mp = ip->i_mount;
1764 struct xfs_trans *tp;
1765 int error;
1766
1767 tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE);
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784 tp->t_flags |= XFS_TRANS_RESERVE;
1785 error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ifree,
1786 XFS_IFREE_SPACE_RES(mp), 0);
1787 if (error) {
1788 if (error == -ENOSPC) {
1789 xfs_warn_ratelimited(mp,
1790 "Failed to remove inode(s) from unlinked list. "
1791 "Please free space, unmount and run xfs_repair.");
1792 } else {
1793 ASSERT(XFS_FORCED_SHUTDOWN(mp));
1794 }
1795 xfs_trans_cancel(tp);
1796 return error;
1797 }
1798
1799 xfs_ilock(ip, XFS_ILOCK_EXCL);
1800 xfs_trans_ijoin(tp, ip, 0);
1801
1802 xfs_bmap_init(&free_list, &first_block);
1803 error = xfs_ifree(tp, ip, &free_list);
1804 if (error) {
1805
1806
1807
1808
1809
1810 if (!XFS_FORCED_SHUTDOWN(mp)) {
1811 xfs_notice(mp, "%s: xfs_ifree returned error %d",
1812 __func__, error);
1813 xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR);
1814 }
1815 xfs_trans_cancel(tp);
1816 xfs_iunlock(ip, XFS_ILOCK_EXCL);
1817 return error;
1818 }
1819
1820
1821
1822
1823 xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_ICOUNT, -1);
1824
1825
1826
1827
1828
1829 error = xfs_bmap_finish(&tp, &free_list, NULL);
1830 if (error) {
1831 xfs_notice(mp, "%s: xfs_bmap_finish returned error %d",
1832 __func__, error);
1833 xfs_bmap_cancel(&free_list);
1834 }
1835 error = xfs_trans_commit(tp);
1836 if (error)
1837 xfs_notice(mp, "%s: xfs_trans_commit returned error %d",
1838 __func__, error);
1839
1840 xfs_iunlock(ip, XFS_ILOCK_EXCL);
1841 return 0;
1842}
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852void
1853xfs_inactive(
1854 xfs_inode_t *ip)
1855{
1856 struct xfs_mount *mp;
1857 int error;
1858 int truncate = 0;
1859
1860
1861
1862
1863
1864 if (VFS_I(ip)->i_mode == 0) {
1865 ASSERT(ip->i_df.if_real_bytes == 0);
1866 ASSERT(ip->i_df.if_broot_bytes == 0);
1867 return;
1868 }
1869
1870 mp = ip->i_mount;
1871
1872
1873 if (mp->m_flags & XFS_MOUNT_RDONLY)
1874 return;
1875
1876 if (VFS_I(ip)->i_nlink != 0) {
1877
1878
1879
1880
1881
1882 if (xfs_can_free_eofblocks(ip, true))
1883 xfs_free_eofblocks(mp, ip, false);
1884
1885 return;
1886 }
1887
1888 if (S_ISREG(VFS_I(ip)->i_mode) &&
1889 (ip->i_d.di_size != 0 || XFS_ISIZE(ip) != 0 ||
1890 ip->i_d.di_nextents > 0 || ip->i_delayed_blks > 0))
1891 truncate = 1;
1892
1893 error = xfs_qm_dqattach(ip, 0);
1894 if (error)
1895 return;
1896
1897 if (S_ISLNK(VFS_I(ip)->i_mode))
1898 error = xfs_inactive_symlink(ip);
1899 else if (truncate)
1900 error = xfs_inactive_truncate(ip);
1901 if (error)
1902 return;
1903
1904
1905
1906
1907
1908
1909 if (XFS_IFORK_Q(ip)) {
1910 error = xfs_attr_inactive(ip);
1911 if (error)
1912 return;
1913 }
1914
1915 ASSERT(!ip->i_afp);
1916 ASSERT(ip->i_d.di_anextents == 0);
1917 ASSERT(ip->i_d.di_forkoff == 0);
1918
1919
1920
1921
1922 error = xfs_inactive_ifree(ip);
1923 if (error)
1924 return;
1925
1926
1927
1928
1929 xfs_qm_dqdetach(ip);
1930}
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942STATIC int
1943xfs_iunlink(
1944 struct xfs_trans *tp,
1945 struct xfs_inode *ip)
1946{
1947 xfs_mount_t *mp = tp->t_mountp;
1948 xfs_agi_t *agi;
1949 xfs_dinode_t *dip;
1950 xfs_buf_t *agibp;
1951 xfs_buf_t *ibp;
1952 xfs_agino_t agino;
1953 short bucket_index;
1954 int offset;
1955 int error;
1956
1957 ASSERT(VFS_I(ip)->i_mode != 0);
1958
1959
1960
1961
1962
1963 error = xfs_read_agi(mp, tp, XFS_INO_TO_AGNO(mp, ip->i_ino), &agibp);
1964 if (error)
1965 return error;
1966 agi = XFS_BUF_TO_AGI(agibp);
1967
1968
1969
1970
1971
1972 agino = XFS_INO_TO_AGINO(mp, ip->i_ino);
1973 ASSERT(agino != 0);
1974 bucket_index = agino % XFS_AGI_UNLINKED_BUCKETS;
1975 ASSERT(agi->agi_unlinked[bucket_index]);
1976 ASSERT(be32_to_cpu(agi->agi_unlinked[bucket_index]) != agino);
1977
1978 if (agi->agi_unlinked[bucket_index] != cpu_to_be32(NULLAGINO)) {
1979
1980
1981
1982
1983
1984
1985 error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &dip, &ibp,
1986 0, 0);
1987 if (error)
1988 return error;
1989
1990 ASSERT(dip->di_next_unlinked == cpu_to_be32(NULLAGINO));
1991 dip->di_next_unlinked = agi->agi_unlinked[bucket_index];
1992 offset = ip->i_imap.im_boffset +
1993 offsetof(xfs_dinode_t, di_next_unlinked);
1994
1995
1996 xfs_dinode_calc_crc(mp, dip);
1997
1998 xfs_trans_inode_buf(tp, ibp);
1999 xfs_trans_log_buf(tp, ibp, offset,
2000 (offset + sizeof(xfs_agino_t) - 1));
2001 xfs_inobp_check(mp, ibp);
2002 }
2003
2004
2005
2006
2007 ASSERT(agino != 0);
2008 agi->agi_unlinked[bucket_index] = cpu_to_be32(agino);
2009 offset = offsetof(xfs_agi_t, agi_unlinked) +
2010 (sizeof(xfs_agino_t) * bucket_index);
2011 xfs_trans_buf_set_type(tp, agibp, XFS_BLFT_AGI_BUF);
2012 xfs_trans_log_buf(tp, agibp, offset,
2013 (offset + sizeof(xfs_agino_t) - 1));
2014 return 0;
2015}
2016
2017
2018
2019
2020STATIC int
2021xfs_iunlink_remove(
2022 xfs_trans_t *tp,
2023 xfs_inode_t *ip)
2024{
2025 xfs_ino_t next_ino;
2026 xfs_mount_t *mp;
2027 xfs_agi_t *agi;
2028 xfs_dinode_t *dip;
2029 xfs_buf_t *agibp;
2030 xfs_buf_t *ibp;
2031 xfs_agnumber_t agno;
2032 xfs_agino_t agino;
2033 xfs_agino_t next_agino;
2034 xfs_buf_t *last_ibp;
2035 xfs_dinode_t *last_dip = NULL;
2036 short bucket_index;
2037 int offset, last_offset = 0;
2038 int error;
2039
2040 mp = tp->t_mountp;
2041 agno = XFS_INO_TO_AGNO(mp, ip->i_ino);
2042
2043
2044
2045
2046
2047 error = xfs_read_agi(mp, tp, agno, &agibp);
2048 if (error)
2049 return error;
2050
2051 agi = XFS_BUF_TO_AGI(agibp);
2052
2053
2054
2055
2056
2057 agino = XFS_INO_TO_AGINO(mp, ip->i_ino);
2058 ASSERT(agino != 0);
2059 bucket_index = agino % XFS_AGI_UNLINKED_BUCKETS;
2060 ASSERT(agi->agi_unlinked[bucket_index] != cpu_to_be32(NULLAGINO));
2061 ASSERT(agi->agi_unlinked[bucket_index]);
2062
2063 if (be32_to_cpu(agi->agi_unlinked[bucket_index]) == agino) {
2064
2065
2066
2067
2068
2069
2070
2071 error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &dip, &ibp,
2072 0, 0);
2073 if (error) {
2074 xfs_warn(mp, "%s: xfs_imap_to_bp returned error %d.",
2075 __func__, error);
2076 return error;
2077 }
2078 next_agino = be32_to_cpu(dip->di_next_unlinked);
2079 ASSERT(next_agino != 0);
2080 if (next_agino != NULLAGINO) {
2081 dip->di_next_unlinked = cpu_to_be32(NULLAGINO);
2082 offset = ip->i_imap.im_boffset +
2083 offsetof(xfs_dinode_t, di_next_unlinked);
2084
2085
2086 xfs_dinode_calc_crc(mp, dip);
2087
2088 xfs_trans_inode_buf(tp, ibp);
2089 xfs_trans_log_buf(tp, ibp, offset,
2090 (offset + sizeof(xfs_agino_t) - 1));
2091 xfs_inobp_check(mp, ibp);
2092 } else {
2093 xfs_trans_brelse(tp, ibp);
2094 }
2095
2096
2097
2098 ASSERT(next_agino != 0);
2099 ASSERT(next_agino != agino);
2100 agi->agi_unlinked[bucket_index] = cpu_to_be32(next_agino);
2101 offset = offsetof(xfs_agi_t, agi_unlinked) +
2102 (sizeof(xfs_agino_t) * bucket_index);
2103 xfs_trans_buf_set_type(tp, agibp, XFS_BLFT_AGI_BUF);
2104 xfs_trans_log_buf(tp, agibp, offset,
2105 (offset + sizeof(xfs_agino_t) - 1));
2106 } else {
2107
2108
2109
2110 next_agino = be32_to_cpu(agi->agi_unlinked[bucket_index]);
2111 last_ibp = NULL;
2112 while (next_agino != agino) {
2113 struct xfs_imap imap;
2114
2115 if (last_ibp)
2116 xfs_trans_brelse(tp, last_ibp);
2117
2118 imap.im_blkno = 0;
2119 next_ino = XFS_AGINO_TO_INO(mp, agno, next_agino);
2120
2121 error = xfs_imap(mp, tp, next_ino, &imap, 0);
2122 if (error) {
2123 xfs_warn(mp,
2124 "%s: xfs_imap returned error %d.",
2125 __func__, error);
2126 return error;
2127 }
2128
2129 error = xfs_imap_to_bp(mp, tp, &imap, &last_dip,
2130 &last_ibp, 0, 0);
2131 if (error) {
2132 xfs_warn(mp,
2133 "%s: xfs_imap_to_bp returned error %d.",
2134 __func__, error);
2135 return error;
2136 }
2137
2138 last_offset = imap.im_boffset;
2139 next_agino = be32_to_cpu(last_dip->di_next_unlinked);
2140 ASSERT(next_agino != NULLAGINO);
2141 ASSERT(next_agino != 0);
2142 }
2143
2144
2145
2146
2147
2148 error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &dip, &ibp,
2149 0, 0);
2150 if (error) {
2151 xfs_warn(mp, "%s: xfs_imap_to_bp(2) returned error %d.",
2152 __func__, error);
2153 return error;
2154 }
2155 next_agino = be32_to_cpu(dip->di_next_unlinked);
2156 ASSERT(next_agino != 0);
2157 ASSERT(next_agino != agino);
2158 if (next_agino != NULLAGINO) {
2159 dip->di_next_unlinked = cpu_to_be32(NULLAGINO);
2160 offset = ip->i_imap.im_boffset +
2161 offsetof(xfs_dinode_t, di_next_unlinked);
2162
2163
2164 xfs_dinode_calc_crc(mp, dip);
2165
2166 xfs_trans_inode_buf(tp, ibp);
2167 xfs_trans_log_buf(tp, ibp, offset,
2168 (offset + sizeof(xfs_agino_t) - 1));
2169 xfs_inobp_check(mp, ibp);
2170 } else {
2171 xfs_trans_brelse(tp, ibp);
2172 }
2173
2174
2175
2176 last_dip->di_next_unlinked = cpu_to_be32(next_agino);
2177 ASSERT(next_agino != 0);
2178 offset = last_offset + offsetof(xfs_dinode_t, di_next_unlinked);
2179
2180
2181 xfs_dinode_calc_crc(mp, last_dip);
2182
2183 xfs_trans_inode_buf(tp, last_ibp);
2184 xfs_trans_log_buf(tp, last_ibp, offset,
2185 (offset + sizeof(xfs_agino_t) - 1));
2186 xfs_inobp_check(mp, last_ibp);
2187 }
2188 return 0;
2189}
2190
2191
2192
2193
2194
2195
2196STATIC int
2197xfs_ifree_cluster(
2198 xfs_inode_t *free_ip,
2199 xfs_trans_t *tp,
2200 struct xfs_icluster *xic)
2201{
2202 xfs_mount_t *mp = free_ip->i_mount;
2203 int blks_per_cluster;
2204 int inodes_per_cluster;
2205 int nbufs;
2206 int i, j;
2207 int ioffset;
2208 xfs_daddr_t blkno;
2209 xfs_buf_t *bp;
2210 xfs_inode_t *ip;
2211 xfs_inode_log_item_t *iip;
2212 xfs_log_item_t *lip;
2213 struct xfs_perag *pag;
2214 xfs_ino_t inum;
2215
2216 inum = xic->first_ino;
2217 pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, inum));
2218 blks_per_cluster = xfs_icluster_size_fsb(mp);
2219 inodes_per_cluster = blks_per_cluster << mp->m_sb.sb_inopblog;
2220 nbufs = mp->m_ialloc_blks / blks_per_cluster;
2221
2222 for (j = 0; j < nbufs; j++, inum += inodes_per_cluster) {
2223
2224
2225
2226
2227
2228 ioffset = inum - xic->first_ino;
2229 if ((xic->alloc & XFS_INOBT_MASK(ioffset)) == 0) {
2230 ASSERT(do_mod(ioffset, inodes_per_cluster) == 0);
2231 continue;
2232 }
2233
2234 blkno = XFS_AGB_TO_DADDR(mp, XFS_INO_TO_AGNO(mp, inum),
2235 XFS_INO_TO_AGBNO(mp, inum));
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245 bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, blkno,
2246 mp->m_bsize * blks_per_cluster,
2247 XBF_UNMAPPED);
2248
2249 if (!bp)
2250 return -ENOMEM;
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261 bp->b_ops = &xfs_inode_buf_ops;
2262
2263
2264
2265
2266
2267
2268
2269
2270 lip = bp->b_fspriv;
2271 while (lip) {
2272 if (lip->li_type == XFS_LI_INODE) {
2273 iip = (xfs_inode_log_item_t *)lip;
2274 ASSERT(iip->ili_logged == 1);
2275 lip->li_cb = xfs_istale_done;
2276 xfs_trans_ail_copy_lsn(mp->m_ail,
2277 &iip->ili_flush_lsn,
2278 &iip->ili_item.li_lsn);
2279 xfs_iflags_set(iip->ili_inode, XFS_ISTALE);
2280 }
2281 lip = lip->li_bio_list;
2282 }
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295 for (i = 0; i < inodes_per_cluster; i++) {
2296retry:
2297 rcu_read_lock();
2298 ip = radix_tree_lookup(&pag->pag_ici_root,
2299 XFS_INO_TO_AGINO(mp, (inum + i)));
2300
2301
2302 if (!ip) {
2303 rcu_read_unlock();
2304 continue;
2305 }
2306
2307
2308
2309
2310
2311
2312
2313
2314 spin_lock(&ip->i_flags_lock);
2315 if (ip->i_ino != inum + i ||
2316 __xfs_iflags_test(ip, XFS_ISTALE)) {
2317 spin_unlock(&ip->i_flags_lock);
2318 rcu_read_unlock();
2319 continue;
2320 }
2321 spin_unlock(&ip->i_flags_lock);
2322
2323
2324
2325
2326
2327
2328
2329
2330 if (ip != free_ip &&
2331 !xfs_ilock_nowait(ip, XFS_ILOCK_EXCL)) {
2332 rcu_read_unlock();
2333 delay(1);
2334 goto retry;
2335 }
2336 rcu_read_unlock();
2337
2338 xfs_iflock(ip);
2339 xfs_iflags_set(ip, XFS_ISTALE);
2340
2341
2342
2343
2344
2345 iip = ip->i_itemp;
2346 if (!iip || xfs_inode_clean(ip)) {
2347 ASSERT(ip != free_ip);
2348 xfs_ifunlock(ip);
2349 xfs_iunlock(ip, XFS_ILOCK_EXCL);
2350 continue;
2351 }
2352
2353 iip->ili_last_fields = iip->ili_fields;
2354 iip->ili_fields = 0;
2355 iip->ili_fsync_fields = 0;
2356 iip->ili_logged = 1;
2357 xfs_trans_ail_copy_lsn(mp->m_ail, &iip->ili_flush_lsn,
2358 &iip->ili_item.li_lsn);
2359
2360 xfs_buf_attach_iodone(bp, xfs_istale_done,
2361 &iip->ili_item);
2362
2363 if (ip != free_ip)
2364 xfs_iunlock(ip, XFS_ILOCK_EXCL);
2365 }
2366
2367 xfs_trans_stale_inode_buf(tp, bp);
2368 xfs_trans_binval(tp, bp);
2369 }
2370
2371 xfs_perag_put(pag);
2372 return 0;
2373}
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385int
2386xfs_ifree(
2387 xfs_trans_t *tp,
2388 xfs_inode_t *ip,
2389 xfs_bmap_free_t *flist)
2390{
2391 int error;
2392 struct xfs_icluster xic = { 0 };
2393
2394 ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
2395 ASSERT(VFS_I(ip)->i_nlink == 0);
2396 ASSERT(ip->i_d.di_nextents == 0);
2397 ASSERT(ip->i_d.di_anextents == 0);
2398 ASSERT(ip->i_d.di_size == 0 || !S_ISREG(VFS_I(ip)->i_mode));
2399 ASSERT(ip->i_d.di_nblocks == 0);
2400
2401
2402
2403
2404 error = xfs_iunlink_remove(tp, ip);
2405 if (error)
2406 return error;
2407
2408 error = xfs_difree(tp, ip->i_ino, flist, &xic);
2409 if (error)
2410 return error;
2411
2412 VFS_I(ip)->i_mode = 0;
2413 ip->i_d.di_flags = 0;
2414 ip->i_d.di_dmevmask = 0;
2415 ip->i_d.di_forkoff = 0;
2416 ip->i_d.di_format = XFS_DINODE_FMT_EXTENTS;
2417 ip->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS;
2418
2419
2420
2421
2422 VFS_I(ip)->i_generation++;
2423 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
2424
2425 if (xic.deleted)
2426 error = xfs_ifree_cluster(ip, tp, &xic);
2427
2428 return error;
2429}
2430
2431
2432
2433
2434
2435
2436static void
2437xfs_iunpin(
2438 struct xfs_inode *ip)
2439{
2440 ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED));
2441
2442 trace_xfs_inode_unpin_nowait(ip, _RET_IP_);
2443
2444
2445 xfs_log_force_lsn(ip->i_mount, ip->i_itemp->ili_last_lsn, 0);
2446
2447}
2448
2449static void
2450__xfs_iunpin_wait(
2451 struct xfs_inode *ip)
2452{
2453 wait_queue_head_t *wq = bit_waitqueue(&ip->i_flags, __XFS_IPINNED_BIT);
2454 DEFINE_WAIT_BIT(wait, &ip->i_flags, __XFS_IPINNED_BIT);
2455
2456 xfs_iunpin(ip);
2457
2458 do {
2459 prepare_to_wait(wq, &wait.wait, TASK_UNINTERRUPTIBLE);
2460 if (xfs_ipincount(ip))
2461 io_schedule();
2462 } while (xfs_ipincount(ip));
2463 finish_wait(wq, &wait.wait);
2464}
2465
2466void
2467xfs_iunpin_wait(
2468 struct xfs_inode *ip)
2469{
2470 if (xfs_ipincount(ip))
2471 __xfs_iunpin_wait(ip);
2472}
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501int
2502xfs_remove(
2503 xfs_inode_t *dp,
2504 struct xfs_name *name,
2505 xfs_inode_t *ip)
2506{
2507 xfs_mount_t *mp = dp->i_mount;
2508 xfs_trans_t *tp = NULL;
2509 int is_dir = S_ISDIR(VFS_I(ip)->i_mode);
2510 int error = 0;
2511 xfs_bmap_free_t free_list;
2512 xfs_fsblock_t first_block;
2513 uint resblks;
2514
2515 trace_xfs_remove(dp, name);
2516
2517 if (XFS_FORCED_SHUTDOWN(mp))
2518 return -EIO;
2519
2520 error = xfs_qm_dqattach(dp, 0);
2521 if (error)
2522 goto std_return;
2523
2524 error = xfs_qm_dqattach(ip, 0);
2525 if (error)
2526 goto std_return;
2527
2528 if (is_dir)
2529 tp = xfs_trans_alloc(mp, XFS_TRANS_RMDIR);
2530 else
2531 tp = xfs_trans_alloc(mp, XFS_TRANS_REMOVE);
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542 resblks = XFS_REMOVE_SPACE_RES(mp);
2543 error = xfs_trans_reserve(tp, &M_RES(mp)->tr_remove, resblks, 0);
2544 if (error == -ENOSPC) {
2545 resblks = 0;
2546 error = xfs_trans_reserve(tp, &M_RES(mp)->tr_remove, 0, 0);
2547 }
2548 if (error) {
2549 ASSERT(error != -ENOSPC);
2550 goto out_trans_cancel;
2551 }
2552
2553 xfs_ilock(dp, XFS_IOLOCK_EXCL | XFS_IOLOCK_PARENT);
2554 xfs_lock_two_inodes(dp, ip, XFS_ILOCK_EXCL);
2555
2556 xfs_trans_ijoin(tp, dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL);
2557 xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
2558
2559
2560
2561
2562 if (is_dir) {
2563 ASSERT(VFS_I(ip)->i_nlink >= 2);
2564 if (VFS_I(ip)->i_nlink != 2) {
2565 error = -ENOTEMPTY;
2566 goto out_trans_cancel;
2567 }
2568 if (!xfs_dir_isempty(ip)) {
2569 error = -ENOTEMPTY;
2570 goto out_trans_cancel;
2571 }
2572
2573
2574 error = xfs_droplink(tp, dp);
2575 if (error)
2576 goto out_trans_cancel;
2577
2578
2579 error = xfs_droplink(tp, ip);
2580 if (error)
2581 goto out_trans_cancel;
2582 } else {
2583
2584
2585
2586
2587
2588 xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE);
2589 }
2590 xfs_trans_ichgtime(tp, dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
2591
2592
2593 error = xfs_droplink(tp, ip);
2594 if (error)
2595 goto out_trans_cancel;
2596
2597 xfs_bmap_init(&free_list, &first_block);
2598 error = xfs_dir_removename(tp, dp, name, ip->i_ino,
2599 &first_block, &free_list, resblks);
2600 if (error) {
2601 ASSERT(error != -ENOENT);
2602 goto out_bmap_cancel;
2603 }
2604
2605
2606
2607
2608
2609
2610 if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC))
2611 xfs_trans_set_sync(tp);
2612
2613 error = xfs_bmap_finish(&tp, &free_list, NULL);
2614 if (error)
2615 goto out_bmap_cancel;
2616
2617 error = xfs_trans_commit(tp);
2618 if (error)
2619 goto std_return;
2620
2621 if (is_dir && xfs_inode_is_filestream(ip))
2622 xfs_filestream_deassociate(ip);
2623
2624 return 0;
2625
2626 out_bmap_cancel:
2627 xfs_bmap_cancel(&free_list);
2628 out_trans_cancel:
2629 xfs_trans_cancel(tp);
2630 std_return:
2631 return error;
2632}
2633
2634
2635
2636
2637#define __XFS_SORT_INODES 5
2638STATIC void
2639xfs_sort_for_rename(
2640 struct xfs_inode *dp1,
2641 struct xfs_inode *dp2,
2642 struct xfs_inode *ip1,
2643 struct xfs_inode *ip2,
2644 struct xfs_inode *wip,
2645 struct xfs_inode **i_tab,
2646 int *num_inodes)
2647{
2648 int i, j;
2649
2650 ASSERT(*num_inodes == __XFS_SORT_INODES);
2651 memset(i_tab, 0, *num_inodes * sizeof(struct xfs_inode *));
2652
2653
2654
2655
2656
2657
2658
2659
2660 i = 0;
2661 i_tab[i++] = dp1;
2662 i_tab[i++] = dp2;
2663 i_tab[i++] = ip1;
2664 if (ip2)
2665 i_tab[i++] = ip2;
2666 if (wip)
2667 i_tab[i++] = wip;
2668 *num_inodes = i;
2669
2670
2671
2672
2673
2674 for (i = 0; i < *num_inodes; i++) {
2675 for (j = 1; j < *num_inodes; j++) {
2676 if (i_tab[j]->i_ino < i_tab[j-1]->i_ino) {
2677 struct xfs_inode *temp = i_tab[j];
2678 i_tab[j] = i_tab[j-1];
2679 i_tab[j-1] = temp;
2680 }
2681 }
2682 }
2683}
2684
2685static int
2686xfs_finish_rename(
2687 struct xfs_trans *tp,
2688 struct xfs_bmap_free *free_list)
2689{
2690 int error;
2691
2692
2693
2694
2695
2696 if (tp->t_mountp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC))
2697 xfs_trans_set_sync(tp);
2698
2699 error = xfs_bmap_finish(&tp, free_list, NULL);
2700 if (error) {
2701 xfs_bmap_cancel(free_list);
2702 xfs_trans_cancel(tp);
2703 return error;
2704 }
2705
2706 return xfs_trans_commit(tp);
2707}
2708
2709
2710
2711
2712
2713
2714STATIC int
2715xfs_cross_rename(
2716 struct xfs_trans *tp,
2717 struct xfs_inode *dp1,
2718 struct xfs_name *name1,
2719 struct xfs_inode *ip1,
2720 struct xfs_inode *dp2,
2721 struct xfs_name *name2,
2722 struct xfs_inode *ip2,
2723 struct xfs_bmap_free *free_list,
2724 xfs_fsblock_t *first_block,
2725 int spaceres)
2726{
2727 int error = 0;
2728 int ip1_flags = 0;
2729 int ip2_flags = 0;
2730 int dp2_flags = 0;
2731
2732
2733 error = xfs_dir_replace(tp, dp1, name1,
2734 ip2->i_ino,
2735 first_block, free_list, spaceres);
2736 if (error)
2737 goto out_trans_abort;
2738
2739
2740 error = xfs_dir_replace(tp, dp2, name2,
2741 ip1->i_ino,
2742 first_block, free_list, spaceres);
2743 if (error)
2744 goto out_trans_abort;
2745
2746
2747
2748
2749
2750
2751 if (dp1 != dp2) {
2752 dp2_flags = XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG;
2753
2754 if (S_ISDIR(VFS_I(ip2)->i_mode)) {
2755 error = xfs_dir_replace(tp, ip2, &xfs_name_dotdot,
2756 dp1->i_ino, first_block,
2757 free_list, spaceres);
2758 if (error)
2759 goto out_trans_abort;
2760
2761
2762 if (!S_ISDIR(VFS_I(ip1)->i_mode)) {
2763 error = xfs_droplink(tp, dp2);
2764 if (error)
2765 goto out_trans_abort;
2766 error = xfs_bumplink(tp, dp1);
2767 if (error)
2768 goto out_trans_abort;
2769 }
2770
2771
2772
2773
2774
2775
2776
2777 ip1_flags |= XFS_ICHGTIME_CHG;
2778 ip2_flags |= XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG;
2779 }
2780
2781 if (S_ISDIR(VFS_I(ip1)->i_mode)) {
2782 error = xfs_dir_replace(tp, ip1, &xfs_name_dotdot,
2783 dp2->i_ino, first_block,
2784 free_list, spaceres);
2785 if (error)
2786 goto out_trans_abort;
2787
2788
2789 if (!S_ISDIR(VFS_I(ip2)->i_mode)) {
2790 error = xfs_droplink(tp, dp1);
2791 if (error)
2792 goto out_trans_abort;
2793 error = xfs_bumplink(tp, dp2);
2794 if (error)
2795 goto out_trans_abort;
2796 }
2797
2798
2799
2800
2801
2802
2803
2804 ip1_flags |= XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG;
2805 ip2_flags |= XFS_ICHGTIME_CHG;
2806 }
2807 }
2808
2809 if (ip1_flags) {
2810 xfs_trans_ichgtime(tp, ip1, ip1_flags);
2811 xfs_trans_log_inode(tp, ip1, XFS_ILOG_CORE);
2812 }
2813 if (ip2_flags) {
2814 xfs_trans_ichgtime(tp, ip2, ip2_flags);
2815 xfs_trans_log_inode(tp, ip2, XFS_ILOG_CORE);
2816 }
2817 if (dp2_flags) {
2818 xfs_trans_ichgtime(tp, dp2, dp2_flags);
2819 xfs_trans_log_inode(tp, dp2, XFS_ILOG_CORE);
2820 }
2821 xfs_trans_ichgtime(tp, dp1, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
2822 xfs_trans_log_inode(tp, dp1, XFS_ILOG_CORE);
2823 return xfs_finish_rename(tp, free_list);
2824
2825out_trans_abort:
2826 xfs_bmap_cancel(free_list);
2827 xfs_trans_cancel(tp);
2828 return error;
2829}
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839static int
2840xfs_rename_alloc_whiteout(
2841 struct xfs_inode *dp,
2842 struct xfs_inode **wip)
2843{
2844 struct xfs_inode *tmpfile;
2845 int error;
2846
2847 error = xfs_create_tmpfile(dp, NULL, S_IFCHR | WHITEOUT_MODE, &tmpfile);
2848 if (error)
2849 return error;
2850
2851
2852
2853
2854
2855
2856
2857 drop_nlink(VFS_I(tmpfile));
2858 xfs_finish_inode_setup(tmpfile);
2859 VFS_I(tmpfile)->i_state |= I_LINKABLE;
2860
2861 *wip = tmpfile;
2862 return 0;
2863}
2864
2865
2866
2867
2868int
2869xfs_rename(
2870 struct xfs_inode *src_dp,
2871 struct xfs_name *src_name,
2872 struct xfs_inode *src_ip,
2873 struct xfs_inode *target_dp,
2874 struct xfs_name *target_name,
2875 struct xfs_inode *target_ip,
2876 unsigned int flags)
2877{
2878 struct xfs_mount *mp = src_dp->i_mount;
2879 struct xfs_trans *tp;
2880 struct xfs_bmap_free free_list;
2881 xfs_fsblock_t first_block;
2882 struct xfs_inode *wip = NULL;
2883 struct xfs_inode *inodes[__XFS_SORT_INODES];
2884 int num_inodes = __XFS_SORT_INODES;
2885 bool new_parent = (src_dp != target_dp);
2886 bool src_is_directory = S_ISDIR(VFS_I(src_ip)->i_mode);
2887 int spaceres;
2888 int error;
2889
2890 trace_xfs_rename(src_dp, target_dp, src_name, target_name);
2891
2892 if ((flags & RENAME_EXCHANGE) && !target_ip)
2893 return -EINVAL;
2894
2895
2896
2897
2898
2899
2900 if (flags & RENAME_WHITEOUT) {
2901 ASSERT(!(flags & (RENAME_NOREPLACE | RENAME_EXCHANGE)));
2902 error = xfs_rename_alloc_whiteout(target_dp, &wip);
2903 if (error)
2904 return error;
2905
2906
2907 src_name->type = XFS_DIR3_FT_CHRDEV;
2908 }
2909
2910 xfs_sort_for_rename(src_dp, target_dp, src_ip, target_ip, wip,
2911 inodes, &num_inodes);
2912
2913 tp = xfs_trans_alloc(mp, XFS_TRANS_RENAME);
2914 spaceres = XFS_RENAME_SPACE_RES(mp, target_name->len);
2915 error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, spaceres, 0);
2916 if (error == -ENOSPC) {
2917 spaceres = 0;
2918 error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, 0, 0);
2919 }
2920 if (error)
2921 goto out_trans_cancel;
2922
2923
2924
2925
2926 error = xfs_qm_vop_rename_dqattach(inodes);
2927 if (error)
2928 goto out_trans_cancel;
2929
2930
2931
2932
2933
2934
2935
2936 if (!new_parent)
2937 xfs_ilock(src_dp, XFS_IOLOCK_EXCL | XFS_IOLOCK_PARENT);
2938 else
2939 xfs_lock_two_inodes(src_dp, target_dp,
2940 XFS_IOLOCK_EXCL | XFS_IOLOCK_PARENT);
2941
2942 xfs_lock_inodes(inodes, num_inodes, XFS_ILOCK_EXCL);
2943
2944
2945
2946
2947
2948
2949 xfs_trans_ijoin(tp, src_dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL);
2950 if (new_parent)
2951 xfs_trans_ijoin(tp, target_dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL);
2952 xfs_trans_ijoin(tp, src_ip, XFS_ILOCK_EXCL);
2953 if (target_ip)
2954 xfs_trans_ijoin(tp, target_ip, XFS_ILOCK_EXCL);
2955 if (wip)
2956 xfs_trans_ijoin(tp, wip, XFS_ILOCK_EXCL);
2957
2958
2959
2960
2961
2962
2963 if (unlikely((target_dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) &&
2964 (xfs_get_projid(target_dp) != xfs_get_projid(src_ip)))) {
2965 error = -EXDEV;
2966 goto out_trans_cancel;
2967 }
2968
2969 xfs_bmap_init(&free_list, &first_block);
2970
2971
2972 if (flags & RENAME_EXCHANGE)
2973 return xfs_cross_rename(tp, src_dp, src_name, src_ip,
2974 target_dp, target_name, target_ip,
2975 &free_list, &first_block, spaceres);
2976
2977
2978
2979
2980 if (target_ip == NULL) {
2981
2982
2983
2984
2985 if (!spaceres) {
2986 error = xfs_dir_canenter(tp, target_dp, target_name);
2987 if (error)
2988 goto out_trans_cancel;
2989 }
2990
2991
2992
2993
2994
2995 error = xfs_dir_createname(tp, target_dp, target_name,
2996 src_ip->i_ino, &first_block,
2997 &free_list, spaceres);
2998 if (error)
2999 goto out_bmap_cancel;
3000
3001 xfs_trans_ichgtime(tp, target_dp,
3002 XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
3003
3004 if (new_parent && src_is_directory) {
3005 error = xfs_bumplink(tp, target_dp);
3006 if (error)
3007 goto out_bmap_cancel;
3008 }
3009 } else {
3010
3011
3012
3013
3014
3015 if (S_ISDIR(VFS_I(target_ip)->i_mode)) {
3016
3017
3018
3019 if (!(xfs_dir_isempty(target_ip)) ||
3020 (VFS_I(target_ip)->i_nlink > 2)) {
3021 error = -EEXIST;
3022 goto out_trans_cancel;
3023 }
3024 }
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035 error = xfs_dir_replace(tp, target_dp, target_name,
3036 src_ip->i_ino,
3037 &first_block, &free_list, spaceres);
3038 if (error)
3039 goto out_bmap_cancel;
3040
3041 xfs_trans_ichgtime(tp, target_dp,
3042 XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
3043
3044
3045
3046
3047
3048 error = xfs_droplink(tp, target_ip);
3049 if (error)
3050 goto out_bmap_cancel;
3051
3052 if (src_is_directory) {
3053
3054
3055
3056 error = xfs_droplink(tp, target_ip);
3057 if (error)
3058 goto out_bmap_cancel;
3059 }
3060 }
3061
3062
3063
3064
3065 if (new_parent && src_is_directory) {
3066
3067
3068
3069
3070 error = xfs_dir_replace(tp, src_ip, &xfs_name_dotdot,
3071 target_dp->i_ino,
3072 &first_block, &free_list, spaceres);
3073 ASSERT(error != -EEXIST);
3074 if (error)
3075 goto out_bmap_cancel;
3076 }
3077
3078
3079
3080
3081
3082
3083
3084
3085 xfs_trans_ichgtime(tp, src_ip, XFS_ICHGTIME_CHG);
3086 xfs_trans_log_inode(tp, src_ip, XFS_ILOG_CORE);
3087
3088
3089
3090
3091
3092
3093 if (src_is_directory && (new_parent || target_ip != NULL)) {
3094
3095
3096
3097
3098
3099 error = xfs_droplink(tp, src_dp);
3100 if (error)
3101 goto out_bmap_cancel;
3102 }
3103
3104
3105
3106
3107
3108
3109 if (wip) {
3110 error = xfs_dir_replace(tp, src_dp, src_name, wip->i_ino,
3111 &first_block, &free_list, spaceres);
3112 } else
3113 error = xfs_dir_removename(tp, src_dp, src_name, src_ip->i_ino,
3114 &first_block, &free_list, spaceres);
3115 if (error)
3116 goto out_bmap_cancel;
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126 if (wip) {
3127 ASSERT(VFS_I(wip)->i_nlink == 0);
3128 error = xfs_bumplink(tp, wip);
3129 if (error)
3130 goto out_bmap_cancel;
3131 error = xfs_iunlink_remove(tp, wip);
3132 if (error)
3133 goto out_bmap_cancel;
3134 xfs_trans_log_inode(tp, wip, XFS_ILOG_CORE);
3135
3136
3137
3138
3139
3140
3141 VFS_I(wip)->i_state &= ~I_LINKABLE;
3142 }
3143
3144 xfs_trans_ichgtime(tp, src_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
3145 xfs_trans_log_inode(tp, src_dp, XFS_ILOG_CORE);
3146 if (new_parent)
3147 xfs_trans_log_inode(tp, target_dp, XFS_ILOG_CORE);
3148
3149 error = xfs_finish_rename(tp, &free_list);
3150 if (wip)
3151 IRELE(wip);
3152 return error;
3153
3154out_bmap_cancel:
3155 xfs_bmap_cancel(&free_list);
3156out_trans_cancel:
3157 xfs_trans_cancel(tp);
3158 if (wip)
3159 IRELE(wip);
3160 return error;
3161}
3162
3163STATIC int
3164xfs_iflush_cluster(
3165 xfs_inode_t *ip,
3166 xfs_buf_t *bp)
3167{
3168 xfs_mount_t *mp = ip->i_mount;
3169 struct xfs_perag *pag;
3170 unsigned long first_index, mask;
3171 unsigned long inodes_per_cluster;
3172 int ilist_size;
3173 xfs_inode_t **ilist;
3174 xfs_inode_t *iq;
3175 int nr_found;
3176 int clcount = 0;
3177 int bufwasdelwri;
3178 int i;
3179
3180 pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino));
3181
3182 inodes_per_cluster = mp->m_inode_cluster_size >> mp->m_sb.sb_inodelog;
3183 ilist_size = inodes_per_cluster * sizeof(xfs_inode_t *);
3184 ilist = kmem_alloc(ilist_size, KM_MAYFAIL|KM_NOFS);
3185 if (!ilist)
3186 goto out_put;
3187
3188 mask = ~(((mp->m_inode_cluster_size >> mp->m_sb.sb_inodelog)) - 1);
3189 first_index = XFS_INO_TO_AGINO(mp, ip->i_ino) & mask;
3190 rcu_read_lock();
3191
3192 nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, (void**)ilist,
3193 first_index, inodes_per_cluster);
3194 if (nr_found == 0)
3195 goto out_free;
3196
3197 for (i = 0; i < nr_found; i++) {
3198 iq = ilist[i];
3199 if (iq == ip)
3200 continue;
3201
3202
3203
3204
3205
3206
3207
3208 spin_lock(&ip->i_flags_lock);
3209 if (!ip->i_ino ||
3210 (XFS_INO_TO_AGINO(mp, iq->i_ino) & mask) != first_index) {
3211 spin_unlock(&ip->i_flags_lock);
3212 continue;
3213 }
3214 spin_unlock(&ip->i_flags_lock);
3215
3216
3217
3218
3219
3220
3221 if (xfs_inode_clean(iq) && xfs_ipincount(iq) == 0)
3222 continue;
3223
3224
3225
3226
3227
3228
3229 if (!xfs_ilock_nowait(iq, XFS_ILOCK_SHARED))
3230 continue;
3231 if (!xfs_iflock_nowait(iq)) {
3232 xfs_iunlock(iq, XFS_ILOCK_SHARED);
3233 continue;
3234 }
3235 if (xfs_ipincount(iq)) {
3236 xfs_ifunlock(iq);
3237 xfs_iunlock(iq, XFS_ILOCK_SHARED);
3238 continue;
3239 }
3240
3241
3242
3243
3244
3245 if (!xfs_inode_clean(iq)) {
3246 int error;
3247 error = xfs_iflush_int(iq, bp);
3248 if (error) {
3249 xfs_iunlock(iq, XFS_ILOCK_SHARED);
3250 goto cluster_corrupt_out;
3251 }
3252 clcount++;
3253 } else {
3254 xfs_ifunlock(iq);
3255 }
3256 xfs_iunlock(iq, XFS_ILOCK_SHARED);
3257 }
3258
3259 if (clcount) {
3260 XFS_STATS_INC(mp, xs_icluster_flushcnt);
3261 XFS_STATS_ADD(mp, xs_icluster_flushinode, clcount);
3262 }
3263
3264out_free:
3265 rcu_read_unlock();
3266 kmem_free(ilist);
3267out_put:
3268 xfs_perag_put(pag);
3269 return 0;
3270
3271
3272cluster_corrupt_out:
3273
3274
3275
3276
3277 rcu_read_unlock();
3278
3279
3280
3281
3282
3283 bufwasdelwri = (bp->b_flags & _XBF_DELWRI_Q);
3284 if (bufwasdelwri)
3285 xfs_buf_relse(bp);
3286
3287 xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
3288
3289 if (!bufwasdelwri) {
3290
3291
3292
3293
3294
3295 if (bp->b_iodone) {
3296 bp->b_flags &= ~XBF_DONE;
3297 xfs_buf_stale(bp);
3298 xfs_buf_ioerror(bp, -EIO);
3299 xfs_buf_ioend(bp);
3300 } else {
3301 xfs_buf_stale(bp);
3302 xfs_buf_relse(bp);
3303 }
3304 }
3305
3306
3307
3308
3309 xfs_iflush_abort(iq, false);
3310 kmem_free(ilist);
3311 xfs_perag_put(pag);
3312 return -EFSCORRUPTED;
3313}
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324int
3325xfs_iflush(
3326 struct xfs_inode *ip,
3327 struct xfs_buf **bpp)
3328{
3329 struct xfs_mount *mp = ip->i_mount;
3330 struct xfs_buf *bp;
3331 struct xfs_dinode *dip;
3332 int error;
3333
3334 XFS_STATS_INC(mp, xs_iflush_count);
3335
3336 ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED));
3337 ASSERT(xfs_isiflocked(ip));
3338 ASSERT(ip->i_d.di_format != XFS_DINODE_FMT_BTREE ||
3339 ip->i_d.di_nextents > XFS_IFORK_MAXEXT(ip, XFS_DATA_FORK));
3340
3341 *bpp = NULL;
3342
3343 xfs_iunpin_wait(ip);
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353 if (xfs_iflags_test(ip, XFS_ISTALE)) {
3354 xfs_ifunlock(ip);
3355 return 0;
3356 }
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366 if (XFS_FORCED_SHUTDOWN(mp)) {
3367 error = -EIO;
3368 goto abort_out;
3369 }
3370
3371
3372
3373
3374 error = xfs_imap_to_bp(mp, NULL, &ip->i_imap, &dip, &bp, XBF_TRYLOCK,
3375 0);
3376 if (error || !bp) {
3377 xfs_ifunlock(ip);
3378 return error;
3379 }
3380
3381
3382
3383
3384 error = xfs_iflush_int(ip, bp);
3385 if (error)
3386 goto corrupt_out;
3387
3388
3389
3390
3391
3392 if (xfs_buf_ispinned(bp))
3393 xfs_log_force(mp, 0);
3394
3395
3396
3397
3398
3399 error = xfs_iflush_cluster(ip, bp);
3400 if (error)
3401 goto cluster_corrupt_out;
3402
3403 *bpp = bp;
3404 return 0;
3405
3406corrupt_out:
3407 xfs_buf_relse(bp);
3408 xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
3409cluster_corrupt_out:
3410 error = -EFSCORRUPTED;
3411abort_out:
3412
3413
3414
3415 xfs_iflush_abort(ip, false);
3416 return error;
3417}
3418
3419STATIC int
3420xfs_iflush_int(
3421 struct xfs_inode *ip,
3422 struct xfs_buf *bp)
3423{
3424 struct xfs_inode_log_item *iip = ip->i_itemp;
3425 struct xfs_dinode *dip;
3426 struct xfs_mount *mp = ip->i_mount;
3427
3428 ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED));
3429 ASSERT(xfs_isiflocked(ip));
3430 ASSERT(ip->i_d.di_format != XFS_DINODE_FMT_BTREE ||
3431 ip->i_d.di_nextents > XFS_IFORK_MAXEXT(ip, XFS_DATA_FORK));
3432 ASSERT(iip != NULL && iip->ili_fields != 0);
3433 ASSERT(ip->i_d.di_version > 1);
3434
3435
3436 dip = xfs_buf_offset(bp, ip->i_imap.im_boffset);
3437
3438 if (XFS_TEST_ERROR(dip->di_magic != cpu_to_be16(XFS_DINODE_MAGIC),
3439 mp, XFS_ERRTAG_IFLUSH_1, XFS_RANDOM_IFLUSH_1)) {
3440 xfs_alert_tag(mp, XFS_PTAG_IFLUSH,
3441 "%s: Bad inode %Lu magic number 0x%x, ptr 0x%p",
3442 __func__, ip->i_ino, be16_to_cpu(dip->di_magic), dip);
3443 goto corrupt_out;
3444 }
3445 if (S_ISREG(VFS_I(ip)->i_mode)) {
3446 if (XFS_TEST_ERROR(
3447 (ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS) &&
3448 (ip->i_d.di_format != XFS_DINODE_FMT_BTREE),
3449 mp, XFS_ERRTAG_IFLUSH_3, XFS_RANDOM_IFLUSH_3)) {
3450 xfs_alert_tag(mp, XFS_PTAG_IFLUSH,
3451 "%s: Bad regular inode %Lu, ptr 0x%p",
3452 __func__, ip->i_ino, ip);
3453 goto corrupt_out;
3454 }
3455 } else if (S_ISDIR(VFS_I(ip)->i_mode)) {
3456 if (XFS_TEST_ERROR(
3457 (ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS) &&
3458 (ip->i_d.di_format != XFS_DINODE_FMT_BTREE) &&
3459 (ip->i_d.di_format != XFS_DINODE_FMT_LOCAL),
3460 mp, XFS_ERRTAG_IFLUSH_4, XFS_RANDOM_IFLUSH_4)) {
3461 xfs_alert_tag(mp, XFS_PTAG_IFLUSH,
3462 "%s: Bad directory inode %Lu, ptr 0x%p",
3463 __func__, ip->i_ino, ip);
3464 goto corrupt_out;
3465 }
3466 }
3467 if (XFS_TEST_ERROR(ip->i_d.di_nextents + ip->i_d.di_anextents >
3468 ip->i_d.di_nblocks, mp, XFS_ERRTAG_IFLUSH_5,
3469 XFS_RANDOM_IFLUSH_5)) {
3470 xfs_alert_tag(mp, XFS_PTAG_IFLUSH,
3471 "%s: detected corrupt incore inode %Lu, "
3472 "total extents = %d, nblocks = %Ld, ptr 0x%p",
3473 __func__, ip->i_ino,
3474 ip->i_d.di_nextents + ip->i_d.di_anextents,
3475 ip->i_d.di_nblocks, ip);
3476 goto corrupt_out;
3477 }
3478 if (XFS_TEST_ERROR(ip->i_d.di_forkoff > mp->m_sb.sb_inodesize,
3479 mp, XFS_ERRTAG_IFLUSH_6, XFS_RANDOM_IFLUSH_6)) {
3480 xfs_alert_tag(mp, XFS_PTAG_IFLUSH,
3481 "%s: bad inode %Lu, forkoff 0x%x, ptr 0x%p",
3482 __func__, ip->i_ino, ip->i_d.di_forkoff, ip);
3483 goto corrupt_out;
3484 }
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495 if (ip->i_d.di_version < 3)
3496 ip->i_d.di_flushiter++;
3497
3498
3499
3500
3501
3502
3503 xfs_inode_to_disk(ip, dip, iip->ili_item.li_lsn);
3504
3505
3506 if (ip->i_d.di_flushiter == DI_MAX_FLUSH)
3507 ip->i_d.di_flushiter = 0;
3508
3509 xfs_iflush_fork(ip, dip, iip, XFS_DATA_FORK);
3510 if (XFS_IFORK_Q(ip))
3511 xfs_iflush_fork(ip, dip, iip, XFS_ATTR_FORK);
3512 xfs_inobp_check(mp, bp);
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539 iip->ili_last_fields = iip->ili_fields;
3540 iip->ili_fields = 0;
3541 iip->ili_fsync_fields = 0;
3542 iip->ili_logged = 1;
3543
3544 xfs_trans_ail_copy_lsn(mp->m_ail, &iip->ili_flush_lsn,
3545 &iip->ili_item.li_lsn);
3546
3547
3548
3549
3550
3551
3552
3553 xfs_buf_attach_iodone(bp, xfs_iflush_done, &iip->ili_item);
3554
3555
3556 xfs_dinode_calc_crc(mp, dip);
3557
3558 ASSERT(bp->b_fspriv != NULL);
3559 ASSERT(bp->b_iodone != NULL);
3560 return 0;
3561
3562corrupt_out:
3563 return -EFSCORRUPTED;
3564}
3565