Lines Matching +full:ip +full:- +full:blocks

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (c) 2018-2024 Oracle. All Rights Reserved.
59 struct xfs_mount *mp = sc->mp; in xrep_setup_symlink()
60 unsigned long long blocks; in xrep_setup_symlink() local
68 * If we're doing a repair, we reserve enough blocks to write out a in xrep_setup_symlink()
69 * completely new symlink file, plus twice as many blocks as we would in xrep_setup_symlink()
80 blocks = xfs_symlink_blocks(sc->mp, XFS_SYMLINK_MAXLEN); in xrep_setup_symlink()
81 blocks += xfs_bmbt_calc_size(mp, blocks) * 2; in xrep_setup_symlink()
82 if (blocks > UINT_MAX) in xrep_setup_symlink()
83 return -EOPNOTSUPP; in xrep_setup_symlink()
85 *resblks += blocks; in xrep_setup_symlink()
90 * Try to salvage the pathname from remote blocks. Returns the number of bytes
98 struct xfs_inode *ip = sc->ip; in xrep_symlink_salvage_remote() local
100 char *target_buf = sc->buf; in xrep_symlink_salvage_remote()
114 len = min_t(loff_t, ip->i_disk_size, XFS_SYMLINK_MAXLEN); in xrep_symlink_salvage_remote()
115 fsblocks = xfs_symlink_blocks(sc->mp, len); in xrep_symlink_salvage_remote()
116 error = xfs_bmapi_read(ip, 0, fsblocks, mval, &nmaps, 0); in xrep_symlink_salvage_remote()
123 d = XFS_FSB_TO_DADDR(sc->mp, mval[n].br_startblock); in xrep_symlink_salvage_remote()
126 error = xfs_trans_read_buf(sc->mp, sc->tp, sc->mp->m_ddev_targp, in xrep_symlink_salvage_remote()
127 d, XFS_FSB_TO_BB(sc->mp, mval[n].br_blockcount), in xrep_symlink_salvage_remote()
131 bp->b_ops = &xfs_symlink_buf_ops; in xrep_symlink_salvage_remote()
134 byte_cnt = XFS_FSB_TO_B(sc->mp, mval[n].br_blockcount); in xrep_symlink_salvage_remote()
135 byte_cnt = XFS_SYMLINK_BUF_SPACE(sc->mp, byte_cnt); in xrep_symlink_salvage_remote()
144 fa = bp->b_ops->verify_struct(bp); in xrep_symlink_salvage_remote()
145 dsl = bp->b_addr; in xrep_symlink_salvage_remote()
146 magic_ok = dsl->sl_magic == cpu_to_be32(XFS_SYMLINK_MAGIC); in xrep_symlink_salvage_remote()
147 hdr_ok = xfs_symlink_hdr_ok(ip->i_ino, offset, byte_cnt, bp); in xrep_symlink_salvage_remote()
153 len -= byte_cnt; in xrep_symlink_salvage_remote()
167 struct xfs_inode *ip = sc->ip; in xrep_symlink_salvage_inline() local
168 char *target_buf = sc->buf; in xrep_symlink_salvage_inline()
173 ifp = xfs_ifork_ptr(ip, XFS_DATA_FORK); in xrep_symlink_salvage_inline()
174 if (!ifp->if_data) in xrep_symlink_salvage_inline()
182 old_target = ifp->if_data; in xrep_symlink_salvage_inline()
183 if (xfs_inode_has_sickness(sc->ip, XFS_SICK_INO_SYMLINK_ZAPPED) && in xrep_symlink_salvage_inline()
184 sc->ip->i_disk_size == 1 && old_target[0] == '?') in xrep_symlink_salvage_inline()
187 nr = min(XFS_SYMLINK_MAXLEN, xfs_inode_data_fork_size(ip)); in xrep_symlink_salvage_inline()
188 strncpy(target_buf, ifp->if_data, nr); in xrep_symlink_salvage_inline()
205 char *target_buf = sc->buf; in xrep_symlink_salvage()
208 BUILD_BUG_ON(sizeof(DUMMY_TARGET) - 1 <= NAME_MAX); in xrep_symlink_salvage()
214 if (!(sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT)) { in xrep_symlink_salvage()
215 if (sc->ip->i_df.if_format == XFS_DINODE_FMT_LOCAL) in xrep_symlink_salvage()
223 * NULL-terminate the buffer because the ondisk target does not in xrep_symlink_salvage()
228 if (strlen(target_buf) != sc->ip->i_disk_size) in xrep_symlink_salvage()
241 trace_xrep_symlink_salvage_target(sc->ip, target_buf, in xrep_symlink_salvage()
250 struct xfs_inode *ip, in xrep_symlink_local_to_remote() argument
255 struct xfs_dsymlink_hdr *dsl = bp->b_addr; in xrep_symlink_local_to_remote()
257 xfs_symlink_local_to_remote(tp, bp, ip, ifp, NULL); in xrep_symlink_local_to_remote()
259 if (!xfs_has_crc(sc->mp)) in xrep_symlink_local_to_remote()
262 dsl->sl_owner = cpu_to_be64(sc->ip->i_ino); in xrep_symlink_local_to_remote()
264 sizeof(struct xfs_dsymlink_hdr) + ifp->if_bytes - 1); in xrep_symlink_local_to_remote()
287 error = xfs_bmap_local_to_extents(sc->tp, sc->tempip, 1, in xrep_symlink_swap_prep()
294 xfs_trans_log_inode(sc->tp, sc->ip, 0); in xrep_symlink_swap_prep()
296 error = xfs_defer_finish(&sc->tp); in xrep_symlink_swap_prep()
309 ifp = xfs_ifork_ptr(sc->ip, XFS_DATA_FORK); in xrep_symlink_swap_prep()
311 ifp->if_format = XFS_DINODE_FMT_EXTENTS; in xrep_symlink_swap_prep()
312 ifp->if_nextents = 0; in xrep_symlink_swap_prep()
313 ifp->if_bytes = 0; in xrep_symlink_swap_prep()
314 ifp->if_data = NULL; in xrep_symlink_swap_prep()
315 ifp->if_height = 0; in xrep_symlink_swap_prep()
317 xfs_trans_log_inode(sc->tp, sc->ip, in xrep_symlink_swap_prep()
329 struct xrep_tempexch *tx = sc->buf; in xrep_symlink_swap()
333 ip_local = sc->ip->i_df.if_format == XFS_DINODE_FMT_LOCAL; in xrep_symlink_swap()
334 temp_local = sc->tempip->i_df.if_format == XFS_DINODE_FMT_LOCAL; in xrep_symlink_swap()
342 sc->tempip->i_disk_size <= xfs_inode_data_fork_size(sc->ip)) { in xrep_symlink_swap()
347 /* Otherwise, make sure both data forks are in block-mapping mode. */ in xrep_symlink_swap()
356 * Free all the remote blocks and reset the data fork. The caller must join
364 struct xfs_ifork *ifp = xfs_ifork_ptr(sc->tempip, XFS_DATA_FORK); in xrep_symlink_reset_fork()
369 error = xrep_reap_ifork(sc, sc->tempip, XFS_DATA_FORK); in xrep_symlink_reset_fork()
374 trace_xrep_symlink_reset_fork(sc->tempip); in xrep_symlink_reset_fork()
378 return xfs_symlink_write_target(sc->tp, sc->tempip, sc->tempip->i_ino, in xrep_symlink_reset_fork()
391 char *target_buf = sc->buf; in xrep_symlink_rebuild()
397 /* How many blocks do we need? */ in xrep_symlink_rebuild()
401 return -EFSCORRUPTED; in xrep_symlink_rebuild()
403 trace_xrep_symlink_rebuild(sc->ip); in xrep_symlink_rebuild()
417 xfs_trans_ijoin(sc->tp, sc->tempip, 0); in xrep_symlink_rebuild()
424 fs_blocks = xfs_symlink_blocks(sc->mp, target_len); in xrep_symlink_rebuild()
425 resblks = xfs_symlink_space_res(sc->mp, target_len, fs_blocks); in xrep_symlink_rebuild()
426 error = xfs_trans_reserve_quota_nblks(sc->tp, sc->tempip, resblks, 0, in xrep_symlink_rebuild()
432 xfs_idestroy_fork(&sc->tempip->i_df); in xrep_symlink_rebuild()
433 sc->tempip->i_df.if_bytes = 0; in xrep_symlink_rebuild()
434 sc->tempip->i_df.if_format = XFS_DINODE_FMT_EXTENTS; in xrep_symlink_rebuild()
437 error = xfs_symlink_write_target(sc->tp, sc->tempip, sc->ip->i_ino, in xrep_symlink_rebuild()
445 * re-lock the inodes. in xrep_symlink_rebuild()
462 tx = sc->buf; in xrep_symlink_rebuild()
477 * Release the old symlink blocks and reset the data fork of the temp in xrep_symlink_rebuild()
492 if (!xfs_has_rmapbt(sc->mp)) in xrep_symlink()
493 return -EOPNOTSUPP; in xrep_symlink()
495 if (!xfs_has_exchange_range(sc->mp)) in xrep_symlink()
496 return -EOPNOTSUPP; in xrep_symlink()
498 ASSERT(sc->ilock_flags & XFS_ILOCK_EXCL); in xrep_symlink()