xref: /linux/fs/smb/server/mgmt/share_config.h (revision 3a2c4d55e32ad65efebdb6de44eef3bfa08bb49d)
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  *   Copyright (C) 2018 Samsung Electronics Co., Ltd.
4  */
5 
6 #ifndef __SHARE_CONFIG_MANAGEMENT_H__
7 #define __SHARE_CONFIG_MANAGEMENT_H__
8 
9 #include <linux/workqueue.h>
10 #include <linux/hashtable.h>
11 #include <linux/path.h>
12 #include <linux/unicode.h>
13 
14 struct ksmbd_work;
15 
16 struct ksmbd_share_config {
17 	char			*name;
18 	char			*path;
19 
20 	unsigned int		path_sz;
21 	unsigned int		flags;
22 	struct list_head	veto_list;
23 
24 	struct path		vfs_path;
25 
26 	atomic_t		refcount;
27 #ifdef CONFIG_PROC_FS
28 	atomic_t		tree_connections;
29 #endif
30 	struct hlist_node	hlist;
31 	unsigned short		create_mask;
32 	unsigned short		directory_mask;
33 	unsigned short		force_create_mode;
34 	unsigned short		force_directory_mode;
35 	unsigned short		force_uid;
36 	unsigned short		force_gid;
37 };
38 
39 #define KSMBD_SHARE_INVALID_UID	((__u16)-1)
40 #define KSMBD_SHARE_INVALID_GID	((__u16)-1)
41 
42 static inline umode_t
43 share_config_create_mode(struct ksmbd_share_config *share,
44 			 umode_t posix_mode)
45 {
46 	umode_t mode = (posix_mode ?: (umode_t)-1) & share->create_mask;
47 
48 	return mode | share->force_create_mode;
49 }
50 
51 static inline umode_t
52 share_config_directory_mode(struct ksmbd_share_config *share,
53 			    umode_t posix_mode)
54 {
55 	umode_t mode = (posix_mode ?: (umode_t)-1) & share->directory_mask;
56 
57 	return mode | share->force_directory_mode;
58 }
59 
60 static inline int test_share_config_flag(struct ksmbd_share_config *share,
61 					 int flag)
62 {
63 	return share->flags & flag;
64 }
65 
66 #ifdef CONFIG_PROC_FS
67 static inline void ksmbd_share_tree_conn_init(struct ksmbd_share_config *share)
68 {
69 	atomic_set(&share->tree_connections, 0);
70 }
71 
72 static inline void ksmbd_share_tree_conn_inc(struct ksmbd_share_config *share)
73 {
74 	atomic_inc(&share->tree_connections);
75 }
76 
77 static inline void ksmbd_share_tree_conn_dec(struct ksmbd_share_config *share)
78 {
79 	atomic_dec(&share->tree_connections);
80 }
81 #else
82 static inline void ksmbd_share_tree_conn_init(struct ksmbd_share_config *share) {}
83 static inline void ksmbd_share_tree_conn_inc(struct ksmbd_share_config *share) {}
84 static inline void ksmbd_share_tree_conn_dec(struct ksmbd_share_config *share) {}
85 #endif
86 
87 void ksmbd_share_config_del(struct ksmbd_share_config *share);
88 void __ksmbd_share_config_put(struct ksmbd_share_config *share);
89 
90 static inline void ksmbd_share_config_put(struct ksmbd_share_config *share)
91 {
92 	if (!atomic_dec_and_test(&share->refcount))
93 		return;
94 	__ksmbd_share_config_put(share);
95 }
96 
97 struct ksmbd_share_config *ksmbd_share_config_get(struct ksmbd_work *work,
98 						  const char *name);
99 bool ksmbd_share_veto_filename(struct ksmbd_share_config *share,
100 			       const char *filename);
101 int create_proc_shares(void);
102 #endif /* __SHARE_CONFIG_MANAGEMENT_H__ */
103