Skip to content

Commit b74b129

Browse files
Christoph HellwigDarrick J. Wong
authored andcommitted
iomap: rework unshare flag
Instead of another internal flags namespace inside of buffered-io.c, just pass a UNSHARE hint in the main iomap flags field. Signed-off-by: Christoph Hellwig <[email protected]> Reviewed-by: Darrick J. Wong <[email protected]> Signed-off-by: Darrick J. Wong <[email protected]>
1 parent 1b5c1e3 commit b74b129

File tree

2 files changed

+10
-14
lines changed

2 files changed

+10
-14
lines changed

fs/iomap/buffered-io.c

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -508,10 +508,6 @@ iomap_migrate_page(struct address_space *mapping, struct page *newpage,
508508
EXPORT_SYMBOL_GPL(iomap_migrate_page);
509509
#endif /* CONFIG_MIGRATION */
510510

511-
enum {
512-
IOMAP_WRITE_F_UNSHARE = (1 << 0),
513-
};
514-
515511
static void
516512
iomap_write_failed(struct inode *inode, loff_t pos, unsigned len)
517513
{
@@ -541,7 +537,7 @@ iomap_read_page_sync(loff_t block_start, struct page *page, unsigned poff,
541537
}
542538

543539
static int __iomap_write_begin(struct iomap_iter *iter, loff_t pos,
544-
unsigned len, int flags, struct page *page)
540+
unsigned len, struct page *page)
545541
{
546542
struct iomap *srcmap = iomap_iter_srcmap(iter);
547543
struct iomap_page *iop = iomap_page_create(iter->inode, page);
@@ -560,13 +556,13 @@ static int __iomap_write_begin(struct iomap_iter *iter, loff_t pos,
560556
if (plen == 0)
561557
break;
562558

563-
if (!(flags & IOMAP_WRITE_F_UNSHARE) &&
559+
if (!(iter->flags & IOMAP_UNSHARE) &&
564560
(from <= poff || from >= poff + plen) &&
565561
(to <= poff || to >= poff + plen))
566562
continue;
567563

568564
if (iomap_block_needs_zeroing(iter, block_start)) {
569-
if (WARN_ON_ONCE(flags & IOMAP_WRITE_F_UNSHARE))
565+
if (WARN_ON_ONCE(iter->flags & IOMAP_UNSHARE))
570566
return -EIO;
571567
zero_user_segments(page, poff, from, to, poff + plen);
572568
} else {
@@ -596,7 +592,7 @@ static int iomap_write_begin_inline(struct iomap_iter *iter,
596592
}
597593

598594
static int iomap_write_begin(struct iomap_iter *iter, loff_t pos, unsigned len,
599-
unsigned flags, struct page **pagep)
595+
struct page **pagep)
600596
{
601597
const struct iomap_page_ops *page_ops = iter->iomap.page_ops;
602598
struct iomap *srcmap = iomap_iter_srcmap(iter);
@@ -628,7 +624,7 @@ static int iomap_write_begin(struct iomap_iter *iter, loff_t pos, unsigned len,
628624
else if (srcmap->flags & IOMAP_F_BUFFER_HEAD)
629625
status = __block_write_begin_int(page, pos, len, NULL, srcmap);
630626
else
631-
status = __iomap_write_begin(iter, pos, len, flags, page);
627+
status = __iomap_write_begin(iter, pos, len, page);
632628

633629
if (unlikely(status))
634630
goto out_unlock;
@@ -759,7 +755,7 @@ static loff_t iomap_write_iter(struct iomap_iter *iter, struct iov_iter *i)
759755
break;
760756
}
761757

762-
status = iomap_write_begin(iter, pos, bytes, 0, &page);
758+
status = iomap_write_begin(iter, pos, bytes, &page);
763759
if (unlikely(status))
764760
break;
765761

@@ -836,8 +832,7 @@ static loff_t iomap_unshare_iter(struct iomap_iter *iter)
836832
unsigned long bytes = min_t(loff_t, PAGE_SIZE - offset, length);
837833
struct page *page;
838834

839-
status = iomap_write_begin(iter, pos, bytes,
840-
IOMAP_WRITE_F_UNSHARE, &page);
835+
status = iomap_write_begin(iter, pos, bytes, &page);
841836
if (unlikely(status))
842837
return status;
843838

@@ -865,7 +860,7 @@ iomap_file_unshare(struct inode *inode, loff_t pos, loff_t len,
865860
.inode = inode,
866861
.pos = pos,
867862
.len = len,
868-
.flags = IOMAP_WRITE,
863+
.flags = IOMAP_WRITE | IOMAP_UNSHARE,
869864
};
870865
int ret;
871866

@@ -882,7 +877,7 @@ static s64 __iomap_zero_iter(struct iomap_iter *iter, loff_t pos, u64 length)
882877
unsigned offset = offset_in_page(pos);
883878
unsigned bytes = min_t(u64, PAGE_SIZE - offset, length);
884879

885-
status = iomap_write_begin(iter, pos, bytes, 0, &page);
880+
status = iomap_write_begin(iter, pos, bytes, &page);
886881
if (status)
887882
return status;
888883

include/linux/iomap.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ struct iomap_page_ops {
140140
#define IOMAP_DIRECT (1 << 4) /* direct I/O */
141141
#define IOMAP_NOWAIT (1 << 5) /* do not block */
142142
#define IOMAP_OVERWRITE_ONLY (1 << 6) /* only pure overwrites allowed */
143+
#define IOMAP_UNSHARE (1 << 7) /* unshare_file_range */
143144

144145
struct iomap_ops {
145146
/*

0 commit comments

Comments
 (0)