Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 /*
0003  *   Copyright (C) 2018 Samsung Electronics Co., Ltd.
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 /* __SHARE_CONFIG_MANAGEMENT_H__ */