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