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