diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c index 5b52e9026b74..e43b3a1f6133 100644 --- a/fs/ceph/addr.c +++ b/fs/ceph/addr.c @@ -2201,48 +2201,43 @@ out_free: } #ifdef CONFIG_CEPH_FS_INLINE_DATA -void ceph_fill_inline_data(struct inode *inode, struct page *locked_page, +void ceph_fill_inline_data(struct inode *inode, struct folio *locked_folio, char *data, size_t len) { struct ceph_client *cl = ceph_inode_to_client(inode); struct address_space *mapping = inode->i_mapping; - struct page *page; + struct folio *folio; - if (locked_page) { - page = locked_page; + if (locked_folio) { + folio = locked_folio; } else { if (i_size_read(inode) == 0) return; - page = find_or_create_page(mapping, 0, - mapping_gfp_constraint(mapping, - ~__GFP_FS)); - if (!page) + folio = __filemap_get_folio(mapping, 0, + FGP_LOCK | FGP_ACCESSED | FGP_CREAT, + mapping_gfp_constraint(mapping, ~__GFP_FS)); + if (IS_ERR(folio)) return; - if (PageUptodate(page)) { - unlock_page(page); - put_page(page); + if (folio_test_uptodate(folio)) { + folio_unlock(folio); + folio_put(folio); return; } } - doutc(cl, "%p %llx.%llx len %zu locked_page %p\n", inode, - ceph_vinop(inode), len, locked_page); + doutc(cl, "%p %llx.%llx len %zu locked_folio %p\n", inode, + ceph_vinop(inode), len, locked_folio); - if (len > 0) { - void *kaddr = kmap_atomic(page); - memcpy(kaddr, data, len); - kunmap_atomic(kaddr); - } + if (len > 0) + memcpy_to_folio(folio, 0, data, len); - if (page != locked_page) { - if (len < PAGE_SIZE) - zero_user_segment(page, len, PAGE_SIZE); - else - flush_dcache_page(page); + if (folio != locked_folio) { + if (len < folio_size(folio)) + folio_zero_segment(folio, len, folio_size(folio)); - SetPageUptodate(page); - unlock_page(page); - put_page(page); + folio_mark_uptodate(folio); + folio_unlock(folio); + folio_put(folio); } } diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c index 4ed622a4cf0e..4cb703e307b0 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c @@ -1451,7 +1451,8 @@ int ceph_fill_inode(struct inode *inode, struct page *locked_page, ceph_fscache_register_inode_cookie(inode); if (fill_inline) - ceph_fill_inline_data(inode, locked_page, + ceph_fill_inline_data(inode, + locked_page ? page_folio(locked_page) : NULL, iinfo->inline_data, iinfo->inline_len); if (wake) diff --git a/fs/ceph/super.h b/fs/ceph/super.h index f37b438e7730..16a13529d0aa 100644 --- a/fs/ceph/super.h +++ b/fs/ceph/super.h @@ -1414,8 +1414,8 @@ int ceph_purge_inode_cap(struct inode *inode, struct ceph_cap *cap, bool *invali #ifdef CONFIG_CEPH_FS_INLINE_DATA extern int ceph_uninline_data(struct file *file); -extern void ceph_fill_inline_data(struct inode *inode, struct page *locked_page, - char *data, size_t len); +void ceph_fill_inline_data(struct inode *inode, struct folio *locked_folio, + char *data, size_t len); static inline u64 ceph_inline_version(const struct ceph_inode_info *ci) { @@ -1439,7 +1439,7 @@ static inline int ceph_uninline_data(struct file *file) } static inline void ceph_fill_inline_data(struct inode *inode, - struct page *locked_page, + struct folio *locked_folio, char *data, size_t len) { }