1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2000-2006 Silicon Graphics, Inc.
8 #include "xfs_shared.h"
9 #include "xfs_format.h"
10 #include "xfs_log_format.h"
11 #include "xfs_trans_resv.h"
12 #include "xfs_mount.h"
13 #include "xfs_defer.h"
14 #include "xfs_inode.h"
15 #include "xfs_errortag.h"
16 #include "xfs_error.h"
17 #include "xfs_cksum.h"
18 #include "xfs_icache.h"
19 #include "xfs_trans.h"
20 #include "xfs_ialloc.h"
23 #include <linux/iversion.h>
26 * Check that none of the inode's in the buffer have a next
27 * unlinked field of 0.
39 j
= mp
->m_inode_cluster_size
>> mp
->m_sb
.sb_inodelog
;
41 for (i
= 0; i
< j
; i
++) {
42 dip
= xfs_buf_offset(bp
, i
* mp
->m_sb
.sb_inodesize
);
43 if (!dip
->di_next_unlinked
) {
45 "Detected bogus zero next_unlinked field in inode %d buffer 0x%llx.",
46 i
, (long long)bp
->b_bn
);
53 xfs_dinode_good_version(
57 if (xfs_sb_version_hascrc(&mp
->m_sb
))
60 return version
== 1 || version
== 2;
64 * If we are doing readahead on an inode buffer, we might be in log recovery
65 * reading an inode allocation buffer that hasn't yet been replayed, and hence
66 * has not had the inode cores stamped into it. Hence for readahead, the buffer
67 * may be potentially invalid.
69 * If the readahead buffer is invalid, we need to mark it with an error and
70 * clear the DONE status of the buffer so that a followup read will re-read it
71 * from disk. We don't report the error otherwise to avoid warnings during log
72 * recovery and we don't get unnecssary panics on debug kernels. We use EIO here
73 * because all we want to do is say readahead failed; there is no-one to report
74 * the error to, so this will distinguish it from a non-ra verifier failure.
75 * Changes to this readahead error behavour also need to be reflected in
76 * xfs_dquot_buf_readahead_verify().
83 struct xfs_mount
*mp
= bp
->b_target
->bt_mount
;
89 * Validate the magic number and version of every inode in the buffer
91 agno
= xfs_daddr_to_agno(mp
, XFS_BUF_ADDR(bp
));
92 ni
= XFS_BB_TO_FSB(mp
, bp
->b_length
) * mp
->m_sb
.sb_inopblock
;
93 for (i
= 0; i
< ni
; i
++) {
96 xfs_agino_t unlinked_ino
;
98 dip
= xfs_buf_offset(bp
, (i
<< mp
->m_sb
.sb_inodelog
));
99 unlinked_ino
= be32_to_cpu(dip
->di_next_unlinked
);
100 di_ok
= dip
->di_magic
== cpu_to_be16(XFS_DINODE_MAGIC
) &&
101 xfs_dinode_good_version(mp
, dip
->di_version
) &&
102 (unlinked_ino
== NULLAGINO
||
103 xfs_verify_agino(mp
, agno
, unlinked_ino
));
104 if (unlikely(XFS_TEST_ERROR(!di_ok
, mp
,
105 XFS_ERRTAG_ITOBP_INOTOBP
))) {
107 bp
->b_flags
&= ~XBF_DONE
;
108 xfs_buf_ioerror(bp
, -EIO
);
114 "bad inode magic/vsn daddr %lld #%d (magic=%x)",
115 (unsigned long long)bp
->b_bn
, i
,
116 be16_to_cpu(dip
->di_magic
));
118 xfs_buf_verifier_error(bp
, -EFSCORRUPTED
,
119 __func__
, dip
, sizeof(*dip
),
128 xfs_inode_buf_read_verify(
131 xfs_inode_buf_verify(bp
, false);
135 xfs_inode_buf_readahead_verify(
138 xfs_inode_buf_verify(bp
, true);
142 xfs_inode_buf_write_verify(
145 xfs_inode_buf_verify(bp
, false);
148 const struct xfs_buf_ops xfs_inode_buf_ops
= {
150 .verify_read
= xfs_inode_buf_read_verify
,
151 .verify_write
= xfs_inode_buf_write_verify
,
154 const struct xfs_buf_ops xfs_inode_buf_ra_ops
= {
155 .name
= "xxfs_inode_ra",
156 .verify_read
= xfs_inode_buf_readahead_verify
,
157 .verify_write
= xfs_inode_buf_write_verify
,
162 * This routine is called to map an inode to the buffer containing the on-disk
163 * version of the inode. It returns a pointer to the buffer containing the
164 * on-disk inode in the bpp parameter, and in the dipp parameter it returns a
165 * pointer to the on-disk inode within that buffer.
167 * If a non-zero error is returned, then the contents of bpp and dipp are
172 struct xfs_mount
*mp
,
173 struct xfs_trans
*tp
,
174 struct xfs_imap
*imap
,
175 struct xfs_dinode
**dipp
,
176 struct xfs_buf
**bpp
,
183 buf_flags
|= XBF_UNMAPPED
;
184 error
= xfs_trans_read_buf(mp
, tp
, mp
->m_ddev_targp
, imap
->im_blkno
,
185 (int)imap
->im_len
, buf_flags
, &bp
,
188 if (error
== -EAGAIN
) {
189 ASSERT(buf_flags
& XBF_TRYLOCK
);
192 xfs_warn(mp
, "%s: xfs_trans_read_buf() returned error %d.",
198 *dipp
= xfs_buf_offset(bp
, imap
->im_boffset
);
204 struct xfs_inode
*ip
,
205 struct xfs_dinode
*from
)
207 struct xfs_icdinode
*to
= &ip
->i_d
;
208 struct inode
*inode
= VFS_I(ip
);
212 * Convert v1 inodes immediately to v2 inode format as this is the
213 * minimum inode version format we support in the rest of the code.
215 to
->di_version
= from
->di_version
;
216 if (to
->di_version
== 1) {
217 set_nlink(inode
, be16_to_cpu(from
->di_onlink
));
218 to
->di_projid_lo
= 0;
219 to
->di_projid_hi
= 0;
222 set_nlink(inode
, be32_to_cpu(from
->di_nlink
));
223 to
->di_projid_lo
= be16_to_cpu(from
->di_projid_lo
);
224 to
->di_projid_hi
= be16_to_cpu(from
->di_projid_hi
);
227 to
->di_format
= from
->di_format
;
228 to
->di_uid
= be32_to_cpu(from
->di_uid
);
229 to
->di_gid
= be32_to_cpu(from
->di_gid
);
230 to
->di_flushiter
= be16_to_cpu(from
->di_flushiter
);
233 * Time is signed, so need to convert to signed 32 bit before
234 * storing in inode timestamp which may be 64 bit. Otherwise
235 * a time before epoch is converted to a time long after epoch
238 inode
->i_atime
.tv_sec
= (int)be32_to_cpu(from
->di_atime
.t_sec
);
239 inode
->i_atime
.tv_nsec
= (int)be32_to_cpu(from
->di_atime
.t_nsec
);
240 inode
->i_mtime
.tv_sec
= (int)be32_to_cpu(from
->di_mtime
.t_sec
);
241 inode
->i_mtime
.tv_nsec
= (int)be32_to_cpu(from
->di_mtime
.t_nsec
);
242 inode
->i_ctime
.tv_sec
= (int)be32_to_cpu(from
->di_ctime
.t_sec
);
243 inode
->i_ctime
.tv_nsec
= (int)be32_to_cpu(from
->di_ctime
.t_nsec
);
244 inode
->i_generation
= be32_to_cpu(from
->di_gen
);
245 inode
->i_mode
= be16_to_cpu(from
->di_mode
);
247 to
->di_size
= be64_to_cpu(from
->di_size
);
248 to
->di_nblocks
= be64_to_cpu(from
->di_nblocks
);
249 to
->di_extsize
= be32_to_cpu(from
->di_extsize
);
250 to
->di_nextents
= be32_to_cpu(from
->di_nextents
);
251 to
->di_anextents
= be16_to_cpu(from
->di_anextents
);
252 to
->di_forkoff
= from
->di_forkoff
;
253 to
->di_aformat
= from
->di_aformat
;
254 to
->di_dmevmask
= be32_to_cpu(from
->di_dmevmask
);
255 to
->di_dmstate
= be16_to_cpu(from
->di_dmstate
);
256 to
->di_flags
= be16_to_cpu(from
->di_flags
);
258 if (to
->di_version
== 3) {
259 inode_set_iversion_queried(inode
,
260 be64_to_cpu(from
->di_changecount
));
261 to
->di_crtime
.t_sec
= be32_to_cpu(from
->di_crtime
.t_sec
);
262 to
->di_crtime
.t_nsec
= be32_to_cpu(from
->di_crtime
.t_nsec
);
263 to
->di_flags2
= be64_to_cpu(from
->di_flags2
);
264 to
->di_cowextsize
= be32_to_cpu(from
->di_cowextsize
);
270 struct xfs_inode
*ip
,
271 struct xfs_dinode
*to
,
274 struct xfs_icdinode
*from
= &ip
->i_d
;
275 struct inode
*inode
= VFS_I(ip
);
277 to
->di_magic
= cpu_to_be16(XFS_DINODE_MAGIC
);
280 to
->di_version
= from
->di_version
;
281 to
->di_format
= from
->di_format
;
282 to
->di_uid
= cpu_to_be32(from
->di_uid
);
283 to
->di_gid
= cpu_to_be32(from
->di_gid
);
284 to
->di_projid_lo
= cpu_to_be16(from
->di_projid_lo
);
285 to
->di_projid_hi
= cpu_to_be16(from
->di_projid_hi
);
287 memset(to
->di_pad
, 0, sizeof(to
->di_pad
));
288 to
->di_atime
.t_sec
= cpu_to_be32(inode
->i_atime
.tv_sec
);
289 to
->di_atime
.t_nsec
= cpu_to_be32(inode
->i_atime
.tv_nsec
);
290 to
->di_mtime
.t_sec
= cpu_to_be32(inode
->i_mtime
.tv_sec
);
291 to
->di_mtime
.t_nsec
= cpu_to_be32(inode
->i_mtime
.tv_nsec
);
292 to
->di_ctime
.t_sec
= cpu_to_be32(inode
->i_ctime
.tv_sec
);
293 to
->di_ctime
.t_nsec
= cpu_to_be32(inode
->i_ctime
.tv_nsec
);
294 to
->di_nlink
= cpu_to_be32(inode
->i_nlink
);
295 to
->di_gen
= cpu_to_be32(inode
->i_generation
);
296 to
->di_mode
= cpu_to_be16(inode
->i_mode
);
298 to
->di_size
= cpu_to_be64(from
->di_size
);
299 to
->di_nblocks
= cpu_to_be64(from
->di_nblocks
);
300 to
->di_extsize
= cpu_to_be32(from
->di_extsize
);
301 to
->di_nextents
= cpu_to_be32(from
->di_nextents
);
302 to
->di_anextents
= cpu_to_be16(from
->di_anextents
);
303 to
->di_forkoff
= from
->di_forkoff
;
304 to
->di_aformat
= from
->di_aformat
;
305 to
->di_dmevmask
= cpu_to_be32(from
->di_dmevmask
);
306 to
->di_dmstate
= cpu_to_be16(from
->di_dmstate
);
307 to
->di_flags
= cpu_to_be16(from
->di_flags
);
309 if (from
->di_version
== 3) {
310 to
->di_changecount
= cpu_to_be64(inode_peek_iversion(inode
));
311 to
->di_crtime
.t_sec
= cpu_to_be32(from
->di_crtime
.t_sec
);
312 to
->di_crtime
.t_nsec
= cpu_to_be32(from
->di_crtime
.t_nsec
);
313 to
->di_flags2
= cpu_to_be64(from
->di_flags2
);
314 to
->di_cowextsize
= cpu_to_be32(from
->di_cowextsize
);
315 to
->di_ino
= cpu_to_be64(ip
->i_ino
);
316 to
->di_lsn
= cpu_to_be64(lsn
);
317 memset(to
->di_pad2
, 0, sizeof(to
->di_pad2
));
318 uuid_copy(&to
->di_uuid
, &ip
->i_mount
->m_sb
.sb_meta_uuid
);
319 to
->di_flushiter
= 0;
321 to
->di_flushiter
= cpu_to_be16(from
->di_flushiter
);
326 xfs_log_dinode_to_disk(
327 struct xfs_log_dinode
*from
,
328 struct xfs_dinode
*to
)
330 to
->di_magic
= cpu_to_be16(from
->di_magic
);
331 to
->di_mode
= cpu_to_be16(from
->di_mode
);
332 to
->di_version
= from
->di_version
;
333 to
->di_format
= from
->di_format
;
335 to
->di_uid
= cpu_to_be32(from
->di_uid
);
336 to
->di_gid
= cpu_to_be32(from
->di_gid
);
337 to
->di_nlink
= cpu_to_be32(from
->di_nlink
);
338 to
->di_projid_lo
= cpu_to_be16(from
->di_projid_lo
);
339 to
->di_projid_hi
= cpu_to_be16(from
->di_projid_hi
);
340 memcpy(to
->di_pad
, from
->di_pad
, sizeof(to
->di_pad
));
342 to
->di_atime
.t_sec
= cpu_to_be32(from
->di_atime
.t_sec
);
343 to
->di_atime
.t_nsec
= cpu_to_be32(from
->di_atime
.t_nsec
);
344 to
->di_mtime
.t_sec
= cpu_to_be32(from
->di_mtime
.t_sec
);
345 to
->di_mtime
.t_nsec
= cpu_to_be32(from
->di_mtime
.t_nsec
);
346 to
->di_ctime
.t_sec
= cpu_to_be32(from
->di_ctime
.t_sec
);
347 to
->di_ctime
.t_nsec
= cpu_to_be32(from
->di_ctime
.t_nsec
);
349 to
->di_size
= cpu_to_be64(from
->di_size
);
350 to
->di_nblocks
= cpu_to_be64(from
->di_nblocks
);
351 to
->di_extsize
= cpu_to_be32(from
->di_extsize
);
352 to
->di_nextents
= cpu_to_be32(from
->di_nextents
);
353 to
->di_anextents
= cpu_to_be16(from
->di_anextents
);
354 to
->di_forkoff
= from
->di_forkoff
;
355 to
->di_aformat
= from
->di_aformat
;
356 to
->di_dmevmask
= cpu_to_be32(from
->di_dmevmask
);
357 to
->di_dmstate
= cpu_to_be16(from
->di_dmstate
);
358 to
->di_flags
= cpu_to_be16(from
->di_flags
);
359 to
->di_gen
= cpu_to_be32(from
->di_gen
);
361 if (from
->di_version
== 3) {
362 to
->di_changecount
= cpu_to_be64(from
->di_changecount
);
363 to
->di_crtime
.t_sec
= cpu_to_be32(from
->di_crtime
.t_sec
);
364 to
->di_crtime
.t_nsec
= cpu_to_be32(from
->di_crtime
.t_nsec
);
365 to
->di_flags2
= cpu_to_be64(from
->di_flags2
);
366 to
->di_cowextsize
= cpu_to_be32(from
->di_cowextsize
);
367 to
->di_ino
= cpu_to_be64(from
->di_ino
);
368 to
->di_lsn
= cpu_to_be64(from
->di_lsn
);
369 memcpy(to
->di_pad2
, from
->di_pad2
, sizeof(to
->di_pad2
));
370 uuid_copy(&to
->di_uuid
, &from
->di_uuid
);
371 to
->di_flushiter
= 0;
373 to
->di_flushiter
= cpu_to_be16(from
->di_flushiter
);
377 static xfs_failaddr_t
378 xfs_dinode_verify_fork(
379 struct xfs_dinode
*dip
,
380 struct xfs_mount
*mp
,
383 uint32_t di_nextents
= XFS_DFORK_NEXTENTS(dip
, whichfork
);
385 switch (XFS_DFORK_FORMAT(dip
, whichfork
)) {
386 case XFS_DINODE_FMT_LOCAL
:
388 * no local regular files yet
390 if (whichfork
== XFS_DATA_FORK
) {
391 if (S_ISREG(be16_to_cpu(dip
->di_mode
)))
392 return __this_address
;
393 if (be64_to_cpu(dip
->di_size
) >
394 XFS_DFORK_SIZE(dip
, mp
, whichfork
))
395 return __this_address
;
398 return __this_address
;
400 case XFS_DINODE_FMT_EXTENTS
:
401 if (di_nextents
> XFS_DFORK_MAXEXT(dip
, mp
, whichfork
))
402 return __this_address
;
404 case XFS_DINODE_FMT_BTREE
:
405 if (whichfork
== XFS_ATTR_FORK
) {
406 if (di_nextents
> MAXAEXTNUM
)
407 return __this_address
;
408 } else if (di_nextents
> MAXEXTNUM
) {
409 return __this_address
;
413 return __this_address
;
418 static xfs_failaddr_t
419 xfs_dinode_verify_forkoff(
420 struct xfs_dinode
*dip
,
421 struct xfs_mount
*mp
)
423 if (!XFS_DFORK_Q(dip
))
426 switch (dip
->di_format
) {
427 case XFS_DINODE_FMT_DEV
:
428 if (dip
->di_forkoff
!= (roundup(sizeof(xfs_dev_t
), 8) >> 3))
429 return __this_address
;
431 case XFS_DINODE_FMT_LOCAL
: /* fall through ... */
432 case XFS_DINODE_FMT_EXTENTS
: /* fall through ... */
433 case XFS_DINODE_FMT_BTREE
:
434 if (dip
->di_forkoff
>= (XFS_LITINO(mp
, dip
->di_version
) >> 3))
435 return __this_address
;
438 return __this_address
;
445 struct xfs_mount
*mp
,
447 struct xfs_dinode
*dip
)
455 if (dip
->di_magic
!= cpu_to_be16(XFS_DINODE_MAGIC
))
456 return __this_address
;
458 /* Verify v3 integrity information first */
459 if (dip
->di_version
>= 3) {
460 if (!xfs_sb_version_hascrc(&mp
->m_sb
))
461 return __this_address
;
462 if (!xfs_verify_cksum((char *)dip
, mp
->m_sb
.sb_inodesize
,
464 return __this_address
;
465 if (be64_to_cpu(dip
->di_ino
) != ino
)
466 return __this_address
;
467 if (!uuid_equal(&dip
->di_uuid
, &mp
->m_sb
.sb_meta_uuid
))
468 return __this_address
;
471 /* don't allow invalid i_size */
472 di_size
= be64_to_cpu(dip
->di_size
);
473 if (di_size
& (1ULL << 63))
474 return __this_address
;
476 mode
= be16_to_cpu(dip
->di_mode
);
477 if (mode
&& xfs_mode_to_ftype(mode
) == XFS_DIR3_FT_UNKNOWN
)
478 return __this_address
;
480 /* No zero-length symlinks/dirs. */
481 if ((S_ISLNK(mode
) || S_ISDIR(mode
)) && di_size
== 0)
482 return __this_address
;
484 /* Fork checks carried over from xfs_iformat_fork */
486 be32_to_cpu(dip
->di_nextents
) + be16_to_cpu(dip
->di_anextents
) >
487 be64_to_cpu(dip
->di_nblocks
))
488 return __this_address
;
490 if (mode
&& XFS_DFORK_BOFF(dip
) > mp
->m_sb
.sb_inodesize
)
491 return __this_address
;
493 flags
= be16_to_cpu(dip
->di_flags
);
495 if (mode
&& (flags
& XFS_DIFLAG_REALTIME
) && !mp
->m_rtdev_targp
)
496 return __this_address
;
498 /* check for illegal values of forkoff */
499 fa
= xfs_dinode_verify_forkoff(dip
, mp
);
503 /* Do we have appropriate data fork formats for the mode? */
504 switch (mode
& S_IFMT
) {
509 if (dip
->di_format
!= XFS_DINODE_FMT_DEV
)
510 return __this_address
;
515 fa
= xfs_dinode_verify_fork(dip
, mp
, XFS_DATA_FORK
);
520 /* Uninitialized inode ok. */
523 return __this_address
;
526 if (XFS_DFORK_Q(dip
)) {
527 fa
= xfs_dinode_verify_fork(dip
, mp
, XFS_ATTR_FORK
);
532 * If there is no fork offset, this may be a freshly-made inode
533 * in a new disk cluster, in which case di_aformat is zeroed.
534 * Otherwise, such an inode must be in EXTENTS format; this goes
535 * for freed inodes as well.
537 switch (dip
->di_aformat
) {
539 case XFS_DINODE_FMT_EXTENTS
:
542 return __this_address
;
544 if (dip
->di_anextents
)
545 return __this_address
;
548 /* extent size hint validation */
549 fa
= xfs_inode_validate_extsize(mp
, be32_to_cpu(dip
->di_extsize
),
554 /* only version 3 or greater inodes are extensively verified here */
555 if (dip
->di_version
< 3)
558 flags2
= be64_to_cpu(dip
->di_flags2
);
560 /* don't allow reflink/cowextsize if we don't have reflink */
561 if ((flags2
& (XFS_DIFLAG2_REFLINK
| XFS_DIFLAG2_COWEXTSIZE
)) &&
562 !xfs_sb_version_hasreflink(&mp
->m_sb
))
563 return __this_address
;
565 /* only regular files get reflink */
566 if ((flags2
& XFS_DIFLAG2_REFLINK
) && (mode
& S_IFMT
) != S_IFREG
)
567 return __this_address
;
569 /* don't let reflink and realtime mix */
570 if ((flags2
& XFS_DIFLAG2_REFLINK
) && (flags
& XFS_DIFLAG_REALTIME
))
571 return __this_address
;
573 /* don't let reflink and dax mix */
574 if ((flags2
& XFS_DIFLAG2_REFLINK
) && (flags2
& XFS_DIFLAG2_DAX
))
575 return __this_address
;
577 /* COW extent size hint validation */
578 fa
= xfs_inode_validate_cowextsize(mp
, be32_to_cpu(dip
->di_cowextsize
),
579 mode
, flags
, flags2
);
588 struct xfs_mount
*mp
,
589 struct xfs_dinode
*dip
)
593 if (dip
->di_version
< 3)
596 ASSERT(xfs_sb_version_hascrc(&mp
->m_sb
));
597 crc
= xfs_start_cksum_update((char *)dip
, mp
->m_sb
.sb_inodesize
,
599 dip
->di_crc
= xfs_end_cksum(crc
);
603 * Read the disk inode attributes into the in-core inode structure.
605 * For version 5 superblocks, if we are initialising a new inode and we are not
606 * utilising the XFS_MOUNT_IKEEP inode cluster mode, we can simple build the new
607 * inode core with a random generation number. If we are keeping inodes around,
608 * we need to read the inode cluster to get the existing generation number off
609 * disk. Further, if we are using version 4 superblocks (i.e. v1/v2 inode
610 * format) then log recovery is dependent on the di_flushiter field being
611 * initialised from the current on-disk value and hence we must also read the
627 * Fill in the location information in the in-core inode.
629 error
= xfs_imap(mp
, tp
, ip
->i_ino
, &ip
->i_imap
, iget_flags
);
633 /* shortcut IO on inode allocation if possible */
634 if ((iget_flags
& XFS_IGET_CREATE
) &&
635 xfs_sb_version_hascrc(&mp
->m_sb
) &&
636 !(mp
->m_flags
& XFS_MOUNT_IKEEP
)) {
637 /* initialise the on-disk inode core */
638 memset(&ip
->i_d
, 0, sizeof(ip
->i_d
));
639 VFS_I(ip
)->i_generation
= prandom_u32();
640 ip
->i_d
.di_version
= 3;
645 * Get pointers to the on-disk inode and the buffer containing it.
647 error
= xfs_imap_to_bp(mp
, tp
, &ip
->i_imap
, &dip
, &bp
, 0, iget_flags
);
651 /* even unallocated inodes are verified */
652 fa
= xfs_dinode_verify(mp
, ip
->i_ino
, dip
);
654 xfs_inode_verifier_error(ip
, -EFSCORRUPTED
, "dinode", dip
,
656 error
= -EFSCORRUPTED
;
661 * If the on-disk inode is already linked to a directory
662 * entry, copy all of the inode into the in-core inode.
663 * xfs_iformat_fork() handles copying in the inode format
664 * specific information.
665 * Otherwise, just get the truly permanent information.
668 xfs_inode_from_disk(ip
, dip
);
669 error
= xfs_iformat_fork(ip
, dip
);
672 xfs_alert(mp
, "%s: xfs_iformat() returned error %d",
679 * Partial initialisation of the in-core inode. Just the bits
680 * that xfs_ialloc won't overwrite or relies on being correct.
682 ip
->i_d
.di_version
= dip
->di_version
;
683 VFS_I(ip
)->i_generation
= be32_to_cpu(dip
->di_gen
);
684 ip
->i_d
.di_flushiter
= be16_to_cpu(dip
->di_flushiter
);
687 * Make sure to pull in the mode here as well in
688 * case the inode is released without being used.
689 * This ensures that xfs_inactive() will see that
690 * the inode is already free and not try to mess
691 * with the uninitialized part of it.
693 VFS_I(ip
)->i_mode
= 0;
696 ASSERT(ip
->i_d
.di_version
>= 2);
697 ip
->i_delayed_blks
= 0;
700 * Mark the buffer containing the inode as something to keep
701 * around for a while. This helps to keep recently accessed
702 * meta-data in-core longer.
704 xfs_buf_set_ref(bp
, XFS_INO_REF
);
707 * Use xfs_trans_brelse() to release the buffer containing the on-disk
708 * inode, because it was acquired with xfs_trans_read_buf() in
709 * xfs_imap_to_bp() above. If tp is NULL, this is just a normal
710 * brelse(). If we're within a transaction, then xfs_trans_brelse()
711 * will only release the buffer if it is not dirty within the
712 * transaction. It will be OK to release the buffer in this case,
713 * because inodes on disk are never destroyed and we will be locking the
714 * new in-core inode before putting it in the cache where other
715 * processes can find it. Thus we don't have to worry about the inode
716 * being changed just because we released the buffer.
719 xfs_trans_brelse(tp
, bp
);
724 * Validate di_extsize hint.
726 * The rules are documented at xfs_ioctl_setattr_check_extsize().
727 * These functions must be kept in sync with each other.
730 xfs_inode_validate_extsize(
731 struct xfs_mount
*mp
,
739 uint32_t extsize_bytes
;
740 uint32_t blocksize_bytes
;
742 rt_flag
= (flags
& XFS_DIFLAG_REALTIME
);
743 hint_flag
= (flags
& XFS_DIFLAG_EXTSIZE
);
744 inherit_flag
= (flags
& XFS_DIFLAG_EXTSZINHERIT
);
745 extsize_bytes
= XFS_FSB_TO_B(mp
, extsize
);
748 blocksize_bytes
= mp
->m_sb
.sb_rextsize
<< mp
->m_sb
.sb_blocklog
;
750 blocksize_bytes
= mp
->m_sb
.sb_blocksize
;
752 if ((hint_flag
|| inherit_flag
) && !(S_ISDIR(mode
) || S_ISREG(mode
)))
753 return __this_address
;
755 if (hint_flag
&& !S_ISREG(mode
))
756 return __this_address
;
758 if (inherit_flag
&& !S_ISDIR(mode
))
759 return __this_address
;
761 if ((hint_flag
|| inherit_flag
) && extsize
== 0)
762 return __this_address
;
764 /* free inodes get flags set to zero but extsize remains */
765 if (mode
&& !(hint_flag
|| inherit_flag
) && extsize
!= 0)
766 return __this_address
;
768 if (extsize_bytes
% blocksize_bytes
)
769 return __this_address
;
771 if (extsize
> MAXEXTLEN
)
772 return __this_address
;
774 if (!rt_flag
&& extsize
> mp
->m_sb
.sb_agblocks
/ 2)
775 return __this_address
;
781 * Validate di_cowextsize hint.
783 * The rules are documented at xfs_ioctl_setattr_check_cowextsize().
784 * These functions must be kept in sync with each other.
787 xfs_inode_validate_cowextsize(
788 struct xfs_mount
*mp
,
796 uint32_t cowextsize_bytes
;
798 rt_flag
= (flags
& XFS_DIFLAG_REALTIME
);
799 hint_flag
= (flags2
& XFS_DIFLAG2_COWEXTSIZE
);
800 cowextsize_bytes
= XFS_FSB_TO_B(mp
, cowextsize
);
802 if (hint_flag
&& !xfs_sb_version_hasreflink(&mp
->m_sb
))
803 return __this_address
;
805 if (hint_flag
&& !(S_ISDIR(mode
) || S_ISREG(mode
)))
806 return __this_address
;
808 if (hint_flag
&& cowextsize
== 0)
809 return __this_address
;
811 /* free inodes get flags set to zero but cowextsize remains */
812 if (mode
&& !hint_flag
&& cowextsize
!= 0)
813 return __this_address
;
815 if (hint_flag
&& rt_flag
)
816 return __this_address
;
818 if (cowextsize_bytes
% mp
->m_sb
.sb_blocksize
)
819 return __this_address
;
821 if (cowextsize
> MAXEXTLEN
)
822 return __this_address
;
824 if (cowextsize
> mp
->m_sb
.sb_agblocks
/ 2)
825 return __this_address
;