ksmbd: request update to stale share config
[platform/kernel/linux-starfive.git] / fs / ksmbd / mgmt / share_config.h
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
13 struct ksmbd_share_config {
14         char                    *name;
15         char                    *path;
16
17         unsigned int            path_sz;
18         unsigned int            flags;
19         struct list_head        veto_list;
20
21         struct path             vfs_path;
22
23         atomic_t                refcount;
24         struct hlist_node       hlist;
25         unsigned short          create_mask;
26         unsigned short          directory_mask;
27         unsigned short          force_create_mode;
28         unsigned short          force_directory_mode;
29         unsigned short          force_uid;
30         unsigned short          force_gid;
31 };
32
33 #define KSMBD_SHARE_INVALID_UID ((__u16)-1)
34 #define KSMBD_SHARE_INVALID_GID ((__u16)-1)
35
36 static inline int share_config_create_mode(struct ksmbd_share_config *share,
37                                            umode_t posix_mode)
38 {
39         if (!share->force_create_mode) {
40                 if (!posix_mode)
41                         return share->create_mask;
42                 else
43                         return posix_mode & share->create_mask;
44         }
45         return share->force_create_mode & share->create_mask;
46 }
47
48 static inline int share_config_directory_mode(struct ksmbd_share_config *share,
49                                               umode_t posix_mode)
50 {
51         if (!share->force_directory_mode) {
52                 if (!posix_mode)
53                         return share->directory_mask;
54                 else
55                         return posix_mode & share->directory_mask;
56         }
57
58         return share->force_directory_mode & share->directory_mask;
59 }
60
61 static inline int test_share_config_flag(struct ksmbd_share_config *share,
62                                          int flag)
63 {
64         return share->flags & flag;
65 }
66
67 void ksmbd_share_config_del(struct ksmbd_share_config *share);
68 void __ksmbd_share_config_put(struct ksmbd_share_config *share);
69
70 static inline void ksmbd_share_config_put(struct ksmbd_share_config *share)
71 {
72         if (!atomic_dec_and_test(&share->refcount))
73                 return;
74         __ksmbd_share_config_put(share);
75 }
76
77 struct ksmbd_share_config *ksmbd_share_config_get(char *name);
78 bool ksmbd_share_veto_filename(struct ksmbd_share_config *share,
79                                const char *filename);
80 #endif /* __SHARE_CONFIG_MANAGEMENT_H__ */