diff mbox series

[2/9] cifs: pass a path to open_shroot and check if it is the root or not

Message ID 20210308230735.337-3-lsahlber@redhat.com
State New
Headers show
Series [1/9] cifs: move the check for nohandlecache into open_shroot | expand

Commit Message

Ronnie Sahlberg March 8, 2021, 11:07 p.m. UTC
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: Ronnie Sahlberg <lsahlber@redhat.com>
---
 fs/cifs/smb2inode.c | 22 ++++++++++------------
 fs/cifs/smb2ops.c   |  6 +++++-
 fs/cifs/smb2proto.h |  1 +
 3 files changed, 16 insertions(+), 13 deletions(-)

Comments

Steve French April 10, 2021, 12:08 a.m. UTC | #1
Similar checkpatch complaint about ENOTSUPP (instead of EOPNOTSUPP)

WARNING: ENOTSUPP is not a SUSV4 error code, prefer EOPNOTSUPP
#74: FILE: fs/cifs/smb2ops.c:754:
+ return -ENOTSUPP;

the header which defines ENOTSUPP notes:

/*
 * These should never be seen by user programs.  To return one of ERESTART*
 * codes, signal_pending() MUST be set.  Note that ptrace can observe these
 * at syscall exit tracing, but they will never be left for the debugged user
 * process to see.
 */

On Mon, Mar 8, 2021 at 5:07 PM Ronnie Sahlberg <lsahlber@redhat.com> wrote:
>
> 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: Ronnie Sahlberg <lsahlber@redhat.com>
> ---
>  fs/cifs/smb2inode.c | 22 ++++++++++------------
>  fs/cifs/smb2ops.c   |  6 +++++-
>  fs/cifs/smb2proto.h |  1 +
>  3 files changed, 16 insertions(+), 13 deletions(-)
>
> diff --git a/fs/cifs/smb2inode.c b/fs/cifs/smb2inode.c
> index 3d59614cbe8f..67f80c9561fc 100644
> --- a/fs/cifs/smb2inode.c
> +++ b/fs/cifs/smb2inode.c
> @@ -523,22 +523,20 @@ 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);
> -               if (!rc) {
> -                       if (tcon->crfid.file_all_info_is_valid) {
> -                               move_smb2_info_to_cifs(data,
> +       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,
>                                                &tcon->crfid.file_all_info);
> -                       } else {
> -                               rc = SMB2_query_info(xid, tcon,
> +               } else {
> +                       rc = SMB2_query_info(xid, tcon,
>                                              cfid->fid->persistent_fid,
>                                              cfid->fid->volatile_fid, smb2_data);
> -                               if (!rc)
> -                                       move_smb2_info_to_cifs(data, smb2_data);
> -                       }
> -                       close_shroot(cfid);
> -                       goto out;
> +                       if (!rc)
> +                               move_smb2_info_to_cifs(data, smb2_data);
>                 }
> +               close_shroot(cfid);
> +               goto out;
>         }
>
>         cifs_get_readable_path(tcon, full_path, &cfile);
> diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
> index 7ee6926153b8..96ff946674e6 100644
> --- a/fs/cifs/smb2ops.c
> +++ b/fs/cifs/smb2ops.c
> @@ -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
> diff --git a/fs/cifs/smb2proto.h b/fs/cifs/smb2proto.h
> index 9565e27681a5..7e4fc69c8b01 100644
> --- a/fs/cifs/smb2proto.h
> +++ b/fs/cifs/smb2proto.h
> @@ -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);
> --
> 2.13.6
>
diff mbox series

Patch

diff --git a/fs/cifs/smb2inode.c b/fs/cifs/smb2inode.c
index 3d59614cbe8f..67f80c9561fc 100644
--- a/fs/cifs/smb2inode.c
+++ b/fs/cifs/smb2inode.c
@@ -523,22 +523,20 @@  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);
-		if (!rc) {
-			if (tcon->crfid.file_all_info_is_valid) {
-				move_smb2_info_to_cifs(data,
+	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,
 					       &tcon->crfid.file_all_info);
-			} else {
-				rc = SMB2_query_info(xid, tcon,
+		} else {
+			rc = SMB2_query_info(xid, tcon,
 					     cfid->fid->persistent_fid,
 					     cfid->fid->volatile_fid, smb2_data);
-				if (!rc)
-					move_smb2_info_to_cifs(data, smb2_data);
-			}
-			close_shroot(cfid);
-			goto out;
+			if (!rc)
+				move_smb2_info_to_cifs(data, smb2_data);
 		}
+		close_shroot(cfid);
+		goto out;
 	}
 
 	cifs_get_readable_path(tcon, full_path, &cfile);
diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
index 7ee6926153b8..96ff946674e6 100644
--- a/fs/cifs/smb2ops.c
+++ b/fs/cifs/smb2ops.c
@@ -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
diff --git a/fs/cifs/smb2proto.h b/fs/cifs/smb2proto.h
index 9565e27681a5..7e4fc69c8b01 100644
--- a/fs/cifs/smb2proto.h
+++ b/fs/cifs/smb2proto.h
@@ -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);