.. | .. |
---|
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 | /* |
---|