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  | 
