David Howells
2022-04-06 19:41:28 +01:00
committed by Steve French
parent 39bc58203f
commit b8713c4dbf
2 changed files with 96 additions and 0 deletions

View File

@@ -113,6 +113,9 @@ extern int cifs_file_strict_mmap(struct file *file, struct vm_area_struct *vma);
extern const struct file_operations cifs_dir_ops;
extern int cifs_dir_open(struct inode *inode, struct file *file);
extern int cifs_readdir(struct file *file, struct dir_context *ctx);
extern void cifs_pages_written_back(struct inode *inode, loff_t start, unsigned int len);
extern void cifs_pages_write_failed(struct inode *inode, loff_t start, unsigned int len);
extern void cifs_pages_write_redirty(struct inode *inode, loff_t start, unsigned int len);
/* Functions related to dir entries */
extern const struct dentry_operations cifs_dentry_ops;

View File

@@ -36,6 +36,99 @@
#include "cifs_ioctl.h"
#include "cached_dir.h"
/*
* Completion of write to server.
*/
void cifs_pages_written_back(struct inode *inode, loff_t start, unsigned int len)
{
struct address_space *mapping = inode->i_mapping;
struct folio *folio;
pgoff_t end;
XA_STATE(xas, &mapping->i_pages, start / PAGE_SIZE);
if (!len)
return;
rcu_read_lock();
end = (start + len - 1) / PAGE_SIZE;
xas_for_each(&xas, folio, end) {
if (!folio_test_writeback(folio)) {
WARN_ONCE(1, "bad %x @%llx page %lx %lx\n",
len, start, folio_index(folio), end);
continue;
}
folio_detach_private(folio);
folio_end_writeback(folio);
}
rcu_read_unlock();
}
/*
* Failure of write to server.
*/
void cifs_pages_write_failed(struct inode *inode, loff_t start, unsigned int len)
{
struct address_space *mapping = inode->i_mapping;
struct folio *folio;
pgoff_t end;
XA_STATE(xas, &mapping->i_pages, start / PAGE_SIZE);
if (!len)
return;
rcu_read_lock();
end = (start + len - 1) / PAGE_SIZE;
xas_for_each(&xas, folio, end) {
if (!folio_test_writeback(folio)) {
WARN_ONCE(1, "bad %x @%llx page %lx %lx\n",
len, start, folio_index(folio), end);
continue;
}
folio_set_error(folio);
folio_end_writeback(folio);
}
rcu_read_unlock();
}
/*
* Redirty pages after a temporary failure.
*/
void cifs_pages_write_redirty(struct inode *inode, loff_t start, unsigned int len)
{
struct address_space *mapping = inode->i_mapping;
struct folio *folio;
pgoff_t end;
XA_STATE(xas, &mapping->i_pages, start / PAGE_SIZE);
if (!len)
return;
rcu_read_lock();
end = (start + len - 1) / PAGE_SIZE;
xas_for_each(&xas, folio, end) {
if (!folio_test_writeback(folio)) {
WARN_ONCE(1, "bad %x @%llx page %lx %lx\n",
len, start, folio_index(folio), end);
continue;
}
filemap_dirty_folio(folio->mapping, folio);
folio_end_writeback(folio);
}
rcu_read_unlock();
}
/*
* Mark as invalid, all open files on tree connections since they
* were closed when session to server was lost.