56 #define SYMLINK_MAPS 2
63 xfs_mount_t *
mp = ip->i_mount;
64 int pathlen = ip->i_d.di_size;
78 for (n = 0; n < nmaps; n++) {
82 bp = xfs_buf_read(mp->m_ddev_targp, d,
BTOBB(byte_cnt), 0);
91 if (pathlen < byte_cnt)
99 link[ip->i_d.di_size] =
'\0';
111 xfs_mount_t *
mp = ip->i_mount;
115 trace_xfs_readlink(ip);
117 if (XFS_FORCED_SHUTDOWN(mp))
122 pathlen = ip->i_d.di_size;
127 xfs_alert(mp,
"%s: inode (%llu) bad symlink length (%lld)",
128 __func__, (
unsigned long long) ip->i_ino,
129 (
long long) pathlen);
137 memcpy(link, ip->i_df.if_u1.if_data, pathlen);
138 link[pathlen] =
'\0';
173 if (last_fsb <= end_fsb)
175 map_len = last_fsb - end_fsb;
182 if (!error && (nimaps != 0) &&
184 ip->i_delayed_blks)) {
211 ASSERT(XFS_FORCED_SHUTDOWN(mp));
281 ASSERT(ip->i_d.di_nextents > 0 && ip->i_d.di_nextents <= 2);
289 size = (
int)ip->i_d.di_size;
296 xfs_bmap_init(&free_list, &first_block);
305 for (i = 0; i < nmaps; i++) {
306 bp = xfs_trans_get_buf(tp, mp->m_ddev_targp,
319 &first_block, &free_list, &done)))
353 ASSERT(XFS_FORCED_SHUTDOWN(mp));
365 if (ip->i_df.if_bytes)
367 ASSERT(ip->i_df.if_bytes == 0);
374 ASSERT(XFS_FORCED_SHUTDOWN(mp));
392 xfs_mount_t *
mp = ip->i_mount;
395 if (!
S_ISREG(ip->i_d.di_mode) || (ip->i_d.di_mode == 0))
399 if (mp->m_flags & XFS_MOUNT_RDONLY)
402 if (!XFS_FORCED_SHUTDOWN(mp)) {
412 if ((ip->i_d.di_nlink == 0) && xfs_inode_is_filestream(ip))
425 truncated = xfs_iflags_test_and_clear(ip, XFS_ITRUNCATED);
427 xfs_iflags_clear(ip, XFS_IDIRTY_RELEASE);
428 if (
VN_DIRTY(VFS_I(ip)) && ip->i_delayed_blks > 0)
433 if (ip->i_d.di_nlink == 0)
436 if ((
S_ISREG(ip->i_d.di_mode) &&
437 (VFS_I(ip)->i_size > 0 ||
438 (
VN_CACHED(VFS_I(ip)) > 0 || ip->i_delayed_blks > 0)) &&
463 if (xfs_iflags_test(ip, XFS_IDIRTY_RELEASE))
471 if (ip->i_delayed_blks)
472 xfs_iflags_set(ip, XFS_IDIRTY_RELEASE);
502 ASSERT(ip->i_df.if_real_bytes == 0);
503 ASSERT(ip->i_df.if_broot_bytes == 0);
512 if (mp->m_flags & XFS_MOUNT_RDONLY)
515 if (ip->i_d.di_nlink != 0) {
516 if ((
S_ISREG(ip->i_d.di_mode) &&
517 (VFS_I(ip)->i_size > 0 ||
518 (
VN_CACHED(VFS_I(ip)) > 0 || ip->i_delayed_blks > 0)) &&
520 (!(ip->i_d.di_flags &
522 ip->i_delayed_blks != 0))) {
530 if (
S_ISREG(ip->i_d.di_mode) &&
531 (ip->i_d.di_size != 0 || XFS_ISIZE(ip) != 0 ||
532 ip->i_d.di_nextents > 0 || ip->i_delayed_blks > 0))
541 (truncate ||
S_ISLNK(ip->i_d.di_mode)) ?
548 ASSERT(XFS_FORCED_SHUTDOWN(mp));
556 if (
S_ISLNK(ip->i_d.di_mode)) {
564 }
else if (ip->i_df.if_bytes > 0) {
567 ASSERT(ip->i_df.if_bytes == 0);
569 }
else if (truncate) {
577 ASSERT(ip->i_d.di_nextents == 0);
586 if (ip->i_d.di_anextents > 0) {
587 ASSERT(ip->i_d.di_forkoff != 0);
616 ASSERT(ip->i_d.di_anextents == 0);
621 xfs_bmap_init(&free_list, &first_block);
629 if (!XFS_FORCED_SHUTDOWN(mp)) {
630 xfs_notice(mp,
"%s: xfs_ifree returned error %d",
632 xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR);
648 xfs_notice(mp,
"%s: xfs_bmap_finish returned error %d",
652 xfs_notice(mp,
"%s: xfs_trans_commit returned error %d",
686 trace_xfs_lookup(dp, name);
688 if (XFS_FORCED_SHUTDOWN(dp->i_mount))
721 struct xfs_mount *
mp = dp->i_mount;
722 struct xfs_inode *
ip =
NULL;
723 struct xfs_trans *tp =
NULL;
727 boolean_t unlock_dp_on_error = B_FALSE;
737 trace_xfs_create(dp, name);
739 if (XFS_FORCED_SHUTDOWN(mp))
743 prid = xfs_get_projid(dp);
792 goto out_trans_cancel;
795 xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT);
796 unlock_dp_on_error = B_TRUE;
798 xfs_bmap_init(&free_list, &first_block);
803 error = xfs_trans_reserve_quota(tp, mp, udqp, gdqp, resblks, 1, 0);
805 goto out_trans_cancel;
809 goto out_trans_cancel;
817 prid, resblks > 0, &ip, &committed);
820 goto out_trans_cancel;
821 goto out_trans_abort;
832 unlock_dp_on_error = B_FALSE;
835 &first_block, &free_list, resblks ?
839 goto out_trans_abort;
847 goto out_bmap_cancel;
851 goto out_bmap_cancel;
859 if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC))
860 xfs_trans_set_sync(tp);
871 goto out_bmap_cancel;
875 goto out_release_inode;
901 if (unlock_dp_on_error)
908 int xfs_small_retries;
909 int xfs_middle_retries;
910 int xfs_lots_retries;
919 xfs_lock_inumorder(
int lock_mode,
int subclass)
921 if (lock_mode & (XFS_IOLOCK_SHARED|XFS_IOLOCK_EXCL))
922 lock_mode |= (subclass + XFS_LOCK_INUMORDER) << XFS_IOLOCK_SHIFT;
923 if (lock_mode & (XFS_ILOCK_SHARED|XFS_ILOCK_EXCL))
924 lock_mode |= (subclass + XFS_LOCK_INUMORDER) << XFS_ILOCK_SHIFT;
946 int attempts = 0,
i,
j, try_lock;
949 ASSERT(ips && (inodes >= 2));
955 for (;
i < inodes;
i++) {
958 if (i && (ips[i] == ips[i-1]))
968 for (j = (i - 1); j >= 0 && !try_lock; j--) {
969 lp = (xfs_log_item_t *)ips[j]->i_itemp;
970 if (lp && (lp->li_flags & XFS_LI_IN_AIL)) {
999 for(j = i - 1; j >= 0; j--) {
1007 if ((j != (i - 1)) && ips[j] ==
1014 if ((attempts % 5) == 0) {
1025 xfs_ilock(ips[i], xfs_lock_inumorder(lock_mode, i));
1031 if (attempts < 5) xfs_small_retries++;
1032 else if (attempts < 100) xfs_middle_retries++;
1033 else xfs_lots_retries++;
1056 if (lock_mode & (XFS_IOLOCK_SHARED|XFS_IOLOCK_EXCL))
1057 ASSERT((lock_mode & (XFS_ILOCK_SHARED|XFS_ILOCK_EXCL)) == 0);
1058 ASSERT(ip0->i_ino != ip1->i_ino);
1060 if (ip0->i_ino > ip1->i_ino) {
1067 xfs_ilock(ip0, xfs_lock_inumorder(lock_mode, 0));
1074 lp = (xfs_log_item_t *)ip0->i_itemp;
1075 if (lp && (lp->li_flags & XFS_LI_IN_AIL)) {
1078 if ((++attempts % 5) == 0)
1083 xfs_ilock(ip1, xfs_lock_inumorder(lock_mode, 1));
1093 xfs_mount_t *
mp = dp->i_mount;
1094 xfs_trans_t *tp =
NULL;
1095 int is_dir =
S_ISDIR(ip->i_d.di_mode);
1105 trace_xfs_remove(dp, name);
1107 if (XFS_FORCED_SHUTDOWN(mp))
1147 goto out_trans_cancel;
1159 ASSERT(ip->i_d.di_nlink >= 2);
1160 if (ip->i_d.di_nlink != 2) {
1162 goto out_trans_cancel;
1166 goto out_trans_cancel;
1170 xfs_bmap_init(&free_list, &first_block);
1172 &first_block, &free_list, resblks);
1175 goto out_bmap_cancel;
1185 goto out_bmap_cancel;
1192 goto out_bmap_cancel;
1207 goto out_bmap_cancel;
1213 link_zero = (ip->i_d.di_nlink == 0);
1220 if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC))
1221 xfs_trans_set_sync(tp);
1225 goto out_bmap_cancel;
1237 if (!is_dir && link_zero && xfs_inode_is_filestream(ip))
1257 xfs_mount_t *
mp = tdp->i_mount;
1266 trace_xfs_link(tdp, target_name);
1270 if (XFS_FORCED_SHUTDOWN(mp))
1307 (xfs_get_projid(tdp) != xfs_get_projid(sip)))) {
1316 xfs_bmap_init(&free_list, &first_block);
1319 &first_block, &free_list, resblks);
1334 if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC)) {
1335 xfs_trans_set_sync(tp);
1358 const char *target_path,
1362 xfs_mount_t *
mp = dp->i_mount;
1369 boolean_t unlock_dp_on_error = B_FALSE;
1377 const char *cur_chunk;
1390 trace_xfs_symlink(dp, link_name);
1392 if (XFS_FORCED_SHUTDOWN(mp))
1398 pathlen =
strlen(target_path);
1404 prid = xfs_get_projid(dp);
1429 if (error ==
ENOSPC && fs_blocks == 0) {
1439 xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT);
1440 unlock_dp_on_error = B_TRUE;
1453 error = xfs_trans_reserve_quota(tp, mp, udqp, gdqp, resblks, 1, 0);
1467 xfs_bmap_init(&free_list, &first_block);
1473 prid, resblks > 0, &ip,
NULL);
1486 unlock_dp_on_error = B_FALSE;
1500 memcpy(ip->i_df.if_u1.if_data, target_path, pathlen);
1501 ip->i_d.di_size = pathlen;
1518 mval, &nmaps, &free_list);
1523 resblks -= fs_blocks;
1524 ip->i_d.di_size = pathlen;
1527 cur_chunk = target_path;
1528 for (n = 0; n < nmaps; n++) {
1531 bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, d,
1532 BTOBB(byte_cnt), 0);
1537 if (pathlen < byte_cnt) {
1540 pathlen -= byte_cnt;
1543 cur_chunk += byte_cnt;
1553 &first_block, &free_list, resblks);
1564 if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC)) {
1565 xfs_trans_set_sync(tp);
1589 if (unlock_dp_on_error)
1601 xfs_mount_t *
mp = ip->i_mount;
1608 if (XFS_FORCED_SHUTDOWN(mp))
1620 ip->i_d.di_dmevmask = evmask;
1621 ip->i_d.di_dmstate =
state;
1656 xfs_mount_t *
mp = ip->i_mount;
1669 uint qblocks, resblks, resrtextents;
1673 trace_xfs_alloc_file_space(ip);
1675 if (XFS_FORCED_SHUTDOWN(mp))
1697 while (allocatesize_fsb && !error) {
1704 s = startoffset_fsb;
1707 e = startoffset_fsb + allocatesize_fsb;
1708 if ((temp =
do_mod(startoffset_fsb, extsz)))
1710 if ((temp =
do_mod(e, extsz)))
1714 e = allocatesize_fsb;
1726 resrtextents = qblocks = resblks;
1727 resrtextents /= mp->m_sb.sb_rextsize;
1763 xfs_bmap_init(&free_list, &firstfsb);
1765 allocatesize_fsb, alloc_type, &firstfsb,
1766 0, imapp, &nimaps, &free_list);
1792 startoffset_fsb += allocated_fsb;
1793 allocatesize_fsb -= allocated_fsb;
1800 xfs_trans_unreserve_quota_nblks(tp, ip, (
long)qblocks, 0, quota_flag);
1827 xfs_off_t lastoffset;
1830 xfs_mount_t *
mp = ip->i_mount;
1839 if (startoff >= XFS_ISIZE(ip))
1842 if (endoff > XFS_ISIZE(ip))
1843 endoff = XFS_ISIZE(ip);
1846 mp->m_rtdev_targp : mp->m_ddev_targp,
1847 BTOBB(mp->m_sb.sb_blocksize), 0);
1853 for (offset = startoff; offset <= endoff; offset = lastoffset + 1) {
1857 if (error || nimap < 1)
1862 if (lastoffset > endoff)
1863 lastoffset = endoff;
1877 "xfs_zero_remaining_bytes(read)");
1882 0, lastoffset - offset + 1);
1890 "xfs_zero_remaining_bytes(write)");
1933 int need_iolock = 1;
1937 trace_xfs_free_file_space(ip);
1959 ioffset = offset & ~(rounding - 1);
1964 goto out_unlock_iolock;
1973 if (rt && !xfs_sb_version_hasextflgbit(&mp->m_sb)) {
1978 goto out_unlock_iolock;
1979 ASSERT(nimap == 0 || nimap == 1);
1985 mod =
do_div(block, mp->m_sb.sb_rextsize);
1987 startoffset_fsb += mp->m_sb.sb_rextsize -
mod;
1993 goto out_unlock_iolock;
1994 ASSERT(nimap == 0 || nimap == 1);
1998 if (mod && (mod != mp->m_sb.sb_rextsize))
1999 endoffset_fsb -=
mod;
2002 if ((done = (endoffset_fsb <= startoffset_fsb)))
2025 while (!error && !done) {
2053 error = xfs_trans_reserve_quota(tp, mp,
2054 ip->i_udquot, ip->i_gdquot,
2064 xfs_bmap_init(&free_list, &firstfsb);
2066 endoffset_fsb - startoffset_fsb,
2067 0, 2, &firstfsb, &free_list, &done);
2093 xfs_iunlock(ip, need_iolock ? (XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL) :
2117 xfs_mount_t *
mp = ip->i_mount;
2122 xfs_off_t startoffset;
2128 if (!
S_ISREG(ip->i_d.di_mode))
2147 bf->
l_start > mp->m_super->s_maxbytes ||
2149 bf->
l_start + llen > mp->m_super->s_maxbytes)
2155 fsize = XFS_ISIZE(ip);
2168 setprealloc = clrprealloc = 0;
2179 prealloc_type, attr_flags);
2207 if (startoffset > fsize) {
2209 startoffset - fsize, 0,
2260 if (ip->i_d.di_mode &
S_IXGRP)
2267 else if (clrprealloc)
2272 xfs_trans_set_sync(tp);