• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * fs/sharefs/authentication.c
4  *
5  * Copyright (c) 2023 Huawei Device Co., Ltd.
6  */
7 #include "authentication.h"
8 
perm_get_next_level(__u16 perm)9 static inline __u16 perm_get_next_level(__u16 perm)
10 {
11 	__u16 level = (perm & SHAREFS_PERM_MASK) + 1;
12 
13 	if (level <= SHAREFS_PERM_OTHER)
14 		return level;
15 	else
16 		return SHAREFS_PERM_OTHER;
17 }
18 
fixup_perm_from_level(struct inode * dir,struct dentry * dentry)19 void fixup_perm_from_level(struct inode *dir, struct dentry *dentry)
20 {
21 	struct sharefs_inode_info *hii = SHAREFS_I(dir);
22 	struct inode *dinode = d_inode(dentry);
23 	struct sharefs_inode_info *dinfo = SHAREFS_I(dinode);
24 	const unsigned char* cur_name =  dentry->d_name.name;
25 	__u16 level = perm_get_next_level(hii->perm);
26 	__u16 perm = 0;
27 	int bid = 0;
28 
29 	if (IS_ERR_OR_NULL(dinode))
30 		return;
31 	dinode->i_uid = dir->i_uid;
32 	dinode->i_gid = dir->i_gid;
33 	switch (level)
34 	{
35 	case SHAREFS_PERM_MNT:
36 		bid = get_bundle_uid(SHAREFS_SB(dentry->d_sb),
37 					 dentry->d_name.name);
38 		perm = level;
39 		if (bid != 0) {
40 			dinode->i_uid = KUIDT_INIT(bid);
41 			dinode->i_gid = KGIDT_INIT(bid);
42 		} else {
43 			dinode->i_uid = ROOT_UID;
44 			dinode->i_gid = ROOT_GID;
45 		}
46 		dinode->i_mode = (dinode->i_mode & S_IFMT) | SHAREFS_PERM_READONLY_DIR;
47 		break;
48 	case SHAREFS_PERM_DFS:
49 		if (!strcmp(cur_name, SHAREFS_READ_DIR)) {
50 			perm = SHAREFS_DIR_TYPE_READONLY | level;
51 			sharefs_set_read_perm(dinode);
52 		} else if (!strcmp(cur_name, SHAREFS_READWRITE_DIR)) {
53 			perm = SHAREFS_DIR_TYPE_READWRITE | level;
54 			sharefs_set_read_write_perm(dinode);
55 		}
56 		break;
57 	case SHAREFS_PERM_OTHER:
58 		if (is_read_only_auth(hii->perm)) {
59 			perm = SHAREFS_DIR_TYPE_READONLY | SHAREFS_PERM_DFS;
60 			sharefs_set_read_perm(dinode);
61 		} else if (is_read_write_auth(hii->perm)) {
62 			perm = SHAREFS_DIR_TYPE_READWRITE | SHAREFS_PERM_DFS;
63 			sharefs_set_read_write_perm(dinode);
64 		}
65 		break;
66 	default:
67 		/* ! it should not get to here */
68 		sharefs_err("sharedfs perm incorrect got default case, level:%u", level);
69 		break;
70 	}
71 	dinfo->perm = perm;
72 }
73 
sharefs_root_inode_perm_init(struct inode * root_inode)74 void sharefs_root_inode_perm_init(struct inode *root_inode)
75 {
76 	struct sharefs_inode_info *hii = SHAREFS_I(root_inode);
77 	hii->perm = SHAREFS_PERM_FIX;
78 }