Commit e6eb1950 authored by Ronnie Sahlberg's avatar Ronnie Sahlberg Committed by Steve French
Browse files

cifs: pass a path to open_shroot and check if it is the root or not



Move the check for the directory path into the open_shroot() function
but still fail for any non-root directories.
This is preparation for later when we will start using the cache also
for other directories than the root.

Signed-off-by: default avatarRonnie Sahlberg <lsahlber@redhat.com>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent 4df3d976
Loading
Loading
Loading
Loading
+10 −12
Original line number Diff line number Diff line
@@ -524,8 +524,7 @@ smb2_query_path_info(const unsigned int xid, struct cifs_tcon *tcon,
		return -ENOMEM;

	/* If it is a root and its handle is cached then use it */
	if (!strlen(full_path)) {
		rc = open_shroot(xid, tcon, cifs_sb, &cfid);
	rc = open_shroot(xid, tcon, full_path, cifs_sb, &cfid);
	if (!rc) {
		if (tcon->crfid.file_all_info_is_valid) {
			move_smb2_info_to_cifs(data,
@@ -540,7 +539,6 @@ smb2_query_path_info(const unsigned int xid, struct cifs_tcon *tcon,
		close_shroot(cfid);
		goto out;
	}
	}

	cifs_get_readable_path(tcon, full_path, &cfile);
	rc = smb2_compound_op(xid, tcon, cifs_sb, full_path,
+5 −1
Original line number Diff line number Diff line
@@ -728,6 +728,7 @@ smb2_cached_lease_break(struct work_struct *work)
 * Open the directory at the root of a share
 */
int open_shroot(unsigned int xid, struct cifs_tcon *tcon,
		const char *path,
		struct cifs_sb_info *cifs_sb,
		struct cached_fid **cfid)
{
@@ -749,6 +750,9 @@ int open_shroot(unsigned int xid, struct cifs_tcon *tcon,
	if (tcon->nohandlecache)
		return -ENOTSUPP;

	if (strlen(path))
		return -ENOTSUPP;

	mutex_lock(&tcon->crfid.fid_mutex);
	if (tcon->crfid.is_valid) {
		cifs_dbg(FYI, "found a cached root file handle\n");
@@ -926,7 +930,7 @@ smb3_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon,
	oparms.fid = &fid;
	oparms.reconnect = false;

	rc = open_shroot(xid, tcon, cifs_sb, &cfid);
	rc = open_shroot(xid, tcon, "", cifs_sb, &cfid);
	if (rc == 0)
		memcpy(&fid, cfid->fid, sizeof(struct cifs_fid));
	else
+1 −0
Original line number Diff line number Diff line
@@ -70,6 +70,7 @@ extern int smb3_handle_read_data(struct TCP_Server_Info *server,
				 struct mid_q_entry *mid);

extern int open_shroot(unsigned int xid, struct cifs_tcon *tcon,
		       const char *path,
		       struct cifs_sb_info *cifs_sb,
		       struct cached_fid **cfid);
extern void close_shroot(struct cached_fid *cfid);