diff options
Diffstat (limited to 'fs/cifs/file.c')
| -rw-r--r-- | fs/cifs/file.c | 19 | 
1 files changed, 12 insertions, 7 deletions
| diff --git a/fs/cifs/file.c b/fs/cifs/file.c index bc9516ab4b34..3b942ecdd4be 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c @@ -1958,7 +1958,7 @@ struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *cifs_inode,  /* Return -EBADF if no handle is found and general rc otherwise */  int -cifs_get_writable_file(struct cifsInodeInfo *cifs_inode, bool fsuid_only, +cifs_get_writable_file(struct cifsInodeInfo *cifs_inode, int flags,  		       struct cifsFileInfo **ret_file)  {  	struct cifsFileInfo *open_file, *inv_file = NULL; @@ -1966,7 +1966,8 @@ cifs_get_writable_file(struct cifsInodeInfo *cifs_inode, bool fsuid_only,  	bool any_available = false;  	int rc = -EBADF;  	unsigned int refind = 0; - +	bool fsuid_only = flags & FIND_WR_FSUID_ONLY; +	bool with_delete = flags & FIND_WR_WITH_DELETE;  	*ret_file = NULL;  	/* @@ -1998,6 +1999,8 @@ refind_writable:  			continue;  		if (fsuid_only && !uid_eq(open_file->uid, current_fsuid()))  			continue; +		if (with_delete && !(open_file->fid.access & DELETE)) +			continue;  		if (OPEN_FMODE(open_file->f_flags) & FMODE_WRITE) {  			if (!open_file->invalidHandle) {  				/* found a good writable file */ @@ -2045,12 +2048,12 @@ refind_writable:  }  struct cifsFileInfo * -find_writable_file(struct cifsInodeInfo *cifs_inode, bool fsuid_only) +find_writable_file(struct cifsInodeInfo *cifs_inode, int flags)  {  	struct cifsFileInfo *cfile;  	int rc; -	rc = cifs_get_writable_file(cifs_inode, fsuid_only, &cfile); +	rc = cifs_get_writable_file(cifs_inode, flags, &cfile);  	if (rc)  		cifs_dbg(FYI, "couldn't find writable handle rc=%d", rc); @@ -2059,6 +2062,7 @@ find_writable_file(struct cifsInodeInfo *cifs_inode, bool fsuid_only)  int  cifs_get_writable_path(struct cifs_tcon *tcon, const char *name, +		       int flags,  		       struct cifsFileInfo **ret_file)  {  	struct list_head *tmp; @@ -2085,7 +2089,7 @@ cifs_get_writable_path(struct cifs_tcon *tcon, const char *name,  		kfree(full_path);  		cinode = CIFS_I(d_inode(cfile->dentry));  		spin_unlock(&tcon->open_file_lock); -		return cifs_get_writable_file(cinode, 0, ret_file); +		return cifs_get_writable_file(cinode, flags, ret_file);  	}  	spin_unlock(&tcon->open_file_lock); @@ -2162,7 +2166,8 @@ static int cifs_partialpagewrite(struct page *page, unsigned from, unsigned to)  	if (mapping->host->i_size - offset < (loff_t)to)  		to = (unsigned)(mapping->host->i_size - offset); -	rc = cifs_get_writable_file(CIFS_I(mapping->host), false, &open_file); +	rc = cifs_get_writable_file(CIFS_I(mapping->host), FIND_WR_ANY, +				    &open_file);  	if (!rc) {  		bytes_written = cifs_write(open_file, open_file->pid,  					   write_data, to - from, &offset); @@ -2355,7 +2360,7 @@ retry:  		if (cfile)  			cifsFileInfo_put(cfile); -		rc = cifs_get_writable_file(CIFS_I(inode), false, &cfile); +		rc = cifs_get_writable_file(CIFS_I(inode), FIND_WR_ANY, &cfile);  		/* in case of an error store it to return later */  		if (rc) |