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)9static 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)19void 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)74void 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 }