]> Pileus Git - ~andy/linux/blobdiff - fs/nfsd/nfs3xdr.c
wil6210: use WLAN_CAPABILITY_DMG_TYPE_MASK
[~andy/linux] / fs / nfsd / nfs3xdr.c
index 324c0baf7cda30c0f6123417673dc395c8e292ff..14d9ecb96cff0ba476549467fbc321f94ea55ff3 100644 (file)
@@ -11,6 +11,7 @@
 #include "xdr3.h"
 #include "auth.h"
 #include "netns.h"
+#include "vfs.h"
 
 #define NFSDDBG_FACILITY               NFSDDBG_XDR
 
@@ -105,12 +106,14 @@ decode_sattr3(__be32 *p, struct iattr *iap)
                iap->ia_mode = ntohl(*p++);
        }
        if (*p++) {
-               iap->ia_valid |= ATTR_UID;
-               iap->ia_uid = ntohl(*p++);
+               iap->ia_uid = make_kuid(&init_user_ns, ntohl(*p++));
+               if (uid_valid(iap->ia_uid))
+                       iap->ia_valid |= ATTR_UID;
        }
        if (*p++) {
-               iap->ia_valid |= ATTR_GID;
-               iap->ia_gid = ntohl(*p++);
+               iap->ia_gid = make_kgid(&init_user_ns, ntohl(*p++));
+               if (gid_valid(iap->ia_gid))
+                       iap->ia_valid |= ATTR_GID;
        }
        if (*p++) {
                u64     newsize;
@@ -167,8 +170,8 @@ encode_fattr3(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp,
        *p++ = htonl(nfs3_ftypes[(stat->mode & S_IFMT) >> 12]);
        *p++ = htonl((u32) stat->mode);
        *p++ = htonl((u32) stat->nlink);
-       *p++ = htonl((u32) nfsd_ruid(rqstp, stat->uid));
-       *p++ = htonl((u32) nfsd_rgid(rqstp, stat->gid));
+       *p++ = htonl((u32) from_kuid(&init_user_ns, stat->uid));
+       *p++ = htonl((u32) from_kgid(&init_user_ns, stat->gid));
        if (S_ISLNK(stat->mode) && stat->size > NFS3_MAXPATHLEN) {
                p = xdr_encode_hyper(p, (u64) NFS3_MAXPATHLEN);
        } else {
@@ -204,10 +207,10 @@ encode_post_op_attr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp)
 {
        struct dentry *dentry = fhp->fh_dentry;
        if (dentry && dentry->d_inode) {
-               int err;
+               __be32 err;
                struct kstat stat;
 
-               err = vfs_getattr(fhp->fh_export->ex_path.mnt, dentry, &stat);
+               err = fh_getattr(fhp, &stat);
                if (!err) {
                        *p++ = xdr_one;         /* attributes follow */
                        lease_get_mtime(dentry->d_inode, &stat.mtime);
@@ -254,13 +257,12 @@ encode_wcc_data(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp)
  */
 void fill_post_wcc(struct svc_fh *fhp)
 {
-       int err;
+       __be32 err;
 
        if (fhp->fh_post_saved)
                printk("nfsd: inode locked twice during operation.\n");
 
-       err = vfs_getattr(fhp->fh_export->ex_path.mnt, fhp->fh_dentry,
-                       &fhp->fh_post_attr);
+       err = fh_getattr(fhp, &fhp->fh_post_attr);
        fhp->fh_post_change = fhp->fh_dentry->d_inode->i_version;
        if (err) {
                fhp->fh_post_saved = 0;