kernel/io_uring: cancel io_uring before task works
[linux-2.6-microblaze.git] / fs / cifs / smb2ops.c
index 949cd11..f192748 100644 (file)
@@ -3214,7 +3214,7 @@ smb2_query_reparse_tag(const unsigned int xid, struct cifs_tcon *tcon,
 
 static struct cifs_ntsd *
 get_smb2_acl_by_fid(struct cifs_sb_info *cifs_sb,
-               const struct cifs_fid *cifsfid, u32 *pacllen)
+                   const struct cifs_fid *cifsfid, u32 *pacllen, u32 info)
 {
        struct cifs_ntsd *pntsd = NULL;
        unsigned int xid;
@@ -3228,7 +3228,8 @@ get_smb2_acl_by_fid(struct cifs_sb_info *cifs_sb,
        cifs_dbg(FYI, "trying to get acl\n");
 
        rc = SMB2_query_acl(xid, tlink_tcon(tlink), cifsfid->persistent_fid,
-                           cifsfid->volatile_fid, (void **)&pntsd, pacllen);
+                           cifsfid->volatile_fid, (void **)&pntsd, pacllen,
+                           info);
        free_xid(xid);
 
        cifs_put_tlink(tlink);
@@ -3242,7 +3243,7 @@ get_smb2_acl_by_fid(struct cifs_sb_info *cifs_sb,
 
 static struct cifs_ntsd *
 get_smb2_acl_by_path(struct cifs_sb_info *cifs_sb,
-               const char *path, u32 *pacllen)
+                    const char *path, u32 *pacllen, u32 info)
 {
        struct cifs_ntsd *pntsd = NULL;
        u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
@@ -3280,12 +3281,16 @@ get_smb2_acl_by_path(struct cifs_sb_info *cifs_sb,
        oparms.fid = &fid;
        oparms.reconnect = false;
 
+       if (info & SACL_SECINFO)
+               oparms.desired_access |= SYSTEM_SECURITY;
+
        rc = SMB2_open(xid, &oparms, utf16_path, &oplock, NULL, NULL, NULL,
                       NULL);
        kfree(utf16_path);
        if (!rc) {
                rc = SMB2_query_acl(xid, tlink_tcon(tlink), fid.persistent_fid,
-                           fid.volatile_fid, (void **)&pntsd, pacllen);
+                                   fid.volatile_fid, (void **)&pntsd, pacllen,
+                                   info);
                SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid);
        }
 
@@ -3319,10 +3324,12 @@ set_smb2_acl(struct cifs_ntsd *pnntsd, __u32 acllen,
        tcon = tlink_tcon(tlink);
        xid = get_xid();
 
-       if (aclflag == CIFS_ACL_OWNER || aclflag == CIFS_ACL_GROUP)
-               access_flags = WRITE_OWNER;
-       else
-               access_flags = WRITE_DAC;
+       if (aclflag & CIFS_ACL_OWNER || aclflag & CIFS_ACL_GROUP)
+               access_flags |= WRITE_OWNER;
+       if (aclflag & CIFS_ACL_SACL)
+               access_flags |= SYSTEM_SECURITY;
+       if (aclflag & CIFS_ACL_DACL)
+               access_flags |= WRITE_DAC;
 
        utf16_path = cifs_convert_path_to_utf16(path, cifs_sb);
        if (!utf16_path) {
@@ -3356,18 +3363,18 @@ set_smb2_acl(struct cifs_ntsd *pnntsd, __u32 acllen,
 /* Retrieve an ACL from the server */
 static struct cifs_ntsd *
 get_smb2_acl(struct cifs_sb_info *cifs_sb,
-                                     struct inode *inode, const char *path,
-                                     u32 *pacllen)
+            struct inode *inode, const char *path,
+            u32 *pacllen, u32 info)
 {
        struct cifs_ntsd *pntsd = NULL;
        struct cifsFileInfo *open_file = NULL;
 
-       if (inode)
+       if (inode && !(info & SACL_SECINFO))
                open_file = find_readable_file(CIFS_I(inode), true);
-       if (!open_file)
-               return get_smb2_acl_by_path(cifs_sb, path, pacllen);
+       if (!open_file || (info & SACL_SECINFO))
+               return get_smb2_acl_by_path(cifs_sb, path, pacllen, info);
 
-       pntsd = get_smb2_acl_by_fid(cifs_sb, &open_file->fid, pacllen);
+       pntsd = get_smb2_acl_by_fid(cifs_sb, &open_file->fid, pacllen, info);
        cifsFileInfo_put(open_file);
        return pntsd;
 }