query owner and group attr only on specific getattrs

previously we'd query owner and group file attributes on all getattrs and
storing that in nfs41_file_info structure which was caused a problem for
readdirs.
This commit is contained in:
Olga Kornievskaia 2011-07-18 14:21:29 -04:00 committed by unknown
parent 83d17fcb69
commit 316dfe568a
5 changed files with 20 additions and 16 deletions

View file

@ -269,17 +269,19 @@ static int handle_getacl(nfs41_upcall *upcall)
getacl_upcall_args *args = &upcall->args.getacl; getacl_upcall_args *args = &upcall->args.getacl;
nfs41_open_state *state = upcall->state_ref; nfs41_open_state *state = upcall->state_ref;
nfs41_file_info info; nfs41_file_info info;
bitmap4 attr_request; bitmap4 attr_request = { 0 };
LPSTR domain = NULL; LPSTR domain = NULL;
SECURITY_DESCRIPTOR sec_desc; SECURITY_DESCRIPTOR sec_desc;
PACL dacl = NULL; PACL dacl = NULL;
PSID *sids = NULL; PSID *sids = NULL;
PSID osid = NULL, gsid = NULL; PSID osid = NULL, gsid = NULL;
DWORD sid_len; DWORD sid_len;
char owner[NFS4_OPAQUE_LIMIT], group[NFS4_OPAQUE_LIMIT];
// need to cache owner/group information XX // need to cache owner/group information XX
ZeroMemory(&info, sizeof(info)); ZeroMemory(&info, sizeof(info));
init_getattr_request(&attr_request); attr_request.count = 2;
attr_request.arr[1] = FATTR4_WORD1_OWNER | FATTR4_WORD1_OWNER_GROUP;
if (args->query & DACL_SECURITY_INFORMATION) { if (args->query & DACL_SECURITY_INFORMATION) {
info.acl = calloc(1, sizeof(nfsacl41)); info.acl = calloc(1, sizeof(nfsacl41));
if (info.acl == NULL) { if (info.acl == NULL) {
@ -288,6 +290,8 @@ static int handle_getacl(nfs41_upcall *upcall)
} }
attr_request.arr[0] |= FATTR4_WORD0_ACL; attr_request.arr[0] |= FATTR4_WORD0_ACL;
} }
info.owner = owner;
info.owner_group = group;
status = nfs41_getattr(state->session, &state->file, &attr_request, &info); status = nfs41_getattr(state->session, &state->file, &attr_request, &info);
if (status) { if (status) {
eprintf("handle_getacl: nfs41_cached_getattr() failed with %d\n", eprintf("handle_getacl: nfs41_cached_getattr() failed with %d\n",
@ -727,7 +731,6 @@ static int handle_setacl(nfs41_upcall *upcall)
if (status) if (status)
goto out; goto out;
else { else {
info.owner_len = (uint32_t)strlen(info.owner);
info.attrmask.arr[1] |= FATTR4_WORD1_OWNER; info.attrmask.arr[1] |= FATTR4_WORD1_OWNER;
info.attrmask.count = 2; info.attrmask.count = 2;
} }
@ -745,7 +748,6 @@ static int handle_setacl(nfs41_upcall *upcall)
if (status) if (status)
goto out; goto out;
else { else {
info.owner_group_len = (uint32_t)strlen(info.owner_group);
info.attrmask.arr[1] |= FATTR4_WORD1_OWNER_GROUP; info.attrmask.arr[1] |= FATTR4_WORD1_OWNER_GROUP;
info.attrmask.count = 2; info.attrmask.count = 2;
} }

View file

@ -98,8 +98,7 @@ static void init_component_args(
| FATTR4_WORD0_FSID | FATTR4_WORD0_FILEID; | FATTR4_WORD0_FSID | FATTR4_WORD0_FILEID;
args->attr_request.arr[1] = FATTR4_WORD1_MODE args->attr_request.arr[1] = FATTR4_WORD1_MODE
| FATTR4_WORD1_NUMLINKS | FATTR4_WORD1_TIME_ACCESS | FATTR4_WORD1_NUMLINKS | FATTR4_WORD1_TIME_ACCESS
| FATTR4_WORD1_TIME_CREATE | FATTR4_WORD1_TIME_MODIFY | | FATTR4_WORD1_TIME_CREATE | FATTR4_WORD1_TIME_MODIFY;
FATTR4_WORD1_OWNER | FATTR4_WORD1_OWNER_GROUP;
args->getrootattr.attr_request = &args->attr_request; args->getrootattr.attr_request = &args->attr_request;
res->root.path = path; res->root.path = path;

View file

@ -1010,8 +1010,7 @@ void init_getattr_request(bitmap4 *attr_request)
FATTR4_WORD0_CHANGE | FATTR4_WORD0_SIZE | FATTR4_WORD0_FILEID; FATTR4_WORD0_CHANGE | FATTR4_WORD0_SIZE | FATTR4_WORD0_FILEID;
attr_request->arr[1] = FATTR4_WORD1_NUMLINKS | attr_request->arr[1] = FATTR4_WORD1_NUMLINKS |
FATTR4_WORD1_TIME_ACCESS | FATTR4_WORD1_TIME_CREATE | FATTR4_WORD1_TIME_ACCESS | FATTR4_WORD1_TIME_CREATE |
FATTR4_WORD1_TIME_MODIFY | FATTR4_WORD1_MODE | FATTR4_WORD1_TIME_MODIFY | FATTR4_WORD1_MODE;
FATTR4_WORD1_OWNER | FATTR4_WORD1_OWNER_GROUP;
attr_request->arr[2] = 0; attr_request->arr[2] = 0;
} }

View file

@ -226,10 +226,8 @@ typedef struct __nfs41_file_info {
bool_t symlink_dir; bool_t symlink_dir;
bool_t symlink_support; bool_t symlink_support;
bool_t link_support; bool_t link_support;
char owner[NFS4_OPAQUE_LIMIT]; char *owner;
uint32_t owner_len; char *owner_group;
char owner_group[NFS4_OPAQUE_LIMIT];
uint32_t owner_group_len;
uint32_t aclsupport; uint32_t aclsupport;
} nfs41_file_info; } nfs41_file_info;

View file

@ -1767,15 +1767,19 @@ static bool_t decode_file_attrs(
} }
if (attrs->attrmask.arr[1] & FATTR4_WORD1_OWNER) { if (attrs->attrmask.arr[1] & FATTR4_WORD1_OWNER) {
char *ptr = &info->owner[0]; char *ptr = &info->owner[0];
if (!xdr_bytes(xdr, &ptr, &info->owner_len, uint32_t owner_len;
if (!xdr_bytes(xdr, &ptr, &owner_len,
NFS4_OPAQUE_LIMIT)) NFS4_OPAQUE_LIMIT))
return FALSE; return FALSE;
info->owner[owner_len] = '\0';
} }
if (attrs->attrmask.arr[1] & FATTR4_WORD1_OWNER_GROUP) { if (attrs->attrmask.arr[1] & FATTR4_WORD1_OWNER_GROUP) {
char *ptr = &info->owner_group[0]; char *ptr = &info->owner_group[0];
if (!xdr_bytes(xdr, &ptr, &info->owner_group_len, uint32_t owner_group_len;
if (!xdr_bytes(xdr, &ptr, &owner_group_len,
NFS4_OPAQUE_LIMIT)) NFS4_OPAQUE_LIMIT))
return FALSE; return FALSE;
info->owner_group[owner_group_len] = '\0';
} }
if (attrs->attrmask.arr[1] & FATTR4_WORD1_SPACE_AVAIL) { if (attrs->attrmask.arr[1] & FATTR4_WORD1_SPACE_AVAIL) {
if (!xdr_u_hyper(xdr, &info->space_avail)) if (!xdr_u_hyper(xdr, &info->space_avail))
@ -2573,14 +2577,16 @@ static bool_t encode_file_attrs(
} }
if (info->attrmask.arr[1] & FATTR4_WORD1_OWNER) { if (info->attrmask.arr[1] & FATTR4_WORD1_OWNER) {
char *ptr = &info->owner[0]; char *ptr = &info->owner[0];
if (!xdr_bytes(&localxdr, &ptr, &info->owner_len, uint32_t owner_len = strlen(info->owner);
if (!xdr_bytes(&localxdr, &ptr, &owner_len,
NFS4_OPAQUE_LIMIT)) NFS4_OPAQUE_LIMIT))
return FALSE; return FALSE;
attrs->attrmask.arr[1] |= FATTR4_WORD1_OWNER; attrs->attrmask.arr[1] |= FATTR4_WORD1_OWNER;
} }
if (info->attrmask.arr[1] & FATTR4_WORD1_OWNER_GROUP) { if (info->attrmask.arr[1] & FATTR4_WORD1_OWNER_GROUP) {
char *ptr = &info->owner_group[0]; char *ptr = &info->owner_group[0];
if (!xdr_bytes(&localxdr, &ptr, &info->owner_group_len, uint32_t owner_group_len = strlen(info->owner_group);
if (!xdr_bytes(&localxdr, &ptr, &owner_group_len,
NFS4_OPAQUE_LIMIT)) NFS4_OPAQUE_LIMIT))
return FALSE; return FALSE;
attrs->attrmask.arr[1] |= FATTR4_WORD1_OWNER_GROUP; attrs->attrmask.arr[1] |= FATTR4_WORD1_OWNER_GROUP;