]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
fs: Add uoff_t
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Sun, 23 Nov 2025 22:05:15 +0000 (22:05 +0000)
committerChristian Brauner <brauner@kernel.org>
Tue, 25 Nov 2025 09:07:42 +0000 (10:07 +0100)
In a recent commit, I inadvertently changed a comparison from being an
unsigned comparison (on 64-bit systems) to being a signed comparison
(which it had always been on 32-bit systems).  This led to a sporadic
fstests failure.

To make sure this comparison is always unsigned, introduce a new type,
uoff_t which is the unsigned version of loff_t.  Generally file sizes
are restricted to being a signed integer, but in these two places it is
convenient to pass -1 to indicate "up to the end of the file".

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Link: https://patch.msgid.link/20251123220518.1447261-1-willy@infradead.org
Signed-off-by: Christian Brauner <brauner@kernel.org>
include/linux/mm.h
include/linux/shmem_fs.h
include/linux/types.h
include/uapi/asm-generic/posix_types.h
mm/shmem.c
mm/truncate.c

index d16b33bacc32bc306029dd5f0b4fd51a2d8644d2..2a36d1bcf491690cd70ac936f607e3dac22a67d4 100644 (file)
@@ -3495,10 +3495,10 @@ struct vm_unmapped_area_info {
 extern unsigned long vm_unmapped_area(struct vm_unmapped_area_info *info);
 
 /* truncate.c */
-extern void truncate_inode_pages(struct address_space *, loff_t);
-extern void truncate_inode_pages_range(struct address_space *,
-                                      loff_t lstart, loff_t lend);
-extern void truncate_inode_pages_final(struct address_space *);
+void truncate_inode_pages(struct address_space *mapping, loff_t lstart);
+void truncate_inode_pages_range(struct address_space *mapping, loff_t lstart,
+               uoff_t lend);
+void truncate_inode_pages_final(struct address_space *mapping);
 
 /* generic vm_area_ops exported for stackable file systems */
 extern vm_fault_t filemap_fault(struct vm_fault *vmf);
index 0e47465ef0fd506638c0b972e1e98a9815208b1a..774efe592a9a9d3cd4efe8c374ca1e6008c56b79 100644 (file)
@@ -111,7 +111,7 @@ struct page *shmem_read_mapping_page_gfp(struct address_space *mapping,
                                        pgoff_t index, gfp_t gfp_mask);
 int shmem_writeout(struct folio *folio, struct swap_iocb **plug,
                struct list_head *folio_list);
-void shmem_truncate_range(struct inode *inode, loff_t start, loff_t end);
+void shmem_truncate_range(struct inode *inode, loff_t start, uoff_t end);
 int shmem_unuse(unsigned int type);
 
 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
index 6dfdb8e8e4c35cdb43987dc40a1b162b969c159b..d4437e9c452c5a158a9ae84e65ae8c61c2493918 100644 (file)
@@ -50,6 +50,7 @@ typedef __kernel_old_gid_t    old_gid_t;
 
 #if defined(__GNUC__)
 typedef __kernel_loff_t                loff_t;
+typedef __kernel_uoff_t                uoff_t;
 #endif
 
 /*
index b5f7594eee7ab26ced0d3041ffa04a2662a39818..0a90ad92dbf3a29df42901afeb643feeddbe87ae 100644 (file)
@@ -86,6 +86,7 @@ typedef struct {
  */
 typedef __kernel_long_t        __kernel_off_t;
 typedef long long      __kernel_loff_t;
+typedef unsigned long long     __kernel_uoff_t;
 typedef __kernel_long_t        __kernel_old_time_t;
 #ifndef __KERNEL__
 typedef __kernel_long_t        __kernel_time_t;
index c819cecf1ed9c7894f5f5fcd15a55ec6cc227c1c..43b41a42c4637603462c21e752d6e5e40b2c81f4 100644 (file)
@@ -1076,7 +1076,7 @@ static struct folio *shmem_get_partial_folio(struct inode *inode, pgoff_t index)
  * Remove range of pages and swap entries from page cache, and free them.
  * If !unfalloc, truncate or punch hole; if unfalloc, undo failed fallocate.
  */
-static void shmem_undo_range(struct inode *inode, loff_t lstart, loff_t lend,
+static void shmem_undo_range(struct inode *inode, loff_t lstart, uoff_t lend,
                                                                 bool unfalloc)
 {
        struct address_space *mapping = inode->i_mapping;
@@ -1227,7 +1227,7 @@ whole_folios:
        shmem_recalc_inode(inode, 0, -nr_swaps_freed);
 }
 
-void shmem_truncate_range(struct inode *inode, loff_t lstart, loff_t lend)
+void shmem_truncate_range(struct inode *inode, loff_t lstart, uoff_t lend)
 {
        shmem_undo_range(inode, lstart, lend, false);
        inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode));
@@ -5776,7 +5776,7 @@ unsigned long shmem_get_unmapped_area(struct file *file,
 }
 #endif
 
-void shmem_truncate_range(struct inode *inode, loff_t lstart, loff_t lend)
+void shmem_truncate_range(struct inode *inode, loff_t lstart, uoff_t lend)
 {
        truncate_inode_pages_range(inode->i_mapping, lstart, lend);
 }
index a3d673533e32d744843d5311afc05724a50a11c5..fbe848fdc391f7e2983c45165e390637ab23a2a6 100644 (file)
@@ -339,7 +339,7 @@ long mapping_evict_folio(struct address_space *mapping, struct folio *folio)
  * page aligned properly.
  */
 void truncate_inode_pages_range(struct address_space *mapping,
-                               loff_t lstart, loff_t lend)
+                               loff_t lstart, uoff_t lend)
 {
        pgoff_t         start;          /* inclusive */
        pgoff_t         end;            /* exclusive */