| .. | .. |
|---|
| 12 | 12 | #include "xfs_trans_resv.h" |
|---|
| 13 | 13 | #include "xfs_bit.h" |
|---|
| 14 | 14 | #include "xfs_mount.h" |
|---|
| 15 | | -#include "xfs_da_format.h" |
|---|
| 16 | | -#include "xfs_da_btree.h" |
|---|
| 17 | | -#include "xfs_defer.h" |
|---|
| 18 | 15 | #include "xfs_dir2.h" |
|---|
| 19 | 16 | #include "xfs_inode.h" |
|---|
| 20 | | -#include "xfs_ialloc.h" |
|---|
| 21 | | -#include "xfs_alloc.h" |
|---|
| 22 | 17 | #include "xfs_bmap.h" |
|---|
| 23 | 18 | #include "xfs_bmap_btree.h" |
|---|
| 24 | | -#include "xfs_bmap_util.h" |
|---|
| 25 | | -#include "xfs_error.h" |
|---|
| 26 | 19 | #include "xfs_quota.h" |
|---|
| 20 | +#include "xfs_symlink.h" |
|---|
| 27 | 21 | #include "xfs_trans_space.h" |
|---|
| 28 | 22 | #include "xfs_trace.h" |
|---|
| 29 | | -#include "xfs_symlink.h" |
|---|
| 30 | 23 | #include "xfs_trans.h" |
|---|
| 31 | | -#include "xfs_log.h" |
|---|
| 32 | 24 | |
|---|
| 33 | 25 | /* ----- Kernel only functions below ----- */ |
|---|
| 34 | 26 | int |
|---|
| .. | .. |
|---|
| 61 | 53 | d = XFS_FSB_TO_DADDR(mp, mval[n].br_startblock); |
|---|
| 62 | 54 | byte_cnt = XFS_FSB_TO_B(mp, mval[n].br_blockcount); |
|---|
| 63 | 55 | |
|---|
| 64 | | - bp = xfs_buf_read(mp->m_ddev_targp, d, BTOBB(byte_cnt), 0, |
|---|
| 65 | | - &xfs_symlink_buf_ops); |
|---|
| 66 | | - if (!bp) |
|---|
| 67 | | - return -ENOMEM; |
|---|
| 68 | | - error = bp->b_error; |
|---|
| 69 | | - if (error) { |
|---|
| 70 | | - xfs_buf_ioerror_alert(bp, __func__); |
|---|
| 71 | | - xfs_buf_relse(bp); |
|---|
| 72 | | - |
|---|
| 73 | | - /* bad CRC means corrupted metadata */ |
|---|
| 74 | | - if (error == -EFSBADCRC) |
|---|
| 75 | | - error = -EFSCORRUPTED; |
|---|
| 76 | | - goto out; |
|---|
| 77 | | - } |
|---|
| 56 | + error = xfs_buf_read(mp->m_ddev_targp, d, BTOBB(byte_cnt), 0, |
|---|
| 57 | + &bp, &xfs_symlink_buf_ops); |
|---|
| 58 | + if (error) |
|---|
| 59 | + return error; |
|---|
| 78 | 60 | byte_cnt = XFS_SYMLINK_BUF_SPACE(mp, byte_cnt); |
|---|
| 79 | 61 | if (pathlen < byte_cnt) |
|---|
| 80 | 62 | byte_cnt = pathlen; |
|---|
| .. | .. |
|---|
| 194 | 176 | return -ENAMETOOLONG; |
|---|
| 195 | 177 | ASSERT(pathlen > 0); |
|---|
| 196 | 178 | |
|---|
| 197 | | - udqp = gdqp = NULL; |
|---|
| 198 | 179 | prid = xfs_get_initial_prid(dp); |
|---|
| 199 | 180 | |
|---|
| 200 | 181 | /* |
|---|
| 201 | 182 | * Make sure that we have allocated dquot(s) on disk. |
|---|
| 202 | 183 | */ |
|---|
| 203 | | - error = xfs_qm_vop_dqalloc(dp, |
|---|
| 204 | | - xfs_kuid_to_uid(current_fsuid()), |
|---|
| 205 | | - xfs_kgid_to_gid(current_fsgid()), prid, |
|---|
| 184 | + error = xfs_qm_vop_dqalloc(dp, current_fsuid(), current_fsgid(), prid, |
|---|
| 206 | 185 | XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT, |
|---|
| 207 | 186 | &udqp, &gdqp, &pdqp); |
|---|
| 208 | 187 | if (error) |
|---|
| .. | .. |
|---|
| 212 | 191 | * The symlink will fit into the inode data fork? |
|---|
| 213 | 192 | * There can't be any attributes so we get the whole variable part. |
|---|
| 214 | 193 | */ |
|---|
| 215 | | - if (pathlen <= XFS_LITINO(mp, dp->i_d.di_version)) |
|---|
| 194 | + if (pathlen <= XFS_LITINO(mp)) |
|---|
| 216 | 195 | fs_blocks = 0; |
|---|
| 217 | 196 | else |
|---|
| 218 | 197 | fs_blocks = xfs_symlink_blocks(mp, pathlen); |
|---|
| .. | .. |
|---|
| 264 | 243 | */ |
|---|
| 265 | 244 | xfs_qm_vop_create_dqattach(tp, ip, udqp, gdqp, pdqp); |
|---|
| 266 | 245 | |
|---|
| 267 | | - if (resblks) |
|---|
| 268 | | - resblks -= XFS_IALLOC_SPACE_RES(mp); |
|---|
| 246 | + resblks -= XFS_IALLOC_SPACE_RES(mp); |
|---|
| 269 | 247 | /* |
|---|
| 270 | 248 | * If the symlink will fit into the inode, write it inline. |
|---|
| 271 | 249 | */ |
|---|
| .. | .. |
|---|
| 273 | 251 | xfs_init_local_fork(ip, XFS_DATA_FORK, target_path, pathlen); |
|---|
| 274 | 252 | |
|---|
| 275 | 253 | ip->i_d.di_size = pathlen; |
|---|
| 276 | | - ip->i_d.di_format = XFS_DINODE_FMT_LOCAL; |
|---|
| 254 | + ip->i_df.if_format = XFS_DINODE_FMT_LOCAL; |
|---|
| 277 | 255 | xfs_trans_log_inode(tp, ip, XFS_ILOG_DDATA | XFS_ILOG_CORE); |
|---|
| 278 | 256 | } else { |
|---|
| 279 | 257 | int offset; |
|---|
| .. | .. |
|---|
| 286 | 264 | if (error) |
|---|
| 287 | 265 | goto out_trans_cancel; |
|---|
| 288 | 266 | |
|---|
| 289 | | - if (resblks) |
|---|
| 290 | | - resblks -= fs_blocks; |
|---|
| 267 | + resblks -= fs_blocks; |
|---|
| 291 | 268 | ip->i_d.di_size = pathlen; |
|---|
| 292 | 269 | xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); |
|---|
| 293 | 270 | |
|---|
| .. | .. |
|---|
| 298 | 275 | |
|---|
| 299 | 276 | d = XFS_FSB_TO_DADDR(mp, mval[n].br_startblock); |
|---|
| 300 | 277 | byte_cnt = XFS_FSB_TO_B(mp, mval[n].br_blockcount); |
|---|
| 301 | | - bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, d, |
|---|
| 302 | | - BTOBB(byte_cnt), 0); |
|---|
| 303 | | - if (!bp) { |
|---|
| 304 | | - error = -ENOMEM; |
|---|
| 278 | + error = xfs_trans_get_buf(tp, mp->m_ddev_targp, d, |
|---|
| 279 | + BTOBB(byte_cnt), 0, &bp); |
|---|
| 280 | + if (error) |
|---|
| 305 | 281 | goto out_trans_cancel; |
|---|
| 306 | | - } |
|---|
| 307 | 282 | bp->b_ops = &xfs_symlink_buf_ops; |
|---|
| 308 | 283 | |
|---|
| 309 | 284 | byte_cnt = XFS_SYMLINK_BUF_SPACE(mp, byte_cnt); |
|---|
| .. | .. |
|---|
| 325 | 300 | } |
|---|
| 326 | 301 | ASSERT(pathlen == 0); |
|---|
| 327 | 302 | } |
|---|
| 303 | + i_size_write(VFS_I(ip), ip->i_d.di_size); |
|---|
| 328 | 304 | |
|---|
| 329 | 305 | /* |
|---|
| 330 | 306 | * Create the directory entry for the symlink. |
|---|
| .. | .. |
|---|
| 409 | 385 | * either 1 or 2 extents and that we can |
|---|
| 410 | 386 | * free them all in one bunmapi call. |
|---|
| 411 | 387 | */ |
|---|
| 412 | | - ASSERT(ip->i_d.di_nextents > 0 && ip->i_d.di_nextents <= 2); |
|---|
| 388 | + ASSERT(ip->i_df.if_nextents > 0 && ip->i_df.if_nextents <= 2); |
|---|
| 413 | 389 | |
|---|
| 414 | 390 | error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate, 0, 0, 0, &tp); |
|---|
| 415 | 391 | if (error) |
|---|
| .. | .. |
|---|
| 441 | 417 | * Invalidate the block(s). No validation is done. |
|---|
| 442 | 418 | */ |
|---|
| 443 | 419 | for (i = 0; i < nmaps; i++) { |
|---|
| 444 | | - bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, |
|---|
| 445 | | - XFS_FSB_TO_DADDR(mp, mval[i].br_startblock), |
|---|
| 446 | | - XFS_FSB_TO_BB(mp, mval[i].br_blockcount), 0); |
|---|
| 447 | | - if (!bp) { |
|---|
| 448 | | - error = -ENOMEM; |
|---|
| 420 | + error = xfs_trans_get_buf(tp, mp->m_ddev_targp, |
|---|
| 421 | + XFS_FSB_TO_DADDR(mp, mval[i].br_startblock), |
|---|
| 422 | + XFS_FSB_TO_BB(mp, mval[i].br_blockcount), 0, |
|---|
| 423 | + &bp); |
|---|
| 424 | + if (error) |
|---|
| 449 | 425 | goto error_trans_cancel; |
|---|
| 450 | | - } |
|---|
| 451 | 426 | xfs_trans_binval(tp, bp); |
|---|
| 452 | 427 | } |
|---|
| 453 | 428 | /* |
|---|