diff options
| author | Miquel Raynal <miquel.raynal@bootlin.com> | 2022-05-20 13:58:54 +0200 | 
|---|---|---|
| committer | Miquel Raynal <miquel.raynal@bootlin.com> | 2022-05-20 13:58:54 +0200 | 
| commit | e6828be5edcfea25cd70a2d1de41085c67ef9fa5 (patch) | |
| tree | 489ae4cdb47a4d83940e2472f49a3c601806b70e /fs/nfsd/filecache.c | |
| parent | 1fefc8ecb834c88edfc27e712d683872d0c541dd (diff) | |
| parent | c47452194641b5d27c20e557c84a46c85fd7ce37 (diff) | |
Merge tag 'spi-nor/for-5.19' into mtd/next
SPI NOR core changes:
- Read back written SR value to make sure the write was done correctly.
- Introduce a common function for Read ID that manufacturer drivers can
  use to verify the Octal DTR switch worked correctly.
- Add helpers for read/write any register commands so manufacturer
  drivers don't open code it every time.
- Clarify rdsr dummy cycles documentation.
- Add debugfs entry to expose internal flash parameters and state.
SPI NOR manufacturer drivers changes:
- Add support for Winbond W25Q512NW-IM, and Eon EN25QH256A.
- Move spi_nor_write_ear() to Winbond module since only Winbond flashes
  use it.
- Rework Micron and Cypress Octal DTR enable methods to improve
  readability.
- Use the common Read ID function to verify switch to Octal DTR mode for
  Micron and Cypress flashes.
- Skip polling status on volatile register writes for Micron and Cypress
  flashes since the operation is instant.
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Diffstat (limited to 'fs/nfsd/filecache.c')
| -rw-r--r-- | fs/nfsd/filecache.c | 25 | 
1 files changed, 15 insertions, 10 deletions
diff --git a/fs/nfsd/filecache.c b/fs/nfsd/filecache.c index c08882f5867b..2c1b027774d4 100644 --- a/fs/nfsd/filecache.c +++ b/fs/nfsd/filecache.c @@ -237,6 +237,13 @@ nfsd_file_check_write_error(struct nfsd_file *nf)  }  static void +nfsd_file_flush(struct nfsd_file *nf) +{ +	if (nf->nf_file && vfs_fsync(nf->nf_file, 1) != 0) +		nfsd_reset_write_verifier(net_generic(nf->nf_net, nfsd_net_id)); +} + +static void  nfsd_file_do_unhash(struct nfsd_file *nf)  {  	lockdep_assert_held(&nfsd_file_hashtbl[nf->nf_hashval].nfb_lock); @@ -295,19 +302,15 @@ nfsd_file_put_noref(struct nfsd_file *nf)  void  nfsd_file_put(struct nfsd_file *nf)  { -	bool is_hashed; -  	set_bit(NFSD_FILE_REFERENCED, &nf->nf_flags); -	if (refcount_read(&nf->nf_ref) > 2 || !nf->nf_file) { +	if (test_bit(NFSD_FILE_HASHED, &nf->nf_flags) == 0) { +		nfsd_file_flush(nf);  		nfsd_file_put_noref(nf); -		return; +	} else { +		nfsd_file_put_noref(nf); +		if (nf->nf_file) +			nfsd_file_schedule_laundrette();  	} - -	filemap_flush(nf->nf_file->f_mapping); -	is_hashed = test_bit(NFSD_FILE_HASHED, &nf->nf_flags) != 0; -	nfsd_file_put_noref(nf); -	if (is_hashed) -		nfsd_file_schedule_laundrette();  	if (atomic_long_read(&nfsd_filecache_count) >= NFSD_FILE_LRU_LIMIT)  		nfsd_file_gc();  } @@ -328,6 +331,7 @@ nfsd_file_dispose_list(struct list_head *dispose)  	while(!list_empty(dispose)) {  		nf = list_first_entry(dispose, struct nfsd_file, nf_lru);  		list_del(&nf->nf_lru); +		nfsd_file_flush(nf);  		nfsd_file_put_noref(nf);  	}  } @@ -341,6 +345,7 @@ nfsd_file_dispose_list_sync(struct list_head *dispose)  	while(!list_empty(dispose)) {  		nf = list_first_entry(dispose, struct nfsd_file, nf_lru);  		list_del(&nf->nf_lru); +		nfsd_file_flush(nf);  		if (!refcount_dec_and_test(&nf->nf_ref))  			continue;  		if (nfsd_file_free(nf))  | 
