cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

inode.c (29461B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * (C) 2001 Clemson University and The University of Chicago
      4 * Copyright 2018 Omnibond Systems, L.L.C.
      5 *
      6 * See COPYING in top-level directory.
      7 */
      8
      9/*
     10 *  Linux VFS inode operations.
     11 */
     12
     13#include <linux/blkdev.h>
     14#include <linux/fileattr.h>
     15#include "protocol.h"
     16#include "orangefs-kernel.h"
     17#include "orangefs-bufmap.h"
     18
     19static int orangefs_writepage_locked(struct page *page,
     20    struct writeback_control *wbc)
     21{
     22	struct inode *inode = page->mapping->host;
     23	struct orangefs_write_range *wr = NULL;
     24	struct iov_iter iter;
     25	struct bio_vec bv;
     26	size_t len, wlen;
     27	ssize_t ret;
     28	loff_t off;
     29
     30	set_page_writeback(page);
     31
     32	len = i_size_read(inode);
     33	if (PagePrivate(page)) {
     34		wr = (struct orangefs_write_range *)page_private(page);
     35		WARN_ON(wr->pos >= len);
     36		off = wr->pos;
     37		if (off + wr->len > len)
     38			wlen = len - off;
     39		else
     40			wlen = wr->len;
     41	} else {
     42		WARN_ON(1);
     43		off = page_offset(page);
     44		if (off + PAGE_SIZE > len)
     45			wlen = len - off;
     46		else
     47			wlen = PAGE_SIZE;
     48	}
     49	/* Should've been handled in orangefs_invalidate_folio. */
     50	WARN_ON(off == len || off + wlen > len);
     51
     52	bv.bv_page = page;
     53	bv.bv_len = wlen;
     54	bv.bv_offset = off % PAGE_SIZE;
     55	WARN_ON(wlen == 0);
     56	iov_iter_bvec(&iter, WRITE, &bv, 1, wlen);
     57
     58	ret = wait_for_direct_io(ORANGEFS_IO_WRITE, inode, &off, &iter, wlen,
     59	    len, wr, NULL, NULL);
     60	if (ret < 0) {
     61		SetPageError(page);
     62		mapping_set_error(page->mapping, ret);
     63	} else {
     64		ret = 0;
     65	}
     66	kfree(detach_page_private(page));
     67	return ret;
     68}
     69
     70static int orangefs_writepage(struct page *page, struct writeback_control *wbc)
     71{
     72	int ret;
     73	ret = orangefs_writepage_locked(page, wbc);
     74	unlock_page(page);
     75	end_page_writeback(page);
     76	return ret;
     77}
     78
     79struct orangefs_writepages {
     80	loff_t off;
     81	size_t len;
     82	kuid_t uid;
     83	kgid_t gid;
     84	int maxpages;
     85	int npages;
     86	struct page **pages;
     87	struct bio_vec *bv;
     88};
     89
     90static int orangefs_writepages_work(struct orangefs_writepages *ow,
     91    struct writeback_control *wbc)
     92{
     93	struct inode *inode = ow->pages[0]->mapping->host;
     94	struct orangefs_write_range *wrp, wr;
     95	struct iov_iter iter;
     96	ssize_t ret;
     97	size_t len;
     98	loff_t off;
     99	int i;
    100
    101	len = i_size_read(inode);
    102
    103	for (i = 0; i < ow->npages; i++) {
    104		set_page_writeback(ow->pages[i]);
    105		ow->bv[i].bv_page = ow->pages[i];
    106		ow->bv[i].bv_len = min(page_offset(ow->pages[i]) + PAGE_SIZE,
    107		    ow->off + ow->len) -
    108		    max(ow->off, page_offset(ow->pages[i]));
    109		if (i == 0)
    110			ow->bv[i].bv_offset = ow->off -
    111			    page_offset(ow->pages[i]);
    112		else
    113			ow->bv[i].bv_offset = 0;
    114	}
    115	iov_iter_bvec(&iter, WRITE, ow->bv, ow->npages, ow->len);
    116
    117	WARN_ON(ow->off >= len);
    118	if (ow->off + ow->len > len)
    119		ow->len = len - ow->off;
    120
    121	off = ow->off;
    122	wr.uid = ow->uid;
    123	wr.gid = ow->gid;
    124	ret = wait_for_direct_io(ORANGEFS_IO_WRITE, inode, &off, &iter, ow->len,
    125	    0, &wr, NULL, NULL);
    126	if (ret < 0) {
    127		for (i = 0; i < ow->npages; i++) {
    128			SetPageError(ow->pages[i]);
    129			mapping_set_error(ow->pages[i]->mapping, ret);
    130			if (PagePrivate(ow->pages[i])) {
    131				wrp = (struct orangefs_write_range *)
    132				    page_private(ow->pages[i]);
    133				ClearPagePrivate(ow->pages[i]);
    134				put_page(ow->pages[i]);
    135				kfree(wrp);
    136			}
    137			end_page_writeback(ow->pages[i]);
    138			unlock_page(ow->pages[i]);
    139		}
    140	} else {
    141		ret = 0;
    142		for (i = 0; i < ow->npages; i++) {
    143			if (PagePrivate(ow->pages[i])) {
    144				wrp = (struct orangefs_write_range *)
    145				    page_private(ow->pages[i]);
    146				ClearPagePrivate(ow->pages[i]);
    147				put_page(ow->pages[i]);
    148				kfree(wrp);
    149			}
    150			end_page_writeback(ow->pages[i]);
    151			unlock_page(ow->pages[i]);
    152		}
    153	}
    154	return ret;
    155}
    156
    157static int orangefs_writepages_callback(struct page *page,
    158    struct writeback_control *wbc, void *data)
    159{
    160	struct orangefs_writepages *ow = data;
    161	struct orangefs_write_range *wr;
    162	int ret;
    163
    164	if (!PagePrivate(page)) {
    165		unlock_page(page);
    166		/* It's not private so there's nothing to write, right? */
    167		printk("writepages_callback not private!\n");
    168		BUG();
    169		return 0;
    170	}
    171	wr = (struct orangefs_write_range *)page_private(page);
    172
    173	ret = -1;
    174	if (ow->npages == 0) {
    175		ow->off = wr->pos;
    176		ow->len = wr->len;
    177		ow->uid = wr->uid;
    178		ow->gid = wr->gid;
    179		ow->pages[ow->npages++] = page;
    180		ret = 0;
    181		goto done;
    182	}
    183	if (!uid_eq(ow->uid, wr->uid) || !gid_eq(ow->gid, wr->gid)) {
    184		orangefs_writepages_work(ow, wbc);
    185		ow->npages = 0;
    186		ret = -1;
    187		goto done;
    188	}
    189	if (ow->off + ow->len == wr->pos) {
    190		ow->len += wr->len;
    191		ow->pages[ow->npages++] = page;
    192		ret = 0;
    193		goto done;
    194	}
    195done:
    196	if (ret == -1) {
    197		if (ow->npages) {
    198			orangefs_writepages_work(ow, wbc);
    199			ow->npages = 0;
    200		}
    201		ret = orangefs_writepage_locked(page, wbc);
    202		mapping_set_error(page->mapping, ret);
    203		unlock_page(page);
    204		end_page_writeback(page);
    205	} else {
    206		if (ow->npages == ow->maxpages) {
    207			orangefs_writepages_work(ow, wbc);
    208			ow->npages = 0;
    209		}
    210	}
    211	return ret;
    212}
    213
    214static int orangefs_writepages(struct address_space *mapping,
    215    struct writeback_control *wbc)
    216{
    217	struct orangefs_writepages *ow;
    218	struct blk_plug plug;
    219	int ret;
    220	ow = kzalloc(sizeof(struct orangefs_writepages), GFP_KERNEL);
    221	if (!ow)
    222		return -ENOMEM;
    223	ow->maxpages = orangefs_bufmap_size_query()/PAGE_SIZE;
    224	ow->pages = kcalloc(ow->maxpages, sizeof(struct page *), GFP_KERNEL);
    225	if (!ow->pages) {
    226		kfree(ow);
    227		return -ENOMEM;
    228	}
    229	ow->bv = kcalloc(ow->maxpages, sizeof(struct bio_vec), GFP_KERNEL);
    230	if (!ow->bv) {
    231		kfree(ow->pages);
    232		kfree(ow);
    233		return -ENOMEM;
    234	}
    235	blk_start_plug(&plug);
    236	ret = write_cache_pages(mapping, wbc, orangefs_writepages_callback, ow);
    237	if (ow->npages)
    238		ret = orangefs_writepages_work(ow, wbc);
    239	blk_finish_plug(&plug);
    240	kfree(ow->pages);
    241	kfree(ow->bv);
    242	kfree(ow);
    243	return ret;
    244}
    245
    246static int orangefs_launder_folio(struct folio *);
    247
    248static void orangefs_readahead(struct readahead_control *rac)
    249{
    250	loff_t offset;
    251	struct iov_iter iter;
    252	struct inode *inode = rac->mapping->host;
    253	struct xarray *i_pages;
    254	struct page *page;
    255	loff_t new_start = readahead_pos(rac);
    256	int ret;
    257	size_t new_len = 0;
    258
    259	loff_t bytes_remaining = inode->i_size - readahead_pos(rac);
    260	loff_t pages_remaining = bytes_remaining / PAGE_SIZE;
    261
    262	if (pages_remaining >= 1024)
    263		new_len = 4194304;
    264	else if (pages_remaining > readahead_count(rac))
    265		new_len = bytes_remaining;
    266
    267	if (new_len)
    268		readahead_expand(rac, new_start, new_len);
    269
    270	offset = readahead_pos(rac);
    271	i_pages = &rac->mapping->i_pages;
    272
    273	iov_iter_xarray(&iter, READ, i_pages, offset, readahead_length(rac));
    274
    275	/* read in the pages. */
    276	if ((ret = wait_for_direct_io(ORANGEFS_IO_READ, inode,
    277			&offset, &iter, readahead_length(rac),
    278			inode->i_size, NULL, NULL, rac->file)) < 0)
    279		gossip_debug(GOSSIP_FILE_DEBUG,
    280			"%s: wait_for_direct_io failed. \n", __func__);
    281	else
    282		ret = 0;
    283
    284	/* clean up. */
    285	while ((page = readahead_page(rac))) {
    286		page_endio(page, false, ret);
    287		put_page(page);
    288	}
    289}
    290
    291static int orangefs_read_folio(struct file *file, struct folio *folio)
    292{
    293	struct inode *inode = folio->mapping->host;
    294	struct iov_iter iter;
    295	struct bio_vec bv;
    296	ssize_t ret;
    297	loff_t off; /* offset of this folio in the file */
    298
    299	if (folio_test_dirty(folio))
    300		orangefs_launder_folio(folio);
    301
    302	off = folio_pos(folio);
    303	bv.bv_page = &folio->page;
    304	bv.bv_len = folio_size(folio);
    305	bv.bv_offset = 0;
    306	iov_iter_bvec(&iter, READ, &bv, 1, folio_size(folio));
    307
    308	ret = wait_for_direct_io(ORANGEFS_IO_READ, inode, &off, &iter,
    309			folio_size(folio), inode->i_size, NULL, NULL, file);
    310	/* this will only zero remaining unread portions of the page data */
    311	iov_iter_zero(~0U, &iter);
    312	/* takes care of potential aliasing */
    313	flush_dcache_folio(folio);
    314	if (ret < 0) {
    315		folio_set_error(folio);
    316	} else {
    317		folio_mark_uptodate(folio);
    318		if (folio_test_error(folio))
    319			folio_clear_error(folio);
    320		ret = 0;
    321	}
    322	/* unlock the folio after the ->read_folio() routine completes */
    323	folio_unlock(folio);
    324        return ret;
    325}
    326
    327static int orangefs_write_begin(struct file *file,
    328		struct address_space *mapping, loff_t pos, unsigned len,
    329		struct page **pagep, void **fsdata)
    330{
    331	struct orangefs_write_range *wr;
    332	struct folio *folio;
    333	struct page *page;
    334	pgoff_t index;
    335	int ret;
    336
    337	index = pos >> PAGE_SHIFT;
    338
    339	page = grab_cache_page_write_begin(mapping, index);
    340	if (!page)
    341		return -ENOMEM;
    342
    343	*pagep = page;
    344	folio = page_folio(page);
    345
    346	if (folio_test_dirty(folio) && !folio_test_private(folio)) {
    347		/*
    348		 * Should be impossible.  If it happens, launder the page
    349		 * since we don't know what's dirty.  This will WARN in
    350		 * orangefs_writepage_locked.
    351		 */
    352		ret = orangefs_launder_folio(folio);
    353		if (ret)
    354			return ret;
    355	}
    356	if (folio_test_private(folio)) {
    357		struct orangefs_write_range *wr;
    358		wr = folio_get_private(folio);
    359		if (wr->pos + wr->len == pos &&
    360		    uid_eq(wr->uid, current_fsuid()) &&
    361		    gid_eq(wr->gid, current_fsgid())) {
    362			wr->len += len;
    363			goto okay;
    364		} else {
    365			ret = orangefs_launder_folio(folio);
    366			if (ret)
    367				return ret;
    368		}
    369	}
    370
    371	wr = kmalloc(sizeof *wr, GFP_KERNEL);
    372	if (!wr)
    373		return -ENOMEM;
    374
    375	wr->pos = pos;
    376	wr->len = len;
    377	wr->uid = current_fsuid();
    378	wr->gid = current_fsgid();
    379	folio_attach_private(folio, wr);
    380okay:
    381	return 0;
    382}
    383
    384static int orangefs_write_end(struct file *file, struct address_space *mapping,
    385    loff_t pos, unsigned len, unsigned copied, struct page *page, void *fsdata)
    386{
    387	struct inode *inode = page->mapping->host;
    388	loff_t last_pos = pos + copied;
    389
    390	/*
    391	 * No need to use i_size_read() here, the i_size
    392	 * cannot change under us because we hold the i_mutex.
    393	 */
    394	if (last_pos > inode->i_size)
    395		i_size_write(inode, last_pos);
    396
    397	/* zero the stale part of the page if we did a short copy */
    398	if (!PageUptodate(page)) {
    399		unsigned from = pos & (PAGE_SIZE - 1);
    400		if (copied < len) {
    401			zero_user(page, from + copied, len - copied);
    402		}
    403		/* Set fully written pages uptodate. */
    404		if (pos == page_offset(page) &&
    405		    (len == PAGE_SIZE || pos + len == inode->i_size)) {
    406			zero_user_segment(page, from + copied, PAGE_SIZE);
    407			SetPageUptodate(page);
    408		}
    409	}
    410
    411	set_page_dirty(page);
    412	unlock_page(page);
    413	put_page(page);
    414
    415	mark_inode_dirty_sync(file_inode(file));
    416	return copied;
    417}
    418
    419static void orangefs_invalidate_folio(struct folio *folio,
    420				 size_t offset, size_t length)
    421{
    422	struct orangefs_write_range *wr = folio_get_private(folio);
    423
    424	if (offset == 0 && length == PAGE_SIZE) {
    425		kfree(folio_detach_private(folio));
    426		return;
    427	/* write range entirely within invalidate range (or equal) */
    428	} else if (folio_pos(folio) + offset <= wr->pos &&
    429	    wr->pos + wr->len <= folio_pos(folio) + offset + length) {
    430		kfree(folio_detach_private(folio));
    431		/* XXX is this right? only caller in fs */
    432		folio_cancel_dirty(folio);
    433		return;
    434	/* invalidate range chops off end of write range */
    435	} else if (wr->pos < folio_pos(folio) + offset &&
    436	    wr->pos + wr->len <= folio_pos(folio) + offset + length &&
    437	     folio_pos(folio) + offset < wr->pos + wr->len) {
    438		size_t x;
    439		x = wr->pos + wr->len - (folio_pos(folio) + offset);
    440		WARN_ON(x > wr->len);
    441		wr->len -= x;
    442		wr->uid = current_fsuid();
    443		wr->gid = current_fsgid();
    444	/* invalidate range chops off beginning of write range */
    445	} else if (folio_pos(folio) + offset <= wr->pos &&
    446	    folio_pos(folio) + offset + length < wr->pos + wr->len &&
    447	    wr->pos < folio_pos(folio) + offset + length) {
    448		size_t x;
    449		x = folio_pos(folio) + offset + length - wr->pos;
    450		WARN_ON(x > wr->len);
    451		wr->pos += x;
    452		wr->len -= x;
    453		wr->uid = current_fsuid();
    454		wr->gid = current_fsgid();
    455	/* invalidate range entirely within write range (punch hole) */
    456	} else if (wr->pos < folio_pos(folio) + offset &&
    457	    folio_pos(folio) + offset + length < wr->pos + wr->len) {
    458		/* XXX what do we do here... should not WARN_ON */
    459		WARN_ON(1);
    460		/* punch hole */
    461		/*
    462		 * should we just ignore this and write it out anyway?
    463		 * it hardly makes sense
    464		 */
    465		return;
    466	/* non-overlapping ranges */
    467	} else {
    468		/* WARN if they do overlap */
    469		if (!((folio_pos(folio) + offset + length <= wr->pos) ^
    470		    (wr->pos + wr->len <= folio_pos(folio) + offset))) {
    471			WARN_ON(1);
    472			printk("invalidate range offset %llu length %zu\n",
    473			    folio_pos(folio) + offset, length);
    474			printk("write range offset %llu length %zu\n",
    475			    wr->pos, wr->len);
    476		}
    477		return;
    478	}
    479
    480	/*
    481	 * Above there are returns where wr is freed or where we WARN.
    482	 * Thus the following runs if wr was modified above.
    483	 */
    484
    485	orangefs_launder_folio(folio);
    486}
    487
    488static bool orangefs_release_folio(struct folio *folio, gfp_t foo)
    489{
    490	return !folio_test_private(folio);
    491}
    492
    493static void orangefs_free_folio(struct folio *folio)
    494{
    495	kfree(folio_detach_private(folio));
    496}
    497
    498static int orangefs_launder_folio(struct folio *folio)
    499{
    500	int r = 0;
    501	struct writeback_control wbc = {
    502		.sync_mode = WB_SYNC_ALL,
    503		.nr_to_write = 0,
    504	};
    505	folio_wait_writeback(folio);
    506	if (folio_clear_dirty_for_io(folio)) {
    507		r = orangefs_writepage_locked(&folio->page, &wbc);
    508		folio_end_writeback(folio);
    509	}
    510	return r;
    511}
    512
    513static ssize_t orangefs_direct_IO(struct kiocb *iocb,
    514				  struct iov_iter *iter)
    515{
    516	/*
    517	 * Comment from original do_readv_writev:
    518	 * Common entry point for read/write/readv/writev
    519	 * This function will dispatch it to either the direct I/O
    520	 * or buffered I/O path depending on the mount options and/or
    521	 * augmented/extended metadata attached to the file.
    522	 * Note: File extended attributes override any mount options.
    523	 */
    524	struct file *file = iocb->ki_filp;
    525	loff_t pos = iocb->ki_pos;
    526	enum ORANGEFS_io_type type = iov_iter_rw(iter) == WRITE ?
    527            ORANGEFS_IO_WRITE : ORANGEFS_IO_READ;
    528	loff_t *offset = &pos;
    529	struct inode *inode = file->f_mapping->host;
    530	struct orangefs_inode_s *orangefs_inode = ORANGEFS_I(inode);
    531	struct orangefs_khandle *handle = &orangefs_inode->refn.khandle;
    532	size_t count = iov_iter_count(iter);
    533	ssize_t total_count = 0;
    534	ssize_t ret = -EINVAL;
    535	int i = 0;
    536
    537	gossip_debug(GOSSIP_FILE_DEBUG,
    538		"%s-BEGIN(%pU): count(%d) after estimate_max_iovecs.\n",
    539		__func__,
    540		handle,
    541		(int)count);
    542
    543	if (type == ORANGEFS_IO_WRITE) {
    544		gossip_debug(GOSSIP_FILE_DEBUG,
    545			     "%s(%pU): proceeding with offset : %llu, "
    546			     "size %d\n",
    547			     __func__,
    548			     handle,
    549			     llu(*offset),
    550			     (int)count);
    551	}
    552
    553	if (count == 0) {
    554		ret = 0;
    555		goto out;
    556	}
    557
    558	while (iov_iter_count(iter)) {
    559		size_t each_count = iov_iter_count(iter);
    560		size_t amt_complete;
    561		i++;
    562
    563		/* how much to transfer in this loop iteration */
    564		if (each_count > orangefs_bufmap_size_query())
    565			each_count = orangefs_bufmap_size_query();
    566
    567		gossip_debug(GOSSIP_FILE_DEBUG,
    568			     "%s(%pU): size of each_count(%d)\n",
    569			     __func__,
    570			     handle,
    571			     (int)each_count);
    572		gossip_debug(GOSSIP_FILE_DEBUG,
    573			     "%s(%pU): BEFORE wait_for_io: offset is %d\n",
    574			     __func__,
    575			     handle,
    576			     (int)*offset);
    577
    578		ret = wait_for_direct_io(type, inode, offset, iter,
    579				each_count, 0, NULL, NULL, file);
    580		gossip_debug(GOSSIP_FILE_DEBUG,
    581			     "%s(%pU): return from wait_for_io:%d\n",
    582			     __func__,
    583			     handle,
    584			     (int)ret);
    585
    586		if (ret < 0)
    587			goto out;
    588
    589		*offset += ret;
    590		total_count += ret;
    591		amt_complete = ret;
    592
    593		gossip_debug(GOSSIP_FILE_DEBUG,
    594			     "%s(%pU): AFTER wait_for_io: offset is %d\n",
    595			     __func__,
    596			     handle,
    597			     (int)*offset);
    598
    599		/*
    600		 * if we got a short I/O operations,
    601		 * fall out and return what we got so far
    602		 */
    603		if (amt_complete < each_count)
    604			break;
    605	} /*end while */
    606
    607out:
    608	if (total_count > 0)
    609		ret = total_count;
    610	if (ret > 0) {
    611		if (type == ORANGEFS_IO_READ) {
    612			file_accessed(file);
    613		} else {
    614			file_update_time(file);
    615			if (*offset > i_size_read(inode))
    616				i_size_write(inode, *offset);
    617		}
    618	}
    619
    620	gossip_debug(GOSSIP_FILE_DEBUG,
    621		     "%s(%pU): Value(%d) returned.\n",
    622		     __func__,
    623		     handle,
    624		     (int)ret);
    625
    626	return ret;
    627}
    628
    629/** ORANGEFS2 implementation of address space operations */
    630static const struct address_space_operations orangefs_address_operations = {
    631	.writepage = orangefs_writepage,
    632	.readahead = orangefs_readahead,
    633	.read_folio = orangefs_read_folio,
    634	.writepages = orangefs_writepages,
    635	.dirty_folio = filemap_dirty_folio,
    636	.write_begin = orangefs_write_begin,
    637	.write_end = orangefs_write_end,
    638	.invalidate_folio = orangefs_invalidate_folio,
    639	.release_folio = orangefs_release_folio,
    640	.free_folio = orangefs_free_folio,
    641	.launder_folio = orangefs_launder_folio,
    642	.direct_IO = orangefs_direct_IO,
    643};
    644
    645vm_fault_t orangefs_page_mkwrite(struct vm_fault *vmf)
    646{
    647	struct folio *folio = page_folio(vmf->page);
    648	struct inode *inode = file_inode(vmf->vma->vm_file);
    649	struct orangefs_inode_s *orangefs_inode = ORANGEFS_I(inode);
    650	unsigned long *bitlock = &orangefs_inode->bitlock;
    651	vm_fault_t ret;
    652	struct orangefs_write_range *wr;
    653
    654	sb_start_pagefault(inode->i_sb);
    655
    656	if (wait_on_bit(bitlock, 1, TASK_KILLABLE)) {
    657		ret = VM_FAULT_RETRY;
    658		goto out;
    659	}
    660
    661	folio_lock(folio);
    662	if (folio_test_dirty(folio) && !folio_test_private(folio)) {
    663		/*
    664		 * Should be impossible.  If it happens, launder the folio
    665		 * since we don't know what's dirty.  This will WARN in
    666		 * orangefs_writepage_locked.
    667		 */
    668		if (orangefs_launder_folio(folio)) {
    669			ret = VM_FAULT_LOCKED|VM_FAULT_RETRY;
    670			goto out;
    671		}
    672	}
    673	if (folio_test_private(folio)) {
    674		wr = folio_get_private(folio);
    675		if (uid_eq(wr->uid, current_fsuid()) &&
    676		    gid_eq(wr->gid, current_fsgid())) {
    677			wr->pos = page_offset(vmf->page);
    678			wr->len = PAGE_SIZE;
    679			goto okay;
    680		} else {
    681			if (orangefs_launder_folio(folio)) {
    682				ret = VM_FAULT_LOCKED|VM_FAULT_RETRY;
    683				goto out;
    684			}
    685		}
    686	}
    687	wr = kmalloc(sizeof *wr, GFP_KERNEL);
    688	if (!wr) {
    689		ret = VM_FAULT_LOCKED|VM_FAULT_RETRY;
    690		goto out;
    691	}
    692	wr->pos = page_offset(vmf->page);
    693	wr->len = PAGE_SIZE;
    694	wr->uid = current_fsuid();
    695	wr->gid = current_fsgid();
    696	folio_attach_private(folio, wr);
    697okay:
    698
    699	file_update_time(vmf->vma->vm_file);
    700	if (folio->mapping != inode->i_mapping) {
    701		folio_unlock(folio);
    702		ret = VM_FAULT_LOCKED|VM_FAULT_NOPAGE;
    703		goto out;
    704	}
    705
    706	/*
    707	 * We mark the folio dirty already here so that when freeze is in
    708	 * progress, we are guaranteed that writeback during freezing will
    709	 * see the dirty folio and writeprotect it again.
    710	 */
    711	folio_mark_dirty(folio);
    712	folio_wait_stable(folio);
    713	ret = VM_FAULT_LOCKED;
    714out:
    715	sb_end_pagefault(inode->i_sb);
    716	return ret;
    717}
    718
    719static int orangefs_setattr_size(struct inode *inode, struct iattr *iattr)
    720{
    721	struct orangefs_inode_s *orangefs_inode = ORANGEFS_I(inode);
    722	struct orangefs_kernel_op_s *new_op;
    723	loff_t orig_size;
    724	int ret = -EINVAL;
    725
    726	gossip_debug(GOSSIP_INODE_DEBUG,
    727		     "%s: %pU: Handle is %pU | fs_id %d | size is %llu\n",
    728		     __func__,
    729		     get_khandle_from_ino(inode),
    730		     &orangefs_inode->refn.khandle,
    731		     orangefs_inode->refn.fs_id,
    732		     iattr->ia_size);
    733
    734	/* Ensure that we have a up to date size, so we know if it changed. */
    735	ret = orangefs_inode_getattr(inode, ORANGEFS_GETATTR_SIZE);
    736	if (ret == -ESTALE)
    737		ret = -EIO;
    738	if (ret) {
    739		gossip_err("%s: orangefs_inode_getattr failed, ret:%d:.\n",
    740		    __func__, ret);
    741		return ret;
    742	}
    743	orig_size = i_size_read(inode);
    744
    745	/* This is truncate_setsize in a different order. */
    746	truncate_pagecache(inode, iattr->ia_size);
    747	i_size_write(inode, iattr->ia_size);
    748	if (iattr->ia_size > orig_size)
    749		pagecache_isize_extended(inode, orig_size, iattr->ia_size);
    750
    751	new_op = op_alloc(ORANGEFS_VFS_OP_TRUNCATE);
    752	if (!new_op)
    753		return -ENOMEM;
    754
    755	new_op->upcall.req.truncate.refn = orangefs_inode->refn;
    756	new_op->upcall.req.truncate.size = (__s64) iattr->ia_size;
    757
    758	ret = service_operation(new_op,
    759		__func__,
    760		get_interruptible_flag(inode));
    761
    762	/*
    763	 * the truncate has no downcall members to retrieve, but
    764	 * the status value tells us if it went through ok or not
    765	 */
    766	gossip_debug(GOSSIP_INODE_DEBUG, "%s: ret:%d:\n", __func__, ret);
    767
    768	op_release(new_op);
    769
    770	if (ret != 0)
    771		return ret;
    772
    773	if (orig_size != i_size_read(inode))
    774		iattr->ia_valid |= ATTR_CTIME | ATTR_MTIME;
    775
    776	return ret;
    777}
    778
    779int __orangefs_setattr(struct inode *inode, struct iattr *iattr)
    780{
    781	int ret;
    782
    783	if (iattr->ia_valid & ATTR_MODE) {
    784		if (iattr->ia_mode & (S_ISVTX)) {
    785			if (is_root_handle(inode)) {
    786				/*
    787				 * allow sticky bit to be set on root (since
    788				 * it shows up that way by default anyhow),
    789				 * but don't show it to the server
    790				 */
    791				iattr->ia_mode -= S_ISVTX;
    792			} else {
    793				gossip_debug(GOSSIP_UTILS_DEBUG,
    794					     "User attempted to set sticky bit on non-root directory; returning EINVAL.\n");
    795				ret = -EINVAL;
    796				goto out;
    797			}
    798		}
    799		if (iattr->ia_mode & (S_ISUID)) {
    800			gossip_debug(GOSSIP_UTILS_DEBUG,
    801				     "Attempting to set setuid bit (not supported); returning EINVAL.\n");
    802			ret = -EINVAL;
    803			goto out;
    804		}
    805	}
    806
    807	if (iattr->ia_valid & ATTR_SIZE) {
    808		ret = orangefs_setattr_size(inode, iattr);
    809		if (ret)
    810			goto out;
    811	}
    812
    813again:
    814	spin_lock(&inode->i_lock);
    815	if (ORANGEFS_I(inode)->attr_valid) {
    816		if (uid_eq(ORANGEFS_I(inode)->attr_uid, current_fsuid()) &&
    817		    gid_eq(ORANGEFS_I(inode)->attr_gid, current_fsgid())) {
    818			ORANGEFS_I(inode)->attr_valid = iattr->ia_valid;
    819		} else {
    820			spin_unlock(&inode->i_lock);
    821			write_inode_now(inode, 1);
    822			goto again;
    823		}
    824	} else {
    825		ORANGEFS_I(inode)->attr_valid = iattr->ia_valid;
    826		ORANGEFS_I(inode)->attr_uid = current_fsuid();
    827		ORANGEFS_I(inode)->attr_gid = current_fsgid();
    828	}
    829	setattr_copy(&init_user_ns, inode, iattr);
    830	spin_unlock(&inode->i_lock);
    831	mark_inode_dirty(inode);
    832
    833	if (iattr->ia_valid & ATTR_MODE)
    834		/* change mod on a file that has ACLs */
    835		ret = posix_acl_chmod(&init_user_ns, inode, inode->i_mode);
    836
    837	ret = 0;
    838out:
    839	return ret;
    840}
    841
    842/*
    843 * Change attributes of an object referenced by dentry.
    844 */
    845int orangefs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
    846		     struct iattr *iattr)
    847{
    848	int ret;
    849	gossip_debug(GOSSIP_INODE_DEBUG, "__orangefs_setattr: called on %pd\n",
    850	    dentry);
    851	ret = setattr_prepare(&init_user_ns, dentry, iattr);
    852	if (ret)
    853	        goto out;
    854	ret = __orangefs_setattr(d_inode(dentry), iattr);
    855	sync_inode_metadata(d_inode(dentry), 1);
    856out:
    857	gossip_debug(GOSSIP_INODE_DEBUG, "orangefs_setattr: returning %d\n",
    858	    ret);
    859	return ret;
    860}
    861
    862/*
    863 * Obtain attributes of an object given a dentry
    864 */
    865int orangefs_getattr(struct user_namespace *mnt_userns, const struct path *path,
    866		     struct kstat *stat, u32 request_mask, unsigned int flags)
    867{
    868	int ret;
    869	struct inode *inode = path->dentry->d_inode;
    870
    871	gossip_debug(GOSSIP_INODE_DEBUG,
    872		     "orangefs_getattr: called on %pd mask %u\n",
    873		     path->dentry, request_mask);
    874
    875	ret = orangefs_inode_getattr(inode,
    876	    request_mask & STATX_SIZE ? ORANGEFS_GETATTR_SIZE : 0);
    877	if (ret == 0) {
    878		generic_fillattr(&init_user_ns, inode, stat);
    879
    880		/* override block size reported to stat */
    881		if (!(request_mask & STATX_SIZE))
    882			stat->result_mask &= ~STATX_SIZE;
    883
    884		generic_fill_statx_attr(inode, stat);
    885	}
    886	return ret;
    887}
    888
    889int orangefs_permission(struct user_namespace *mnt_userns,
    890			struct inode *inode, int mask)
    891{
    892	int ret;
    893
    894	if (mask & MAY_NOT_BLOCK)
    895		return -ECHILD;
    896
    897	gossip_debug(GOSSIP_INODE_DEBUG, "%s: refreshing\n", __func__);
    898
    899	/* Make sure the permission (and other common attrs) are up to date. */
    900	ret = orangefs_inode_getattr(inode, 0);
    901	if (ret < 0)
    902		return ret;
    903
    904	return generic_permission(&init_user_ns, inode, mask);
    905}
    906
    907int orangefs_update_time(struct inode *inode, struct timespec64 *time, int flags)
    908{
    909	struct iattr iattr;
    910	gossip_debug(GOSSIP_INODE_DEBUG, "orangefs_update_time: %pU\n",
    911	    get_khandle_from_ino(inode));
    912	generic_update_time(inode, time, flags);
    913	memset(&iattr, 0, sizeof iattr);
    914        if (flags & S_ATIME)
    915		iattr.ia_valid |= ATTR_ATIME;
    916	if (flags & S_CTIME)
    917		iattr.ia_valid |= ATTR_CTIME;
    918	if (flags & S_MTIME)
    919		iattr.ia_valid |= ATTR_MTIME;
    920	return __orangefs_setattr(inode, &iattr);
    921}
    922
    923static int orangefs_fileattr_get(struct dentry *dentry, struct fileattr *fa)
    924{
    925	u64 val = 0;
    926	int ret;
    927
    928	gossip_debug(GOSSIP_FILE_DEBUG, "%s: called on %pd\n", __func__,
    929		     dentry);
    930
    931	ret = orangefs_inode_getxattr(d_inode(dentry),
    932				      "user.pvfs2.meta_hint",
    933				      &val, sizeof(val));
    934	if (ret < 0 && ret != -ENODATA)
    935		return ret;
    936
    937	gossip_debug(GOSSIP_FILE_DEBUG, "%s: flags=%u\n", __func__, (u32) val);
    938
    939	fileattr_fill_flags(fa, val);
    940	return 0;
    941}
    942
    943static int orangefs_fileattr_set(struct user_namespace *mnt_userns,
    944				 struct dentry *dentry, struct fileattr *fa)
    945{
    946	u64 val = 0;
    947
    948	gossip_debug(GOSSIP_FILE_DEBUG, "%s: called on %pd\n", __func__,
    949		     dentry);
    950	/*
    951	 * ORANGEFS_MIRROR_FL is set internally when the mirroring mode is
    952	 * turned on for a file. The user is not allowed to turn on this bit,
    953	 * but the bit is present if the user first gets the flags and then
    954	 * updates the flags with some new settings. So, we ignore it in the
    955	 * following edit. bligon.
    956	 */
    957	if (fileattr_has_fsx(fa) ||
    958	    (fa->flags & ~(FS_IMMUTABLE_FL | FS_APPEND_FL | FS_NOATIME_FL | ORANGEFS_MIRROR_FL))) {
    959		gossip_err("%s: only supports setting one of FS_IMMUTABLE_FL|FS_APPEND_FL|FS_NOATIME_FL\n",
    960			   __func__);
    961		return -EOPNOTSUPP;
    962	}
    963	val = fa->flags;
    964	gossip_debug(GOSSIP_FILE_DEBUG, "%s: flags=%u\n", __func__, (u32) val);
    965	return orangefs_inode_setxattr(d_inode(dentry),
    966				       "user.pvfs2.meta_hint",
    967				       &val, sizeof(val), 0);
    968}
    969
    970/* ORANGEFS2 implementation of VFS inode operations for files */
    971static const struct inode_operations orangefs_file_inode_operations = {
    972	.get_acl = orangefs_get_acl,
    973	.set_acl = orangefs_set_acl,
    974	.setattr = orangefs_setattr,
    975	.getattr = orangefs_getattr,
    976	.listxattr = orangefs_listxattr,
    977	.permission = orangefs_permission,
    978	.update_time = orangefs_update_time,
    979	.fileattr_get = orangefs_fileattr_get,
    980	.fileattr_set = orangefs_fileattr_set,
    981};
    982
    983static int orangefs_init_iops(struct inode *inode)
    984{
    985	inode->i_mapping->a_ops = &orangefs_address_operations;
    986
    987	switch (inode->i_mode & S_IFMT) {
    988	case S_IFREG:
    989		inode->i_op = &orangefs_file_inode_operations;
    990		inode->i_fop = &orangefs_file_operations;
    991		break;
    992	case S_IFLNK:
    993		inode->i_op = &orangefs_symlink_inode_operations;
    994		break;
    995	case S_IFDIR:
    996		inode->i_op = &orangefs_dir_inode_operations;
    997		inode->i_fop = &orangefs_dir_operations;
    998		break;
    999	default:
   1000		gossip_debug(GOSSIP_INODE_DEBUG,
   1001			     "%s: unsupported mode\n",
   1002			     __func__);
   1003		return -EINVAL;
   1004	}
   1005
   1006	return 0;
   1007}
   1008
   1009/*
   1010 * Given an ORANGEFS object identifier (fsid, handle), convert it into
   1011 * a ino_t type that will be used as a hash-index from where the handle will
   1012 * be searched for in the VFS hash table of inodes.
   1013 */
   1014static inline ino_t orangefs_handle_hash(struct orangefs_object_kref *ref)
   1015{
   1016	if (!ref)
   1017		return 0;
   1018	return orangefs_khandle_to_ino(&(ref->khandle));
   1019}
   1020
   1021/*
   1022 * Called to set up an inode from iget5_locked.
   1023 */
   1024static int orangefs_set_inode(struct inode *inode, void *data)
   1025{
   1026	struct orangefs_object_kref *ref = (struct orangefs_object_kref *) data;
   1027	ORANGEFS_I(inode)->refn.fs_id = ref->fs_id;
   1028	ORANGEFS_I(inode)->refn.khandle = ref->khandle;
   1029	ORANGEFS_I(inode)->attr_valid = 0;
   1030	hash_init(ORANGEFS_I(inode)->xattr_cache);
   1031	ORANGEFS_I(inode)->mapping_time = jiffies - 1;
   1032	ORANGEFS_I(inode)->bitlock = 0;
   1033	return 0;
   1034}
   1035
   1036/*
   1037 * Called to determine if handles match.
   1038 */
   1039static int orangefs_test_inode(struct inode *inode, void *data)
   1040{
   1041	struct orangefs_object_kref *ref = (struct orangefs_object_kref *) data;
   1042	struct orangefs_inode_s *orangefs_inode = NULL;
   1043
   1044	orangefs_inode = ORANGEFS_I(inode);
   1045	/* test handles and fs_ids... */
   1046	return (!ORANGEFS_khandle_cmp(&(orangefs_inode->refn.khandle),
   1047				&(ref->khandle)) &&
   1048			orangefs_inode->refn.fs_id == ref->fs_id);
   1049}
   1050
   1051/*
   1052 * Front-end to lookup the inode-cache maintained by the VFS using the ORANGEFS
   1053 * file handle.
   1054 *
   1055 * @sb: the file system super block instance.
   1056 * @ref: The ORANGEFS object for which we are trying to locate an inode.
   1057 */
   1058struct inode *orangefs_iget(struct super_block *sb,
   1059		struct orangefs_object_kref *ref)
   1060{
   1061	struct inode *inode = NULL;
   1062	unsigned long hash;
   1063	int error;
   1064
   1065	hash = orangefs_handle_hash(ref);
   1066	inode = iget5_locked(sb,
   1067			hash,
   1068			orangefs_test_inode,
   1069			orangefs_set_inode,
   1070			ref);
   1071
   1072	if (!inode)
   1073		return ERR_PTR(-ENOMEM);
   1074
   1075	if (!(inode->i_state & I_NEW))
   1076		return inode;
   1077
   1078	error = orangefs_inode_getattr(inode, ORANGEFS_GETATTR_NEW);
   1079	if (error) {
   1080		iget_failed(inode);
   1081		return ERR_PTR(error);
   1082	}
   1083
   1084	inode->i_ino = hash;	/* needed for stat etc */
   1085	orangefs_init_iops(inode);
   1086	unlock_new_inode(inode);
   1087
   1088	gossip_debug(GOSSIP_INODE_DEBUG,
   1089		     "iget handle %pU, fsid %d hash %ld i_ino %lu\n",
   1090		     &ref->khandle,
   1091		     ref->fs_id,
   1092		     hash,
   1093		     inode->i_ino);
   1094
   1095	return inode;
   1096}
   1097
   1098/*
   1099 * Allocate an inode for a newly created file and insert it into the inode hash.
   1100 */
   1101struct inode *orangefs_new_inode(struct super_block *sb, struct inode *dir,
   1102		int mode, dev_t dev, struct orangefs_object_kref *ref)
   1103{
   1104	unsigned long hash = orangefs_handle_hash(ref);
   1105	struct inode *inode;
   1106	int error;
   1107
   1108	gossip_debug(GOSSIP_INODE_DEBUG,
   1109		     "%s:(sb is %p | MAJOR(dev)=%u | MINOR(dev)=%u mode=%o)\n",
   1110		     __func__,
   1111		     sb,
   1112		     MAJOR(dev),
   1113		     MINOR(dev),
   1114		     mode);
   1115
   1116	inode = new_inode(sb);
   1117	if (!inode)
   1118		return ERR_PTR(-ENOMEM);
   1119
   1120	orangefs_set_inode(inode, ref);
   1121	inode->i_ino = hash;	/* needed for stat etc */
   1122
   1123	error = orangefs_inode_getattr(inode, ORANGEFS_GETATTR_NEW);
   1124	if (error)
   1125		goto out_iput;
   1126
   1127	orangefs_init_iops(inode);
   1128	inode->i_rdev = dev;
   1129
   1130	error = insert_inode_locked4(inode, hash, orangefs_test_inode, ref);
   1131	if (error < 0)
   1132		goto out_iput;
   1133
   1134	gossip_debug(GOSSIP_INODE_DEBUG,
   1135		     "Initializing ACL's for inode %pU\n",
   1136		     get_khandle_from_ino(inode));
   1137	orangefs_init_acl(inode, dir);
   1138	return inode;
   1139
   1140out_iput:
   1141	iput(inode);
   1142	return ERR_PTR(error);
   1143}