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