0001
0002
0003
0004
0005
0006 #ifndef __SHARE_CONFIG_MANAGEMENT_H__
0007 #define __SHARE_CONFIG_MANAGEMENT_H__
0008
0009 #include <linux/workqueue.h>
0010 #include <linux/hashtable.h>
0011 #include <linux/path.h>
0012
0013 struct ksmbd_share_config {
0014 char *name;
0015 char *path;
0016
0017 unsigned int path_sz;
0018 unsigned int flags;
0019 struct list_head veto_list;
0020
0021 struct path vfs_path;
0022
0023 atomic_t refcount;
0024 struct hlist_node hlist;
0025 unsigned short create_mask;
0026 unsigned short directory_mask;
0027 unsigned short force_create_mode;
0028 unsigned short force_directory_mode;
0029 unsigned short force_uid;
0030 unsigned short force_gid;
0031 };
0032
0033 #define KSMBD_SHARE_INVALID_UID ((__u16)-1)
0034 #define KSMBD_SHARE_INVALID_GID ((__u16)-1)
0035
0036 static inline int share_config_create_mode(struct ksmbd_share_config *share,
0037 umode_t posix_mode)
0038 {
0039 if (!share->force_create_mode) {
0040 if (!posix_mode)
0041 return share->create_mask;
0042 else
0043 return posix_mode & share->create_mask;
0044 }
0045 return share->force_create_mode & share->create_mask;
0046 }
0047
0048 static inline int share_config_directory_mode(struct ksmbd_share_config *share,
0049 umode_t posix_mode)
0050 {
0051 if (!share->force_directory_mode) {
0052 if (!posix_mode)
0053 return share->directory_mask;
0054 else
0055 return posix_mode & share->directory_mask;
0056 }
0057
0058 return share->force_directory_mode & share->directory_mask;
0059 }
0060
0061 static inline int test_share_config_flag(struct ksmbd_share_config *share,
0062 int flag)
0063 {
0064 return share->flags & flag;
0065 }
0066
0067 void ksmbd_share_config_del(struct ksmbd_share_config *share);
0068 void __ksmbd_share_config_put(struct ksmbd_share_config *share);
0069
0070 static inline void ksmbd_share_config_put(struct ksmbd_share_config *share)
0071 {
0072 if (!atomic_dec_and_test(&share->refcount))
0073 return;
0074 __ksmbd_share_config_put(share);
0075 }
0076
0077 struct ksmbd_share_config *ksmbd_share_config_get(char *name);
0078 bool ksmbd_share_veto_filename(struct ksmbd_share_config *share,
0079 const char *filename);
0080 #endif