]> git.ipfire.org Git - people/ms/linux.git/blobdiff - fs/ksmbd/mgmt/tree_connect.c
Merge branch 'for-6.0/dax' into libnvdimm-fixes
[people/ms/linux.git] / fs / ksmbd / mgmt / tree_connect.c
index 0d28e723a28c7e4b874b0f1e990e4a102285833e..97ab7987df6ebfa8b004b924513f560bedaaae6a 100644 (file)
 #include "user_session.h"
 
 struct ksmbd_tree_conn_status
-ksmbd_tree_conn_connect(struct ksmbd_session *sess, char *share_name)
+ksmbd_tree_conn_connect(struct ksmbd_conn *conn, struct ksmbd_session *sess,
+                       char *share_name)
 {
-       struct ksmbd_tree_conn_status status = {-EINVAL, NULL};
+       struct ksmbd_tree_conn_status status = {-ENOENT, NULL};
        struct ksmbd_tree_connect_response *resp = NULL;
        struct ksmbd_share_config *sc;
        struct ksmbd_tree_connect *tree_conn = NULL;
@@ -41,7 +42,7 @@ ksmbd_tree_conn_connect(struct ksmbd_session *sess, char *share_name)
                goto out_error;
        }
 
-       peer_addr = KSMBD_TCP_PEER_SOCKADDR(sess->conn);
+       peer_addr = KSMBD_TCP_PEER_SOCKADDR(conn);
        resp = ksmbd_ipc_tree_connect_request(sess,
                                              sc,
                                              tree_conn,
@@ -56,6 +57,20 @@ ksmbd_tree_conn_connect(struct ksmbd_session *sess, char *share_name)
                goto out_error;
 
        tree_conn->flags = resp->connection_flags;
+       if (test_tree_conn_flag(tree_conn, KSMBD_TREE_CONN_FLAG_UPDATE)) {
+               struct ksmbd_share_config *new_sc;
+
+               ksmbd_share_config_del(sc);
+               new_sc = ksmbd_share_config_get(share_name);
+               if (!new_sc) {
+                       pr_err("Failed to update stale share config\n");
+                       status.ret = -ESTALE;
+                       goto out_error;
+               }
+               ksmbd_share_config_put(sc);
+               sc = new_sc;
+       }
+
        tree_conn->user = sess->user;
        tree_conn->share_conf = sc;
        status.tree_conn = tree_conn;