From: kernel test robot <lkp@intel.com>
To: Jeff Layton <jlayton@kernel.org>
Cc: llvm@lists.linux.dev, oe-kbuild-all@lists.linux.dev
Subject: [jlayton:mgctime 8/10] fs/xfs/xfs_iops.c:920:4: error: call to undeclared function 'current_mgtime'; ISO C99 and later do not support implicit function declarations
Date: Fri, 4 Aug 2023 04:52:27 +0800 [thread overview]
Message-ID: <202308040449.cQuIsvCc-lkp@intel.com> (raw)
tree: https://git.kernel.org/pub/scm/linux/kernel/git/jlayton/linux.git mgctime
head: ffef667f9698cae637fe41b46df59816f79c050f
commit: 710fc0a96d7a0e69f16b6ded3de9959969246c3e [8/10] xfs: switch to multigrain timestamps
config: riscv-randconfig-r023-20230731 (https://download.01.org/0day-ci/archive/20230804/202308040449.cQuIsvCc-lkp@intel.com/config)
compiler: clang version 17.0.0 (https://github.com/llvm/llvm-project.git 4a5ac14ee968ff0ad5d2cc1ffa0299048db4c88a)
reproduce: (https://download.01.org/0day-ci/archive/20230804/202308040449.cQuIsvCc-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202308040449.cQuIsvCc-lkp@intel.com/
All errors (new ones prefixed by >>):
>> fs/xfs/xfs_iops.c:920:4: error: call to undeclared function 'current_mgtime'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
920 | current_mgtime(inode);
| ^
fs/xfs/xfs_iops.c:920:4: note: did you mean 'current_time'?
include/linux/fs.h:1477:19: note: 'current_time' declared here
1477 | struct timespec64 current_time(struct inode *inode);
| ^
>> fs/xfs/xfs_iops.c:919:37: error: assigning to 'struct timespec64' from incompatible type 'int'
919 | iattr->ia_ctime = iattr->ia_mtime =
| ^
920 | current_mgtime(inode);
| ~~~~~~~~~~~~~~~~~~~~~
2 errors generated.
vim +/current_mgtime +920 fs/xfs/xfs_iops.c
772
773 /*
774 * Truncate file. Must have write permission and not be a directory.
775 *
776 * Caution: The caller of this function is responsible for calling
777 * setattr_prepare() or otherwise verifying the change is fine.
778 */
779 STATIC int
780 xfs_setattr_size(
781 struct mnt_idmap *idmap,
782 struct dentry *dentry,
783 struct xfs_inode *ip,
784 struct iattr *iattr)
785 {
786 struct xfs_mount *mp = ip->i_mount;
787 struct inode *inode = VFS_I(ip);
788 xfs_off_t oldsize, newsize;
789 struct xfs_trans *tp;
790 int error;
791 uint lock_flags = 0;
792 bool did_zeroing = false;
793
794 ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL));
795 ASSERT(xfs_isilocked(ip, XFS_MMAPLOCK_EXCL));
796 ASSERT(S_ISREG(inode->i_mode));
797 ASSERT((iattr->ia_valid & (ATTR_UID|ATTR_GID|ATTR_ATIME|ATTR_ATIME_SET|
798 ATTR_MTIME_SET|ATTR_TIMES_SET)) == 0);
799
800 oldsize = inode->i_size;
801 newsize = iattr->ia_size;
802
803 /*
804 * Short circuit the truncate case for zero length files.
805 */
806 if (newsize == 0 && oldsize == 0 && ip->i_df.if_nextents == 0) {
807 if (!(iattr->ia_valid & (ATTR_CTIME|ATTR_MTIME)))
808 return 0;
809
810 /*
811 * Use the regular setattr path to update the timestamps.
812 */
813 iattr->ia_valid &= ~ATTR_SIZE;
814 return xfs_setattr_nonsize(idmap, dentry, ip, iattr);
815 }
816
817 /*
818 * Make sure that the dquots are attached to the inode.
819 */
820 error = xfs_qm_dqattach(ip);
821 if (error)
822 return error;
823
824 /*
825 * Wait for all direct I/O to complete.
826 */
827 inode_dio_wait(inode);
828
829 /*
830 * File data changes must be complete before we start the transaction to
831 * modify the inode. This needs to be done before joining the inode to
832 * the transaction because the inode cannot be unlocked once it is a
833 * part of the transaction.
834 *
835 * Start with zeroing any data beyond EOF that we may expose on file
836 * extension, or zeroing out the rest of the block on a downward
837 * truncate.
838 */
839 if (newsize > oldsize) {
840 trace_xfs_zero_eof(ip, oldsize, newsize - oldsize);
841 error = xfs_zero_range(ip, oldsize, newsize - oldsize,
842 &did_zeroing);
843 } else {
844 /*
845 * iomap won't detect a dirty page over an unwritten block (or a
846 * cow block over a hole) and subsequently skips zeroing the
847 * newly post-EOF portion of the page. Flush the new EOF to
848 * convert the block before the pagecache truncate.
849 */
850 error = filemap_write_and_wait_range(inode->i_mapping, newsize,
851 newsize);
852 if (error)
853 return error;
854 error = xfs_truncate_page(ip, newsize, &did_zeroing);
855 }
856
857 if (error)
858 return error;
859
860 /*
861 * We've already locked out new page faults, so now we can safely remove
862 * pages from the page cache knowing they won't get refaulted until we
863 * drop the XFS_MMAP_EXCL lock after the extent manipulations are
864 * complete. The truncate_setsize() call also cleans partial EOF page
865 * PTEs on extending truncates and hence ensures sub-page block size
866 * filesystems are correctly handled, too.
867 *
868 * We have to do all the page cache truncate work outside the
869 * transaction context as the "lock" order is page lock->log space
870 * reservation as defined by extent allocation in the writeback path.
871 * Hence a truncate can fail with ENOMEM from xfs_trans_alloc(), but
872 * having already truncated the in-memory version of the file (i.e. made
873 * user visible changes). There's not much we can do about this, except
874 * to hope that the caller sees ENOMEM and retries the truncate
875 * operation.
876 *
877 * And we update in-core i_size and truncate page cache beyond newsize
878 * before writeback the [i_disk_size, newsize] range, so we're
879 * guaranteed not to write stale data past the new EOF on truncate down.
880 */
881 truncate_setsize(inode, newsize);
882
883 /*
884 * We are going to log the inode size change in this transaction so
885 * any previous writes that are beyond the on disk EOF and the new
886 * EOF that have not been written out need to be written here. If we
887 * do not write the data out, we expose ourselves to the null files
888 * problem. Note that this includes any block zeroing we did above;
889 * otherwise those blocks may not be zeroed after a crash.
890 */
891 if (did_zeroing ||
892 (newsize > ip->i_disk_size && oldsize != ip->i_disk_size)) {
893 error = filemap_write_and_wait_range(VFS_I(ip)->i_mapping,
894 ip->i_disk_size, newsize - 1);
895 if (error)
896 return error;
897 }
898
899 error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate, 0, 0, 0, &tp);
900 if (error)
901 return error;
902
903 lock_flags |= XFS_ILOCK_EXCL;
904 xfs_ilock(ip, XFS_ILOCK_EXCL);
905 xfs_trans_ijoin(tp, ip, 0);
906
907 /*
908 * Only change the c/mtime if we are changing the size or we are
909 * explicitly asked to change it. This handles the semantic difference
910 * between truncate() and ftruncate() as implemented in the VFS.
911 *
912 * The regular truncate() case without ATTR_CTIME and ATTR_MTIME is a
913 * special case where we need to update the times despite not having
914 * these flags set. For all other operations the VFS set these flags
915 * explicitly if it wants a timestamp update.
916 */
917 if (newsize != oldsize &&
918 !(iattr->ia_valid & (ATTR_CTIME | ATTR_MTIME))) {
> 919 iattr->ia_ctime = iattr->ia_mtime =
> 920 current_mgtime(inode);
921 iattr->ia_valid |= ATTR_CTIME | ATTR_MTIME;
922 }
923
924 /*
925 * The first thing we do is set the size to new_size permanently on
926 * disk. This way we don't have to worry about anyone ever being able
927 * to look at the data being freed even in the face of a crash.
928 * What we're getting around here is the case where we free a block, it
929 * is allocated to another file, it is written to, and then we crash.
930 * If the new data gets written to the file but the log buffers
931 * containing the free and reallocation don't, then we'd end up with
932 * garbage in the blocks being freed. As long as we make the new size
933 * permanent before actually freeing any blocks it doesn't matter if
934 * they get written to.
935 */
936 ip->i_disk_size = newsize;
937 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
938
939 if (newsize <= oldsize) {
940 error = xfs_itruncate_extents(&tp, ip, XFS_DATA_FORK, newsize);
941 if (error)
942 goto out_trans_cancel;
943
944 /*
945 * Truncated "down", so we're removing references to old data
946 * here - if we delay flushing for a long time, we expose
947 * ourselves unduly to the notorious NULL files problem. So,
948 * we mark this inode and flush it when the file is closed,
949 * and do not wait the usual (long) time for writeout.
950 */
951 xfs_iflags_set(ip, XFS_ITRUNCATED);
952
953 /* A truncate down always removes post-EOF blocks. */
954 xfs_inode_clear_eofblocks_tag(ip);
955 }
956
957 ASSERT(!(iattr->ia_valid & (ATTR_UID | ATTR_GID)));
958 setattr_copy(idmap, inode, iattr);
959 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
960
961 XFS_STATS_INC(mp, xs_ig_attrchg);
962
963 if (xfs_has_wsync(mp))
964 xfs_trans_set_sync(tp);
965
966 error = xfs_trans_commit(tp);
967 out_unlock:
968 if (lock_flags)
969 xfs_iunlock(ip, lock_flags);
970 return error;
971
972 out_trans_cancel:
973 xfs_trans_cancel(tp);
974 goto out_unlock;
975 }
976
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
reply other threads:[~2023-08-03 20:52 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202308040449.cQuIsvCc-lkp@intel.com \
--to=lkp@intel.com \
--cc=jlayton@kernel.org \
--cc=llvm@lists.linux.dev \
--cc=oe-kbuild-all@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox