diff options
| -rw-r--r-- | fs/cifs/Makefile | 4 | ||||
| -rw-r--r-- | fs/cifs/cifsacl.c | 3 | ||||
| -rw-r--r-- | fs/cifs/cifsacl.h | 4 | ||||
| -rw-r--r-- | fs/cifs/cifsproto.h | 2 | ||||
| -rw-r--r-- | fs/cifs/cifssmb.c | 183 | ||||
| -rw-r--r-- | fs/cifs/file.c | 2 | ||||
| -rw-r--r-- | fs/cifs/inode.c | 8 |
7 files changed, 99 insertions, 107 deletions
diff --git a/fs/cifs/Makefile b/fs/cifs/Makefile index adefa60a9bdc..43b19dd39191 100644 --- a/fs/cifs/Makefile +++ b/fs/cifs/Makefile | |||
| @@ -6,7 +6,9 @@ obj-$(CONFIG_CIFS) += cifs.o | |||
| 6 | cifs-y := cifsfs.o cifssmb.o cifs_debug.o connect.o dir.o file.o inode.o \ | 6 | cifs-y := cifsfs.o cifssmb.o cifs_debug.o connect.o dir.o file.o inode.o \ |
| 7 | link.o misc.o netmisc.o smbdes.o smbencrypt.o transport.o asn1.o \ | 7 | link.o misc.o netmisc.o smbdes.o smbencrypt.o transport.o asn1.o \ |
| 8 | md4.o md5.o cifs_unicode.o nterr.o xattr.o cifsencrypt.o \ | 8 | md4.o md5.o cifs_unicode.o nterr.o xattr.o cifsencrypt.o \ |
| 9 | readdir.o ioctl.o sess.o export.o cifsacl.o | 9 | readdir.o ioctl.o sess.o export.o |
| 10 | |||
| 11 | cifs-$(CONFIG_CIFS_ACL) += cifsacl.o | ||
| 10 | 12 | ||
| 11 | cifs-$(CONFIG_CIFS_UPCALL) += cifs_spnego.o | 13 | cifs-$(CONFIG_CIFS_UPCALL) += cifs_spnego.o |
| 12 | 14 | ||
diff --git a/fs/cifs/cifsacl.c b/fs/cifs/cifsacl.c index c6ebea088ac7..a437ec391a01 100644 --- a/fs/cifs/cifsacl.c +++ b/fs/cifs/cifsacl.c | |||
| @@ -30,8 +30,6 @@ | |||
| 30 | #include "cifs_debug.h" | 30 | #include "cifs_debug.h" |
| 31 | 31 | ||
| 32 | 32 | ||
| 33 | #ifdef CONFIG_CIFS_EXPERIMENTAL | ||
| 34 | |||
| 35 | static struct cifs_wksid wksidarr[NUM_WK_SIDS] = { | 33 | static struct cifs_wksid wksidarr[NUM_WK_SIDS] = { |
| 36 | {{1, 0, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0} }, "null user"}, | 34 | {{1, 0, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0} }, "null user"}, |
| 37 | {{1, 1, {0, 0, 0, 0, 0, 1}, {0, 0, 0, 0, 0} }, "nobody"}, | 35 | {{1, 1, {0, 0, 0, 0, 0, 1}, {0, 0, 0, 0, 0} }, "nobody"}, |
| @@ -774,4 +772,3 @@ int mode_to_cifs_acl(struct inode *inode, const char *path, __u64 nmode) | |||
| 774 | 772 | ||
| 775 | return rc; | 773 | return rc; |
| 776 | } | 774 | } |
| 777 | #endif /* CONFIG_CIFS_EXPERIMENTAL */ | ||
diff --git a/fs/cifs/cifsacl.h b/fs/cifs/cifsacl.h index 6c8096cf5155..c4ae7d036563 100644 --- a/fs/cifs/cifsacl.h +++ b/fs/cifs/cifsacl.h | |||
| @@ -74,11 +74,7 @@ struct cifs_wksid { | |||
| 74 | char sidname[SIDNAMELENGTH]; | 74 | char sidname[SIDNAMELENGTH]; |
| 75 | } __attribute__((packed)); | 75 | } __attribute__((packed)); |
| 76 | 76 | ||
| 77 | #ifdef CONFIG_CIFS_EXPERIMENTAL | ||
| 78 | |||
| 79 | extern int match_sid(struct cifs_sid *); | 77 | extern int match_sid(struct cifs_sid *); |
| 80 | extern int compare_sids(const struct cifs_sid *, const struct cifs_sid *); | 78 | extern int compare_sids(const struct cifs_sid *, const struct cifs_sid *); |
| 81 | 79 | ||
| 82 | #endif /* CONFIG_CIFS_EXPERIMENTAL */ | ||
| 83 | |||
| 84 | #endif /* _CIFSACL_H */ | 80 | #endif /* _CIFSACL_H */ |
diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h index db961dc4fd3d..5523047b1ebd 100644 --- a/fs/cifs/cifsproto.h +++ b/fs/cifs/cifsproto.h | |||
| @@ -79,9 +79,7 @@ extern bool is_valid_oplock_break(struct smb_hdr *smb, | |||
| 79 | struct TCP_Server_Info *); | 79 | struct TCP_Server_Info *); |
| 80 | extern bool is_size_safe_to_change(struct cifsInodeInfo *, __u64 eof); | 80 | extern bool is_size_safe_to_change(struct cifsInodeInfo *, __u64 eof); |
| 81 | extern struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *, bool); | 81 | extern struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *, bool); |
| 82 | #ifdef CONFIG_CIFS_EXPERIMENTAL | ||
| 83 | extern struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *, bool); | 82 | extern struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *, bool); |
| 84 | #endif | ||
| 85 | extern unsigned int smbCalcSize(struct smb_hdr *ptr); | 83 | extern unsigned int smbCalcSize(struct smb_hdr *ptr); |
| 86 | extern unsigned int smbCalcSize_LE(struct smb_hdr *ptr); | 84 | extern unsigned int smbCalcSize_LE(struct smb_hdr *ptr); |
| 87 | extern int decode_negTokenInit(unsigned char *security_blob, int length, | 85 | extern int decode_negTokenInit(unsigned char *security_blob, int length, |
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index 2f2632b6df5a..67acfb3acad2 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c | |||
| @@ -2478,95 +2478,6 @@ querySymLinkRetry: | |||
| 2478 | } | 2478 | } |
| 2479 | 2479 | ||
| 2480 | #ifdef CONFIG_CIFS_EXPERIMENTAL | 2480 | #ifdef CONFIG_CIFS_EXPERIMENTAL |
| 2481 | /* Initialize NT TRANSACT SMB into small smb request buffer. | ||
| 2482 | This assumes that all NT TRANSACTS that we init here have | ||
| 2483 | total parm and data under about 400 bytes (to fit in small cifs | ||
| 2484 | buffer size), which is the case so far, it easily fits. NB: | ||
| 2485 | Setup words themselves and ByteCount | ||
| 2486 | MaxSetupCount (size of returned setup area) and | ||
| 2487 | MaxParameterCount (returned parms size) must be set by caller */ | ||
| 2488 | static int | ||
| 2489 | smb_init_nttransact(const __u16 sub_command, const int setup_count, | ||
| 2490 | const int parm_len, struct cifsTconInfo *tcon, | ||
| 2491 | void **ret_buf) | ||
| 2492 | { | ||
| 2493 | int rc; | ||
| 2494 | __u32 temp_offset; | ||
| 2495 | struct smb_com_ntransact_req *pSMB; | ||
| 2496 | |||
| 2497 | rc = small_smb_init(SMB_COM_NT_TRANSACT, 19 + setup_count, tcon, | ||
| 2498 | (void **)&pSMB); | ||
| 2499 | if (rc) | ||
| 2500 | return rc; | ||
| 2501 | *ret_buf = (void *)pSMB; | ||
| 2502 | pSMB->Reserved = 0; | ||
| 2503 | pSMB->TotalParameterCount = cpu_to_le32(parm_len); | ||
| 2504 | pSMB->TotalDataCount = 0; | ||
| 2505 | pSMB->MaxDataCount = cpu_to_le32((tcon->ses->server->maxBuf - | ||
| 2506 | MAX_CIFS_HDR_SIZE) & 0xFFFFFF00); | ||
| 2507 | pSMB->ParameterCount = pSMB->TotalParameterCount; | ||
| 2508 | pSMB->DataCount = pSMB->TotalDataCount; | ||
| 2509 | temp_offset = offsetof(struct smb_com_ntransact_req, Parms) + | ||
| 2510 | (setup_count * 2) - 4 /* for rfc1001 length itself */; | ||
| 2511 | pSMB->ParameterOffset = cpu_to_le32(temp_offset); | ||
| 2512 | pSMB->DataOffset = cpu_to_le32(temp_offset + parm_len); | ||
| 2513 | pSMB->SetupCount = setup_count; /* no need to le convert byte fields */ | ||
| 2514 | pSMB->SubCommand = cpu_to_le16(sub_command); | ||
| 2515 | return 0; | ||
| 2516 | } | ||
| 2517 | |||
| 2518 | static int | ||
| 2519 | validate_ntransact(char *buf, char **ppparm, char **ppdata, | ||
| 2520 | __u32 *pparmlen, __u32 *pdatalen) | ||
| 2521 | { | ||
| 2522 | char *end_of_smb; | ||
| 2523 | __u32 data_count, data_offset, parm_count, parm_offset; | ||
| 2524 | struct smb_com_ntransact_rsp *pSMBr; | ||
| 2525 | |||
| 2526 | *pdatalen = 0; | ||
| 2527 | *pparmlen = 0; | ||
| 2528 | |||
| 2529 | if (buf == NULL) | ||
| 2530 | return -EINVAL; | ||
| 2531 | |||
| 2532 | pSMBr = (struct smb_com_ntransact_rsp *)buf; | ||
| 2533 | |||
| 2534 | /* ByteCount was converted from little endian in SendReceive */ | ||
| 2535 | end_of_smb = 2 /* sizeof byte count */ + pSMBr->ByteCount + | ||
| 2536 | (char *)&pSMBr->ByteCount; | ||
| 2537 | |||
| 2538 | data_offset = le32_to_cpu(pSMBr->DataOffset); | ||
| 2539 | data_count = le32_to_cpu(pSMBr->DataCount); | ||
| 2540 | parm_offset = le32_to_cpu(pSMBr->ParameterOffset); | ||
| 2541 | parm_count = le32_to_cpu(pSMBr->ParameterCount); | ||
| 2542 | |||
| 2543 | *ppparm = (char *)&pSMBr->hdr.Protocol + parm_offset; | ||
| 2544 | *ppdata = (char *)&pSMBr->hdr.Protocol + data_offset; | ||
| 2545 | |||
| 2546 | /* should we also check that parm and data areas do not overlap? */ | ||
| 2547 | if (*ppparm > end_of_smb) { | ||
| 2548 | cFYI(1, "parms start after end of smb"); | ||
| 2549 | return -EINVAL; | ||
| 2550 | } else if (parm_count + *ppparm > end_of_smb) { | ||
| 2551 | cFYI(1, "parm end after end of smb"); | ||
| 2552 | return -EINVAL; | ||
| 2553 | } else if (*ppdata > end_of_smb) { | ||
| 2554 | cFYI(1, "data starts after end of smb"); | ||
| 2555 | return -EINVAL; | ||
| 2556 | } else if (data_count + *ppdata > end_of_smb) { | ||
| 2557 | cFYI(1, "data %p + count %d (%p) past smb end %p start %p", | ||
| 2558 | *ppdata, data_count, (data_count + *ppdata), | ||
| 2559 | end_of_smb, pSMBr); | ||
| 2560 | return -EINVAL; | ||
| 2561 | } else if (parm_count + data_count > pSMBr->ByteCount) { | ||
| 2562 | cFYI(1, "parm count and data count larger than SMB"); | ||
| 2563 | return -EINVAL; | ||
| 2564 | } | ||
| 2565 | *pdatalen = data_count; | ||
| 2566 | *pparmlen = parm_count; | ||
| 2567 | return 0; | ||
| 2568 | } | ||
| 2569 | |||
| 2570 | int | 2481 | int |
| 2571 | CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon, | 2482 | CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon, |
| 2572 | const unsigned char *searchName, | 2483 | const unsigned char *searchName, |
| @@ -3056,7 +2967,97 @@ GetExtAttrOut: | |||
| 3056 | 2967 | ||
| 3057 | #endif /* CONFIG_POSIX */ | 2968 | #endif /* CONFIG_POSIX */ |
| 3058 | 2969 | ||
| 3059 | #ifdef CONFIG_CIFS_EXPERIMENTAL | 2970 | #ifdef CONFIG_CIFS_ACL |
| 2971 | /* | ||
| 2972 | * Initialize NT TRANSACT SMB into small smb request buffer. This assumes that | ||
| 2973 | * all NT TRANSACTS that we init here have total parm and data under about 400 | ||
| 2974 | * bytes (to fit in small cifs buffer size), which is the case so far, it | ||
| 2975 | * easily fits. NB: Setup words themselves and ByteCount MaxSetupCount (size of | ||
| 2976 | * returned setup area) and MaxParameterCount (returned parms size) must be set | ||
| 2977 | * by caller | ||
| 2978 | */ | ||
| 2979 | static int | ||
| 2980 | smb_init_nttransact(const __u16 sub_command, const int setup_count, | ||
| 2981 | const int parm_len, struct cifsTconInfo *tcon, | ||
| 2982 | void **ret_buf) | ||
| 2983 | { | ||
| 2984 | int rc; | ||
| 2985 | __u32 temp_offset; | ||
| 2986 | struct smb_com_ntransact_req *pSMB; | ||
| 2987 | |||
| 2988 | rc = small_smb_init(SMB_COM_NT_TRANSACT, 19 + setup_count, tcon, | ||
| 2989 | (void **)&pSMB); | ||
| 2990 | if (rc) | ||
| 2991 | return rc; | ||
| 2992 | *ret_buf = (void *)pSMB; | ||
| 2993 | pSMB->Reserved = 0; | ||
| 2994 | pSMB->TotalParameterCount = cpu_to_le32(parm_len); | ||
| 2995 | pSMB->TotalDataCount = 0; | ||
| 2996 | pSMB->MaxDataCount = cpu_to_le32((tcon->ses->server->maxBuf - | ||
| 2997 | MAX_CIFS_HDR_SIZE) & 0xFFFFFF00); | ||
| 2998 | pSMB->ParameterCount = pSMB->TotalParameterCount; | ||
| 2999 | pSMB->DataCount = pSMB->TotalDataCount; | ||
| 3000 | temp_offset = offsetof(struct smb_com_ntransact_req, Parms) + | ||
| 3001 | (setup_count * 2) - 4 /* for rfc1001 length itself */; | ||
| 3002 | pSMB->ParameterOffset = cpu_to_le32(temp_offset); | ||
| 3003 | pSMB->DataOffset = cpu_to_le32(temp_offset + parm_len); | ||
| 3004 | pSMB->SetupCount = setup_count; /* no need to le convert byte fields */ | ||
| 3005 | pSMB->SubCommand = cpu_to_le16(sub_command); | ||
| 3006 | return 0; | ||
| 3007 | } | ||
| 3008 | |||
| 3009 | static int | ||
| 3010 | validate_ntransact(char *buf, char **ppparm, char **ppdata, | ||
| 3011 | __u32 *pparmlen, __u32 *pdatalen) | ||
| 3012 | { | ||
| 3013 | char *end_of_smb; | ||
| 3014 | __u32 data_count, data_offset, parm_count, parm_offset; | ||
| 3015 | struct smb_com_ntransact_rsp *pSMBr; | ||
| 3016 | |||
| 3017 | *pdatalen = 0; | ||
| 3018 | *pparmlen = 0; | ||
| 3019 | |||
| 3020 | if (buf == NULL) | ||
| 3021 | return -EINVAL; | ||
| 3022 | |||
| 3023 | pSMBr = (struct smb_com_ntransact_rsp *)buf; | ||
| 3024 | |||
| 3025 | /* ByteCount was converted from little endian in SendReceive */ | ||
| 3026 | end_of_smb = 2 /* sizeof byte count */ + pSMBr->ByteCount + | ||
| 3027 | (char *)&pSMBr->ByteCount; | ||
| 3028 | |||
| 3029 | data_offset = le32_to_cpu(pSMBr->DataOffset); | ||
| 3030 | data_count = le32_to_cpu(pSMBr->DataCount); | ||
| 3031 | parm_offset = le32_to_cpu(pSMBr->ParameterOffset); | ||
| 3032 | parm_count = le32_to_cpu(pSMBr->ParameterCount); | ||
| 3033 | |||
| 3034 | *ppparm = (char *)&pSMBr->hdr.Protocol + parm_offset; | ||
| 3035 | *ppdata = (char *)&pSMBr->hdr.Protocol + data_offset; | ||
| 3036 | |||
| 3037 | /* should we also check that parm and data areas do not overlap? */ | ||
| 3038 | if (*ppparm > end_of_smb) { | ||
| 3039 | cFYI(1, "parms start after end of smb"); | ||
| 3040 | return -EINVAL; | ||
| 3041 | } else if (parm_count + *ppparm > end_of_smb) { | ||
| 3042 | cFYI(1, "parm end after end of smb"); | ||
| 3043 | return -EINVAL; | ||
| 3044 | } else if (*ppdata > end_of_smb) { | ||
| 3045 | cFYI(1, "data starts after end of smb"); | ||
| 3046 | return -EINVAL; | ||
| 3047 | } else if (data_count + *ppdata > end_of_smb) { | ||
| 3048 | cFYI(1, "data %p + count %d (%p) past smb end %p start %p", | ||
| 3049 | *ppdata, data_count, (data_count + *ppdata), | ||
| 3050 | end_of_smb, pSMBr); | ||
| 3051 | return -EINVAL; | ||
| 3052 | } else if (parm_count + data_count > pSMBr->ByteCount) { | ||
| 3053 | cFYI(1, "parm count and data count larger than SMB"); | ||
| 3054 | return -EINVAL; | ||
| 3055 | } | ||
| 3056 | *pdatalen = data_count; | ||
| 3057 | *pparmlen = parm_count; | ||
| 3058 | return 0; | ||
| 3059 | } | ||
| 3060 | |||
| 3060 | /* Get Security Descriptor (by handle) from remote server for a file or dir */ | 3061 | /* Get Security Descriptor (by handle) from remote server for a file or dir */ |
| 3061 | int | 3062 | int |
| 3062 | CIFSSMBGetCIFSACL(const int xid, struct cifsTconInfo *tcon, __u16 fid, | 3063 | CIFSSMBGetCIFSACL(const int xid, struct cifsTconInfo *tcon, __u16 fid, |
| @@ -3214,7 +3215,7 @@ setCifsAclRetry: | |||
| 3214 | return (rc); | 3215 | return (rc); |
| 3215 | } | 3216 | } |
| 3216 | 3217 | ||
| 3217 | #endif /* CONFIG_CIFS_EXPERIMENTAL */ | 3218 | #endif /* CONFIG_CIFS_ACL */ |
| 3218 | 3219 | ||
| 3219 | /* Legacy Query Path Information call for lookup to old servers such | 3220 | /* Legacy Query Path Information call for lookup to old servers such |
| 3220 | as Win9x/WinME */ | 3221 | as Win9x/WinME */ |
diff --git a/fs/cifs/file.c b/fs/cifs/file.c index b857ce5db775..5a28660ca2b5 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c | |||
| @@ -1108,7 +1108,6 @@ static ssize_t cifs_write(struct cifsFileInfo *open_file, | |||
| 1108 | return total_written; | 1108 | return total_written; |
| 1109 | } | 1109 | } |
| 1110 | 1110 | ||
| 1111 | #ifdef CONFIG_CIFS_EXPERIMENTAL | ||
| 1112 | struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *cifs_inode, | 1111 | struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *cifs_inode, |
| 1113 | bool fsuid_only) | 1112 | bool fsuid_only) |
| 1114 | { | 1113 | { |
| @@ -1142,7 +1141,6 @@ struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *cifs_inode, | |||
| 1142 | spin_unlock(&cifs_file_list_lock); | 1141 | spin_unlock(&cifs_file_list_lock); |
| 1143 | return NULL; | 1142 | return NULL; |
| 1144 | } | 1143 | } |
| 1145 | #endif | ||
| 1146 | 1144 | ||
| 1147 | struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *cifs_inode, | 1145 | struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *cifs_inode, |
| 1148 | bool fsuid_only) | 1146 | bool fsuid_only) |
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index bb5ca4848e81..aa48521a78c1 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c | |||
| @@ -686,7 +686,7 @@ int cifs_get_inode_info(struct inode **pinode, | |||
| 686 | cFYI(1, "cifs_sfu_type failed: %d", tmprc); | 686 | cFYI(1, "cifs_sfu_type failed: %d", tmprc); |
| 687 | } | 687 | } |
| 688 | 688 | ||
| 689 | #ifdef CONFIG_CIFS_EXPERIMENTAL | 689 | #ifdef CONFIG_CIFS_ACL |
| 690 | /* fill in 0777 bits from ACL */ | 690 | /* fill in 0777 bits from ACL */ |
| 691 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) { | 691 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) { |
| 692 | rc = cifs_acl_to_fattr(cifs_sb, &fattr, *pinode, full_path, | 692 | rc = cifs_acl_to_fattr(cifs_sb, &fattr, *pinode, full_path, |
| @@ -697,7 +697,7 @@ int cifs_get_inode_info(struct inode **pinode, | |||
| 697 | goto cgii_exit; | 697 | goto cgii_exit; |
| 698 | } | 698 | } |
| 699 | } | 699 | } |
| 700 | #endif | 700 | #endif /* CONFIG_CIFS_ACL */ |
| 701 | 701 | ||
| 702 | /* fill in remaining high mode bits e.g. SUID, VTX */ | 702 | /* fill in remaining high mode bits e.g. SUID, VTX */ |
| 703 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) | 703 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) |
| @@ -2122,7 +2122,7 @@ cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs) | |||
| 2122 | 2122 | ||
| 2123 | if (attrs->ia_valid & ATTR_MODE) { | 2123 | if (attrs->ia_valid & ATTR_MODE) { |
| 2124 | rc = 0; | 2124 | rc = 0; |
| 2125 | #ifdef CONFIG_CIFS_EXPERIMENTAL | 2125 | #ifdef CONFIG_CIFS_ACL |
| 2126 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) { | 2126 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) { |
| 2127 | rc = mode_to_cifs_acl(inode, full_path, mode); | 2127 | rc = mode_to_cifs_acl(inode, full_path, mode); |
| 2128 | if (rc) { | 2128 | if (rc) { |
| @@ -2131,7 +2131,7 @@ cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs) | |||
| 2131 | goto cifs_setattr_exit; | 2131 | goto cifs_setattr_exit; |
| 2132 | } | 2132 | } |
| 2133 | } else | 2133 | } else |
| 2134 | #endif | 2134 | #endif /* CONFIG_CIFS_ACL */ |
| 2135 | if (((mode & S_IWUGO) == 0) && | 2135 | if (((mode & S_IWUGO) == 0) && |
| 2136 | (cifsInode->cifsAttrs & ATTR_READONLY) == 0) { | 2136 | (cifsInode->cifsAttrs & ATTR_READONLY) == 0) { |
| 2137 | 2137 | ||
