Commit eb4b756b authored by Jeff Layton's avatar Jeff Layton Committed by Steve French
Browse files

cifs: eliminate cifsInodeInfo->write_behind_rc (try #6)



write_behind_rc is redundant and just adds complexity to the code. What
we really want to do instead is to use mapping_set_error to reset the
flags on the mapping when we find a writeback error and can't report it
to userspace yet.

For cifs_flush and cifs_fsync, we shouldn't reset the flags since errors
returned there do get reported to userspace.

Signed-off-by: default avatarJeff Layton <jlayton@redhat.com>
Reviewed-by: default avatarSuresh Jayaraman <sjayaraman@suse.de>
Reviewed-by: default avatarDave Kleikamp <shaggy@linux.vnet.ibm.com>
Signed-off-by: default avatarSteve French <sfrench@us.ibm.com>
parent 6c0f6218
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -318,7 +318,6 @@ cifs_alloc_inode(struct super_block *sb)
		return NULL;
	cifs_inode->cifsAttrs = 0x20;	/* default */
	cifs_inode->time = 0;
	cifs_inode->write_behind_rc = 0;
	/* Until the file is open and we have gotten oplock
	info back from the server, can not assume caching of
	file data or metadata */
+0 −1
Original line number Diff line number Diff line
@@ -420,7 +420,6 @@ struct cifsInodeInfo {
	struct list_head lockList;
	/* BB add in lists for dirty pages i.e. write caching info for oplock */
	struct list_head openFileList;
	int write_behind_rc;
	__u32 cifsAttrs; /* e.g. DOS archive bit, sparse, compressed, system */
	unsigned long time;	/* jiffies of last update/check of inode */
	bool clientCanCacheRead:1;	/* read oplock */
+10 −27
Original line number Diff line number Diff line
@@ -131,8 +131,7 @@ static inline int cifs_open_inode_helper(struct inode *inode,
			/* BB no need to lock inode until after invalidate
			since namei code should already have it locked? */
			rc = filemap_write_and_wait(inode->i_mapping);
			if (rc != 0)
				pCifsInode->write_behind_rc = rc;
			mapping_set_error(inode->i_mapping, rc);
		}
		cFYI(1, "invalidating remote inode since open detected it "
			 "changed");
@@ -606,8 +605,7 @@ static int cifs_reopen_file(struct cifsFileInfo *pCifsFile, bool can_flush)

	if (can_flush) {
		rc = filemap_write_and_wait(inode->i_mapping);
		if (rc != 0)
			CIFS_I(inode)->write_behind_rc = rc;
		mapping_set_error(inode->i_mapping, rc);

		pCifsInode->clientCanCacheAll = false;
		pCifsInode->clientCanCacheRead = false;
@@ -1489,12 +1487,7 @@ static int cifs_writepages(struct address_space *mapping,
			if (rc || bytes_written < bytes_to_write) {
				cERROR(1, "Write2 ret %d, wrote %d",
					  rc, bytes_written);
				/* BB what if continued retry is
				   requested via mount flags? */
				if (rc == -ENOSPC)
					set_bit(AS_ENOSPC, &mapping->flags);
				else
					set_bit(AS_EIO, &mapping->flags);
				mapping_set_error(mapping, rc);
			} else {
				cifs_stats_bytes_written(tcon, bytes_written);
			}
@@ -1639,11 +1632,10 @@ int cifs_fsync(struct file *file, int datasync)

	rc = filemap_write_and_wait(inode->i_mapping);
	if (rc == 0) {
		rc = CIFS_I(inode)->write_behind_rc;
		CIFS_I(inode)->write_behind_rc = 0;
		struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);

		tcon = tlink_tcon(smbfile->tlink);
		if (!rc && tcon && smbfile &&
		   !(CIFS_SB(inode->i_sb)->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC))
		if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC))
			rc = CIFSSMBFlush(xid, tcon, smbfile->netfid);
	}

@@ -1688,14 +1680,8 @@ int cifs_flush(struct file *file, fl_owner_t id)
	struct inode *inode = file->f_path.dentry->d_inode;
	int rc = 0;

	if (file->f_mode & FMODE_WRITE) {
	if (file->f_mode & FMODE_WRITE)
		rc = filemap_write_and_wait(inode->i_mapping);
		/* reset wb rc if we were able to write out dirty pages */
		if (!rc) {
			rc = CIFS_I(inode)->write_behind_rc;
			CIFS_I(inode)->write_behind_rc = 0;
		}
	}

	cFYI(1, "Flush inode %p file %p rc %d", inode, file, rc);

@@ -2274,7 +2260,7 @@ void cifs_oplock_break(struct work_struct *work)
						  oplock_break);
	struct inode *inode = cfile->dentry->d_inode;
	struct cifsInodeInfo *cinode = CIFS_I(inode);
	int rc, waitrc = 0;
	int rc = 0;

	if (inode && S_ISREG(inode->i_mode)) {
		if (cinode->clientCanCacheRead)
@@ -2283,13 +2269,10 @@ void cifs_oplock_break(struct work_struct *work)
			break_lease(inode, O_WRONLY);
		rc = filemap_fdatawrite(inode->i_mapping);
		if (cinode->clientCanCacheRead == 0) {
			waitrc = filemap_fdatawait(inode->i_mapping);
			rc = filemap_fdatawait(inode->i_mapping);
			mapping_set_error(inode->i_mapping, rc);
			invalidate_remote_inode(inode);
		}
		if (!rc)
			rc = waitrc;
		if (rc)
			cinode->write_behind_rc = rc;
		cFYI(1, "Oplock flush inode %p rc %d", inode, rc);
	}

+5 −10
Original line number Diff line number Diff line
@@ -1682,8 +1682,7 @@ cifs_invalidate_mapping(struct inode *inode)
	/* write back any cached data */
	if (inode->i_mapping && inode->i_mapping->nrpages != 0) {
		rc = filemap_write_and_wait(inode->i_mapping);
		if (rc)
			cifs_i->write_behind_rc = rc;
		mapping_set_error(inode->i_mapping, rc);
	}
	invalidate_remote_inode(inode);
	cifs_fscache_reset_inode_cookie(inode);
@@ -1943,10 +1942,8 @@ cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs)
	 * the flush returns error?
	 */
	rc = filemap_write_and_wait(inode->i_mapping);
	if (rc != 0) {
		cifsInode->write_behind_rc = rc;
	mapping_set_error(inode->i_mapping, rc);
	rc = 0;
	}

	if (attrs->ia_valid & ATTR_SIZE) {
		rc = cifs_set_file_size(inode, attrs, xid, full_path);
@@ -2087,10 +2084,8 @@ cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs)
	 * the flush returns error?
	 */
	rc = filemap_write_and_wait(inode->i_mapping);
	if (rc != 0) {
		cifsInode->write_behind_rc = rc;
	mapping_set_error(inode->i_mapping, rc);
	rc = 0;
	}

	if (attrs->ia_valid & ATTR_SIZE) {
		rc = cifs_set_file_size(inode, attrs, xid, full_path);