Lines Matching +full:tp +full:- +full:link

1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2000-2006 Silicon Graphics, Inc.
4 * Copyright (c) 2012-2013 Red Hat, Inc.
27 /* ----- Kernel only functions below ----- */
31 char *link) in xfs_readlink_bmap_ilocked() argument
33 struct xfs_mount *mp = ip->i_mount; in xfs_readlink_bmap_ilocked()
38 int pathlen = ip->i_disk_size; in xfs_readlink_bmap_ilocked()
58 error = xfs_buf_read(mp->m_ddev_targp, d, BTOBB(byte_cnt), 0, in xfs_readlink_bmap_ilocked()
66 cur_chunk = bp->b_addr; in xfs_readlink_bmap_ilocked()
68 if (!xfs_symlink_hdr_ok(ip->i_ino, offset, in xfs_readlink_bmap_ilocked()
70 error = -EFSCORRUPTED; in xfs_readlink_bmap_ilocked()
73 offset, byte_cnt, ip->i_ino); in xfs_readlink_bmap_ilocked()
82 memcpy(link + offset, cur_chunk, byte_cnt); in xfs_readlink_bmap_ilocked()
84 pathlen -= byte_cnt; in xfs_readlink_bmap_ilocked()
91 link[ip->i_disk_size] = '\0'; in xfs_readlink_bmap_ilocked()
101 char *link) in xfs_readlink() argument
103 struct xfs_mount *mp = ip->i_mount; in xfs_readlink()
105 int error = -EFSCORRUPTED; in xfs_readlink()
110 return -EIO; in xfs_readlink()
114 pathlen = ip->i_disk_size; in xfs_readlink()
120 __func__, (unsigned long long) ip->i_ino, in xfs_readlink()
126 if (ip->i_df.if_format == XFS_DINODE_FMT_LOCAL) { in xfs_readlink()
128 * The VFS crashes on a NULL pointer, so return -EFSCORRUPTED in xfs_readlink()
131 if (XFS_IS_CORRUPT(ip->i_mount, !ip->i_df.if_u1.if_data)) in xfs_readlink()
134 memcpy(link, ip->i_df.if_u1.if_data, pathlen + 1); in xfs_readlink()
137 error = xfs_readlink_bmap_ilocked(ip, link); in xfs_readlink()
154 struct xfs_mount *mp = dp->i_mount; in xfs_symlink()
155 struct xfs_trans *tp = NULL; in xfs_symlink() local
181 return -EIO; in xfs_symlink()
188 return -ENAMETOOLONG; in xfs_symlink()
213 resblks = XFS_SYMLINK_SPACE_RES(mp, link_name->len, fs_blocks); in xfs_symlink()
215 error = xfs_trans_alloc_icreate(mp, &M_RES(mp)->tr_symlink, udqp, gdqp, in xfs_symlink()
216 pdqp, resblks, &tp); in xfs_symlink()
226 if (dp->i_diflags & XFS_DIFLAG_NOSYMLINKS) { in xfs_symlink()
227 error = -EPERM; in xfs_symlink()
234 error = xfs_dialloc(&tp, dp->i_ino, S_IFLNK, &ino); in xfs_symlink()
236 error = xfs_init_new_inode(idmap, tp, dp, ino, in xfs_symlink()
249 xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); in xfs_symlink()
255 xfs_qm_vop_create_dqattach(tp, ip, udqp, gdqp, pdqp); in xfs_symlink()
257 resblks -= XFS_IALLOC_SPACE_RES(mp); in xfs_symlink()
264 ip->i_disk_size = pathlen; in xfs_symlink()
265 ip->i_df.if_format = XFS_DINODE_FMT_LOCAL; in xfs_symlink()
266 xfs_trans_log_inode(tp, ip, XFS_ILOG_DDATA | XFS_ILOG_CORE); in xfs_symlink()
273 error = xfs_bmapi_write(tp, ip, first_fsb, fs_blocks, in xfs_symlink()
278 resblks -= fs_blocks; in xfs_symlink()
279 ip->i_disk_size = pathlen; in xfs_symlink()
280 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); in xfs_symlink()
289 error = xfs_trans_get_buf(tp, mp->m_ddev_targp, d, in xfs_symlink()
293 bp->b_ops = &xfs_symlink_buf_ops; in xfs_symlink()
298 buf = bp->b_addr; in xfs_symlink()
299 buf += xfs_symlink_hdr_set(mp, ip->i_ino, offset, in xfs_symlink()
305 pathlen -= byte_cnt; in xfs_symlink()
308 xfs_trans_buf_set_type(tp, bp, XFS_BLFT_SYMLINK_BUF); in xfs_symlink()
309 xfs_trans_log_buf(tp, bp, 0, (buf + byte_cnt - 1) - in xfs_symlink()
310 (char *)bp->b_addr); in xfs_symlink()
314 i_size_write(VFS_I(ip), ip->i_disk_size); in xfs_symlink()
319 error = xfs_dir_createname(tp, dp, link_name, ip->i_ino, resblks); in xfs_symlink()
322 xfs_trans_ichgtime(tp, dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); in xfs_symlink()
323 xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); in xfs_symlink()
331 xfs_trans_set_sync(tp); in xfs_symlink()
333 error = xfs_trans_commit(tp); in xfs_symlink()
345 xfs_trans_cancel(tp); in xfs_symlink()
373 * but allows us to catch corrupt zero-length symlinks in the verifiers.
387 xfs_trans_t *tp; in xfs_inactive_symlink_rmt() local
389 mp = ip->i_mount; in xfs_inactive_symlink_rmt()
390 ASSERT(!xfs_need_iread_extents(&ip->i_df)); in xfs_inactive_symlink_rmt()
398 ASSERT(ip->i_df.if_nextents > 0 && ip->i_df.if_nextents <= 2); in xfs_inactive_symlink_rmt()
400 error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate, 0, 0, 0, &tp); in xfs_inactive_symlink_rmt()
405 xfs_trans_ijoin(tp, ip, 0); in xfs_inactive_symlink_rmt()
413 size = (int)ip->i_disk_size; in xfs_inactive_symlink_rmt()
414 ip->i_disk_size = 0; in xfs_inactive_symlink_rmt()
415 VFS_I(ip)->i_mode = (VFS_I(ip)->i_mode & ~S_IFMT) | S_IFREG; in xfs_inactive_symlink_rmt()
416 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); in xfs_inactive_symlink_rmt()
430 error = xfs_trans_get_buf(tp, mp->m_ddev_targp, in xfs_inactive_symlink_rmt()
436 xfs_trans_binval(tp, bp); in xfs_inactive_symlink_rmt()
441 error = xfs_bunmapi(tp, ip, 0, size, 0, nmaps, &done); in xfs_inactive_symlink_rmt()
450 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); in xfs_inactive_symlink_rmt()
451 error = xfs_trans_commit(tp); in xfs_inactive_symlink_rmt()
460 if (ip->i_df.if_bytes) in xfs_inactive_symlink_rmt()
461 xfs_idata_realloc(ip, -ip->i_df.if_bytes, XFS_DATA_FORK); in xfs_inactive_symlink_rmt()
462 ASSERT(ip->i_df.if_bytes == 0); in xfs_inactive_symlink_rmt()
468 xfs_trans_cancel(tp); in xfs_inactive_symlink_rmt()
475 * xfs_inactive_symlink - free a symlink
481 struct xfs_mount *mp = ip->i_mount; in xfs_inactive_symlink()
487 return -EIO; in xfs_inactive_symlink()
490 pathlen = (int)ip->i_disk_size; in xfs_inactive_symlink()
495 __func__, (unsigned long long)ip->i_ino, pathlen); in xfs_inactive_symlink()
498 return -EFSCORRUPTED; in xfs_inactive_symlink()
505 if (ip->i_df.if_format == XFS_DINODE_FMT_LOCAL) { in xfs_inactive_symlink()