diff options
-rw-r--r-- | xlators/nfs/server/src/acl3.c | 35 | ||||
-rw-r--r-- | xlators/nfs/server/src/acl3.h | 6 | ||||
-rw-r--r-- | xlators/nfs/server/src/nfs3-helpers.h | 3 | ||||
-rw-r--r-- | xlators/nfs/server/src/nfs3.h | 4 |
4 files changed, 38 insertions, 10 deletions
diff --git a/xlators/nfs/server/src/acl3.c b/xlators/nfs/server/src/acl3.c index 59c7637e3b4..5286077a891 100644 --- a/xlators/nfs/server/src/acl3.c +++ b/xlators/nfs/server/src/acl3.c @@ -66,7 +66,8 @@ nfs3_stat_to_fattr3 (struct iatt *buf); #define acl3_validate_gluster_fh(handle, status, errlabel) \ do { \ if (!nfs3_fh_validate (handle)) { \ - status = NFS3ERR_SERVERFAULT; \ + gf_log (GF_ACL, GF_LOG_ERROR, "Bad Handle"); \ + status = NFS3ERR_BADHANDLE; \ goto errlabel; \ } \ } while (0) \ @@ -321,6 +322,7 @@ acl3_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this, getaclreply *getaclreply = NULL; int ret = -1; nfs_user_t nfu = {0, }; + uint64_t deviceid = 0; if (!frame->local) { gf_log (GF_ACL, GF_LOG_ERROR, "Invalid argument," @@ -336,14 +338,18 @@ acl3_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this, goto err; } - getaclreply->attr_follows = 1; + /* Fill the attrs before xattrs */ + getaclreply->attr_follows = TRUE; + deviceid = nfs3_request_xlator_deviceid (cs->req); + nfs3_map_deviceid_to_statdev (buf, deviceid); getaclreply->attr = nfs3_stat_to_fattr3 (buf); - getaclreply->mask = 0xf; + getaclreply->mask = (NFS_ACL|NFS_ACLCNT|NFS_DFACL|NFS_DFACLCNT); + nfs_request_user_init (&nfu, cs->req); - ret = nfs_getxattr (cs->nfsx, cs->vol, &nfu, &cs->resolvedloc, NULL, NULL, - acl3_getacl_cbk, cs); - if (ret == -1) { - stat = nfs3_cbk_errno_status (op_ret, op_errno); + ret = nfs_getxattr (cs->nfsx, cs->vol, &nfu, &cs->resolvedloc, + NULL, NULL, acl3_getacl_cbk, cs); + if (ret < 0) { + stat = nfs3_errno_to_nfsstat3 (-ret); goto err; } return 0; @@ -409,6 +415,13 @@ acl3svc_getacl (rpcsvc_request_t *req) rpcsvc_request_seterr (req, GARBAGE_ARGS); goto rpcerr; } + + /* Validate ACL mask */ + if (getaclargs.mask & ~(NFS_ACL|NFS_ACLCNT|NFS_DFACL|NFS_DFACLCNT)) { + stat = NFS3ERR_INVAL; + goto acl3err; + } + fhp = &fh; acl3_validate_gluster_fh (&fh, stat, acl3err); acl3_map_fh_to_volume (nfs->nfs3state, fhp, req, @@ -470,11 +483,13 @@ acl3_setacl_resume (void *carg) nfs_request_user_init (&nfu, cs->req); xattr = dict_new(); if (cs->aclcount) - ret = dict_set_static_bin (xattr, POSIX_ACL_ACCESS_XATTR, cs->aclxattr, - cs->aclcount * 8 + 4); + ret = dict_set_static_bin (xattr, POSIX_ACL_ACCESS_XATTR, + cs->aclxattr, + posix_acl_xattr_size (cs->aclcount)); if (cs->daclcount) ret = dict_set_static_bin (xattr, POSIX_ACL_DEFAULT_XATTR, - cs->daclxattr, cs->daclcount * 8 + 4); + cs->daclxattr, + posix_acl_xattr_size (cs->daclcount)); ret = nfs_setxattr (cs->nfsx, cs->vol, &nfu, &cs->resolvedloc, xattr, 0, NULL, acl3_setacl_cbk, cs); diff --git a/xlators/nfs/server/src/acl3.h b/xlators/nfs/server/src/acl3.h index e0e61281a6c..03d626f3e00 100644 --- a/xlators/nfs/server/src/acl3.h +++ b/xlators/nfs/server/src/acl3.h @@ -16,6 +16,12 @@ #define GF_ACL3_PORT 38469 #define GF_ACL GF_NFS"-ACL" +/* Flags for the getacl/setacl mode */ +#define NFS_ACL 0x0001 +#define NFS_ACLCNT 0x0002 +#define NFS_DFACL 0x0004 +#define NFS_DFACLCNT 0x0008 + /* * NFSv3, identifies the default ACL by NFS_ACL_DEFAULT. Gluster * NFS needs to mask it OFF before sending it upto POSIX layer diff --git a/xlators/nfs/server/src/nfs3-helpers.h b/xlators/nfs/server/src/nfs3-helpers.h index 4de1d5623ee..eada242210d 100644 --- a/xlators/nfs/server/src/nfs3-helpers.h +++ b/xlators/nfs/server/src/nfs3-helpers.h @@ -334,4 +334,7 @@ nfs3_is_parentdir_entry (char *entry); uint32_t nfs3_request_to_accessbits (int32_t accbits); +void +nfs3_map_deviceid_to_statdev (struct iatt *ia, uint64_t deviceid); + #endif diff --git a/xlators/nfs/server/src/nfs3.h b/xlators/nfs/server/src/nfs3.h index 023b394cf5a..e64ef9d1591 100644 --- a/xlators/nfs/server/src/nfs3.h +++ b/xlators/nfs/server/src/nfs3.h @@ -280,4 +280,8 @@ nfs3svc_init (xlator_t *nfsx); extern int nfs3_reconfigure_state (xlator_t *nfsx, dict_t *options); + +extern uint64_t +nfs3_request_xlator_deviceid (rpcsvc_request_t *req); + #endif |