Thread (126 messages) 126 messages, 6 authors, 2022-01-08

Re: [PATCH 46/48] truncate,shmem: Handle truncates that split large folios

From: Christoph Hellwig <hch@infradead.org>
Date: 2021-12-23 08:43:32

+	partial_end = ((lend + 1) % PAGE_SIZE) > 0;
The > 0 reads a little odd as we can never get a negative value here.
+	shmem_get_folio(inode, lstart >> PAGE_SHIFT, &folio, SGP_READ);
+	if (folio) {
+		bool same_page;
+
+		same_page = lend < folio_pos(folio) + folio_size(folio);
+		if (same_page)
+			partial_end = false;
+		folio_mark_dirty(folio);
+		if (!truncate_inode_partial_folio(folio, lstart, lend)) {
+			start = folio->index + folio_nr_pages(folio);
+			if (same_page)
+				end = folio->index;
 		}
+		folio_unlock(folio);
+		folio_put(folio);
+		folio = NULL;
The entire logic after the shmem_get_folio call is duplicated in
truncate_inode_pages_range.  Shouldn't we ty to combine that by moving it
into a helper?

If we can't merge it I think same_page shoud be renamed to same_folio as in
truncate_inode_pages_range.
 	pgoff_t		start;		/* inclusive */
 	pgoff_t		end;		/* exclusive */
-	unsigned int	partial_start;	/* inclusive */
-	unsigned int	partial_end;	/* exclusive */
 	struct folio_batch fbatch;
 	pgoff_t		indices[PAGEVEC_SIZE];
 	pgoff_t		index;
 	int		i;
+	struct folio *	folio;
Weird indentation after the star.
+	bool partial_end;
And the style here in general does not seem to match the existing code.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help