• Home
  • Raw
  • Download

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()
211 resblks = XFS_SYMLINK_SPACE_RES(mp, link_name->len, fs_blocks); in xfs_symlink()
213 error = xfs_trans_alloc_icreate(mp, &M_RES(mp)->tr_symlink, udqp, gdqp, in xfs_symlink()
214 pdqp, resblks, &tp); in xfs_symlink()
224 if (dp->i_diflags & XFS_DIFLAG_NOSYMLINKS) { in xfs_symlink()
225 error = -EPERM; in xfs_symlink()
232 error = xfs_dialloc(&tp, dp->i_ino, S_IFLNK, &ino); in xfs_symlink()
234 error = xfs_init_new_inode(idmap, tp, dp, ino, in xfs_symlink()
247 xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); in xfs_symlink()
253 xfs_qm_vop_create_dqattach(tp, ip, udqp, gdqp, pdqp); in xfs_symlink()
255 resblks -= XFS_IALLOC_SPACE_RES(mp); in xfs_symlink()
262 ip->i_disk_size = pathlen; in xfs_symlink()
263 ip->i_df.if_format = XFS_DINODE_FMT_LOCAL; in xfs_symlink()
264 xfs_trans_log_inode(tp, ip, XFS_ILOG_DDATA | XFS_ILOG_CORE); in xfs_symlink()
271 error = xfs_bmapi_write(tp, ip, first_fsb, fs_blocks, in xfs_symlink()
276 resblks -= fs_blocks; in xfs_symlink()
277 ip->i_disk_size = pathlen; in xfs_symlink()
278 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); in xfs_symlink()
287 error = xfs_trans_get_buf(tp, mp->m_ddev_targp, d, in xfs_symlink()
291 bp->b_ops = &xfs_symlink_buf_ops; in xfs_symlink()
296 buf = bp->b_addr; in xfs_symlink()
297 buf += xfs_symlink_hdr_set(mp, ip->i_ino, offset, in xfs_symlink()
303 pathlen -= byte_cnt; in xfs_symlink()
306 xfs_trans_buf_set_type(tp, bp, XFS_BLFT_SYMLINK_BUF); in xfs_symlink()
307 xfs_trans_log_buf(tp, bp, 0, (buf + byte_cnt - 1) - in xfs_symlink()
308 (char *)bp->b_addr); in xfs_symlink()
312 i_size_write(VFS_I(ip), ip->i_disk_size); in xfs_symlink()
317 error = xfs_dir_createname(tp, dp, link_name, ip->i_ino, resblks); in xfs_symlink()
320 xfs_trans_ichgtime(tp, dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); in xfs_symlink()
321 xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); in xfs_symlink()
329 xfs_trans_set_sync(tp); in xfs_symlink()
331 error = xfs_trans_commit(tp); in xfs_symlink()
343 xfs_trans_cancel(tp); in xfs_symlink()
371 * but allows us to catch corrupt zero-length symlinks in the verifiers.
385 xfs_trans_t *tp; in xfs_inactive_symlink_rmt() local
387 mp = ip->i_mount; in xfs_inactive_symlink_rmt()
388 ASSERT(!xfs_need_iread_extents(&ip->i_df)); in xfs_inactive_symlink_rmt()
396 ASSERT(ip->i_df.if_nextents > 0 && ip->i_df.if_nextents <= 2); in xfs_inactive_symlink_rmt()
398 error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate, 0, 0, 0, &tp); in xfs_inactive_symlink_rmt()
403 xfs_trans_ijoin(tp, ip, 0); in xfs_inactive_symlink_rmt()
411 size = (int)ip->i_disk_size; in xfs_inactive_symlink_rmt()
412 ip->i_disk_size = 0; in xfs_inactive_symlink_rmt()
413 VFS_I(ip)->i_mode = (VFS_I(ip)->i_mode & ~S_IFMT) | S_IFREG; in xfs_inactive_symlink_rmt()
414 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); in xfs_inactive_symlink_rmt()
428 error = xfs_trans_get_buf(tp, mp->m_ddev_targp, in xfs_inactive_symlink_rmt()
434 xfs_trans_binval(tp, bp); in xfs_inactive_symlink_rmt()
439 error = xfs_bunmapi(tp, ip, 0, size, 0, nmaps, &done); in xfs_inactive_symlink_rmt()
448 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); in xfs_inactive_symlink_rmt()
449 error = xfs_trans_commit(tp); in xfs_inactive_symlink_rmt()
458 if (ip->i_df.if_bytes) in xfs_inactive_symlink_rmt()
459 xfs_idata_realloc(ip, -ip->i_df.if_bytes, XFS_DATA_FORK); in xfs_inactive_symlink_rmt()
460 ASSERT(ip->i_df.if_bytes == 0); in xfs_inactive_symlink_rmt()
466 xfs_trans_cancel(tp); in xfs_inactive_symlink_rmt()
473 * xfs_inactive_symlink - free a symlink
479 struct xfs_mount *mp = ip->i_mount; in xfs_inactive_symlink()
485 return -EIO; in xfs_inactive_symlink()
488 pathlen = (int)ip->i_disk_size; in xfs_inactive_symlink()
493 __func__, (unsigned long long)ip->i_ino, pathlen); in xfs_inactive_symlink()
496 return -EFSCORRUPTED; in xfs_inactive_symlink()
503 if (ip->i_df.if_format == XFS_DINODE_FMT_LOCAL) { in xfs_inactive_symlink()