ae46141ff0
Fix a memory leak due to allocation in the XDR layer. In cases where the RPC call needs to be retransmitted, we end up allocating new pages without clearing the old ones. Fix this by moving the allocation into nfs3_proc_setacls(). Also fix an issue discovered by Kevin Rudd, whereby the amount of memory reserved for the acls in the xdr_buf->head was miscalculated, and causing corruption. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
61 lines
1.5 KiB
C
61 lines
1.5 KiB
C
/*
|
|
* File: linux/nfsacl.h
|
|
*
|
|
* (C) 2003 Andreas Gruenbacher <agruen@suse.de>
|
|
*/
|
|
#ifndef __LINUX_NFSACL_H
|
|
#define __LINUX_NFSACL_H
|
|
|
|
#define NFS_ACL_PROGRAM 100227
|
|
|
|
#define ACLPROC2_GETACL 1
|
|
#define ACLPROC2_SETACL 2
|
|
#define ACLPROC2_GETATTR 3
|
|
#define ACLPROC2_ACCESS 4
|
|
|
|
#define ACLPROC3_GETACL 1
|
|
#define ACLPROC3_SETACL 2
|
|
|
|
|
|
/* Flags for the getacl/setacl mode */
|
|
#define NFS_ACL 0x0001
|
|
#define NFS_ACLCNT 0x0002
|
|
#define NFS_DFACL 0x0004
|
|
#define NFS_DFACLCNT 0x0008
|
|
|
|
/* Flag for Default ACL entries */
|
|
#define NFS_ACL_DEFAULT 0x1000
|
|
|
|
#ifdef __KERNEL__
|
|
|
|
#include <linux/posix_acl.h>
|
|
|
|
/* Maximum number of ACL entries over NFS */
|
|
#define NFS_ACL_MAX_ENTRIES 1024
|
|
|
|
#define NFSACL_MAXWORDS (2*(2+3*NFS_ACL_MAX_ENTRIES))
|
|
#define NFSACL_MAXPAGES ((2*(8+12*NFS_ACL_MAX_ENTRIES) + PAGE_SIZE-1) \
|
|
>> PAGE_SHIFT)
|
|
|
|
#define NFS_ACL_MAX_ENTRIES_INLINE (5)
|
|
#define NFS_ACL_INLINE_BUFSIZE ((2*(2+3*NFS_ACL_MAX_ENTRIES_INLINE)) << 2)
|
|
|
|
static inline unsigned int
|
|
nfsacl_size(struct posix_acl *acl_access, struct posix_acl *acl_default)
|
|
{
|
|
unsigned int w = 16;
|
|
w += max(acl_access ? (int)acl_access->a_count : 3, 4) * 12;
|
|
if (acl_default)
|
|
w += max((int)acl_default->a_count, 4) * 12;
|
|
return w;
|
|
}
|
|
|
|
extern unsigned int
|
|
nfsacl_encode(struct xdr_buf *buf, unsigned int base, struct inode *inode,
|
|
struct posix_acl *acl, int encode_entries, int typeflag);
|
|
extern unsigned int
|
|
nfsacl_decode(struct xdr_buf *buf, unsigned int base, unsigned int *aclcnt,
|
|
struct posix_acl **pacl);
|
|
|
|
#endif /* __KERNEL__ */
|
|
#endif /* __LINUX_NFSACL_H */
|