Commit b8713c4d authored by David Howells's avatar David Howells Committed by Steve French
Browse files

cifs: Add some helper functions

parent 39bc5820
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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;
+93 −0
Original line number Diff line number Diff line
@@ -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.