NFS: Squelch compiler warning in decode_getdeviceinfo()
[firefly-linux-kernel-4.4.55.git] / fs / nfs / nfs4xdr.c
index b7a204ff6fe1504efe287b7620532407cc692f89..a15fe99fea864f86dedf2513fe15bcb707c3c94d 100644 (file)
@@ -4475,7 +4475,7 @@ static int decode_read(struct xdr_stream *xdr, struct rpc_rqst *req, struct nfs_
                goto out_overflow;
        eof = be32_to_cpup(p++);
        count = be32_to_cpup(p);
-       hdrlen = (u8 *) p - (u8 *) iov->iov_base;
+       hdrlen = (u8 *) xdr->p - (u8 *) iov->iov_base;
        recvd = req->rq_rcv_buf.len - hdrlen;
        if (count > recvd) {
                dprintk("NFS: server cheating in read reply: "
@@ -5000,7 +5000,7 @@ static int decode_getdeviceinfo(struct xdr_stream *xdr,
                goto out_overflow;
        len = be32_to_cpup(p);
        if (len) {
-               int i;
+               uint32_t i;
 
                p = xdr_inline_decode(xdr, 4 * len);
                if (unlikely(!p))
@@ -6159,8 +6159,22 @@ out:
 }
 #endif /* CONFIG_NFS_V4_1 */
 
-__be32 *nfs4_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry,
-                          struct nfs_server *server, int plus)
+/**
+ * nfs4_decode_dirent - Decode a single NFSv4 directory entry stored in
+ *                      the local page cache.
+ * @xdr: XDR stream where entry resides
+ * @entry: buffer to fill in with entry data
+ * @plus: boolean indicating whether this should be a readdirplus entry
+ *
+ * Returns zero if successful, otherwise a negative errno value is
+ * returned.
+ *
+ * This function is not invoked during READDIR reply decoding, but
+ * rather whenever an application invokes the getdents(2) system call
+ * on a directory already in our cache.
+ */
+int nfs4_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry,
+                      int plus)
 {
        uint32_t bitmap[2] = {0};
        uint32_t len;
@@ -6172,9 +6186,9 @@ __be32 *nfs4_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry,
                if (unlikely(!p))
                        goto out_overflow;
                if (!ntohl(*p++))
-                       return ERR_PTR(-EAGAIN);
+                       return -EAGAIN;
                entry->eof = 1;
-               return ERR_PTR(-EBADCOOKIE);
+               return -EBADCOOKIE;
        }
 
        p = xdr_inline_decode(xdr, 12);
@@ -6203,11 +6217,16 @@ __be32 *nfs4_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry,
        if (decode_attr_length(xdr, &len, &p) < 0)
                goto out_overflow;
 
-       if (decode_getfattr_attrs(xdr, bitmap, entry->fattr, entry->fh, server, 1) < 0)
+       if (decode_getfattr_attrs(xdr, bitmap, entry->fattr, entry->fh,
+                                       entry->server, 1) < 0)
                goto out_overflow;
        if (entry->fattr->valid & NFS_ATTR_FATTR_FILEID)
                entry->ino = entry->fattr->fileid;
 
+       entry->d_type = DT_UNKNOWN;
+       if (entry->fattr->valid & NFS_ATTR_FATTR_TYPE)
+               entry->d_type = nfs_umode_to_dtype(entry->fattr->mode);
+
        if (verify_attr_len(xdr, p, len) < 0)
                goto out_overflow;
 
@@ -6217,11 +6236,11 @@ __be32 *nfs4_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry,
        else
                entry->eof = 0;
 
-       return p;
+       return 0;
 
 out_overflow:
        print_overflow_msg(__func__, xdr);
-       return ERR_PTR(-EIO);
+       return -EAGAIN;
 }
 
 /*
@@ -6297,8 +6316,8 @@ nfs4_stat_to_errno(int stat)
 #define PROC(proc, argtype, restype)                           \
 [NFSPROC4_CLNT_##proc] = {                                     \
        .p_proc   = NFSPROC4_COMPOUND,                          \
-       .p_encode = (kxdrproc_t) nfs4_xdr_##argtype,            \
-       .p_decode = (kxdrproc_t) nfs4_xdr_##restype,            \
+       .p_encode = (kxdrproc_t)nfs4_xdr_##argtype,             \
+       .p_decode = (kxdrproc_t)nfs4_xdr_##restype,             \
        .p_arglen = NFS4_##argtype##_sz,                        \
        .p_replen = NFS4_##restype##_sz,                        \
        .p_statidx = NFSPROC4_CLNT_##proc,                      \
@@ -6306,50 +6325,50 @@ nfs4_stat_to_errno(int stat)
 }
 
 struct rpc_procinfo    nfs4_procedures[] = {
-  PROC(READ,           enc_read,       dec_read),
-  PROC(WRITE,          enc_write,      dec_write),
-  PROC(COMMIT,         enc_commit,     dec_commit),
-  PROC(OPEN,           enc_open,       dec_open),
-  PROC(OPEN_CONFIRM,   enc_open_confirm,       dec_open_confirm),
-  PROC(OPEN_NOATTR,    enc_open_noattr,        dec_open_noattr),
-  PROC(OPEN_DOWNGRADE, enc_open_downgrade,     dec_open_downgrade),
-  PROC(CLOSE,          enc_close,      dec_close),
-  PROC(SETATTR,                enc_setattr,    dec_setattr),
-  PROC(FSINFO,         enc_fsinfo,     dec_fsinfo),
-  PROC(RENEW,          enc_renew,      dec_renew),
-  PROC(SETCLIENTID,    enc_setclientid,        dec_setclientid),
-  PROC(SETCLIENTID_CONFIRM,    enc_setclientid_confirm,        dec_setclientid_confirm),
-  PROC(LOCK,            enc_lock,       dec_lock),
-  PROC(LOCKT,           enc_lockt,      dec_lockt),
-  PROC(LOCKU,           enc_locku,      dec_locku),
-  PROC(ACCESS,         enc_access,     dec_access),
-  PROC(GETATTR,                enc_getattr,    dec_getattr),
-  PROC(LOOKUP,         enc_lookup,     dec_lookup),
-  PROC(LOOKUP_ROOT,    enc_lookup_root,        dec_lookup_root),
-  PROC(REMOVE,         enc_remove,     dec_remove),
-  PROC(RENAME,         enc_rename,     dec_rename),
-  PROC(LINK,           enc_link,       dec_link),
-  PROC(SYMLINK,                enc_symlink,    dec_symlink),
-  PROC(CREATE,         enc_create,     dec_create),
-  PROC(PATHCONF,       enc_pathconf,   dec_pathconf),
-  PROC(STATFS,         enc_statfs,     dec_statfs),
-  PROC(READLINK,       enc_readlink,   dec_readlink),
-  PROC(READDIR,                enc_readdir,    dec_readdir),
-  PROC(SERVER_CAPS,    enc_server_caps, dec_server_caps),
-  PROC(DELEGRETURN,    enc_delegreturn, dec_delegreturn),
-  PROC(GETACL,         enc_getacl,     dec_getacl),
-  PROC(SETACL,         enc_setacl,     dec_setacl),
-  PROC(FS_LOCATIONS,   enc_fs_locations, dec_fs_locations),
-  PROC(RELEASE_LOCKOWNER, enc_release_lockowner, dec_release_lockowner),
+       PROC(READ,              enc_read,               dec_read),
+       PROC(WRITE,             enc_write,              dec_write),
+       PROC(COMMIT,            enc_commit,             dec_commit),
+       PROC(OPEN,              enc_open,               dec_open),
+       PROC(OPEN_CONFIRM,      enc_open_confirm,       dec_open_confirm),
+       PROC(OPEN_NOATTR,       enc_open_noattr,        dec_open_noattr),
+       PROC(OPEN_DOWNGRADE,    enc_open_downgrade,     dec_open_downgrade),
+       PROC(CLOSE,             enc_close,              dec_close),
+       PROC(SETATTR,           enc_setattr,            dec_setattr),
+       PROC(FSINFO,            enc_fsinfo,             dec_fsinfo),
+       PROC(RENEW,             enc_renew,              dec_renew),
+       PROC(SETCLIENTID,       enc_setclientid,        dec_setclientid),
+       PROC(SETCLIENTID_CONFIRM, enc_setclientid_confirm, dec_setclientid_confirm),
+       PROC(LOCK,              enc_lock,               dec_lock),
+       PROC(LOCKT,             enc_lockt,              dec_lockt),
+       PROC(LOCKU,             enc_locku,              dec_locku),
+       PROC(ACCESS,            enc_access,             dec_access),
+       PROC(GETATTR,           enc_getattr,            dec_getattr),
+       PROC(LOOKUP,            enc_lookup,             dec_lookup),
+       PROC(LOOKUP_ROOT,       enc_lookup_root,        dec_lookup_root),
+       PROC(REMOVE,            enc_remove,             dec_remove),
+       PROC(RENAME,            enc_rename,             dec_rename),
+       PROC(LINK,              enc_link,               dec_link),
+       PROC(SYMLINK,           enc_symlink,            dec_symlink),
+       PROC(CREATE,            enc_create,             dec_create),
+       PROC(PATHCONF,          enc_pathconf,           dec_pathconf),
+       PROC(STATFS,            enc_statfs,             dec_statfs),
+       PROC(READLINK,          enc_readlink,           dec_readlink),
+       PROC(READDIR,           enc_readdir,            dec_readdir),
+       PROC(SERVER_CAPS,       enc_server_caps,        dec_server_caps),
+       PROC(DELEGRETURN,       enc_delegreturn,        dec_delegreturn),
+       PROC(GETACL,            enc_getacl,             dec_getacl),
+       PROC(SETACL,            enc_setacl,             dec_setacl),
+       PROC(FS_LOCATIONS,      enc_fs_locations,       dec_fs_locations),
+       PROC(RELEASE_LOCKOWNER, enc_release_lockowner,  dec_release_lockowner),
 #if defined(CONFIG_NFS_V4_1)
-  PROC(EXCHANGE_ID,    enc_exchange_id,        dec_exchange_id),
-  PROC(CREATE_SESSION, enc_create_session,     dec_create_session),
-  PROC(DESTROY_SESSION,        enc_destroy_session,    dec_destroy_session),
-  PROC(SEQUENCE,       enc_sequence,   dec_sequence),
-  PROC(GET_LEASE_TIME, enc_get_lease_time,     dec_get_lease_time),
-  PROC(RECLAIM_COMPLETE, enc_reclaim_complete,  dec_reclaim_complete),
-  PROC(GETDEVICEINFO, enc_getdeviceinfo, dec_getdeviceinfo),
-  PROC(LAYOUTGET,  enc_layoutget,     dec_layoutget),
+       PROC(EXCHANGE_ID,       enc_exchange_id,        dec_exchange_id),
+       PROC(CREATE_SESSION,    enc_create_session,     dec_create_session),
+       PROC(DESTROY_SESSION,   enc_destroy_session,    dec_destroy_session),
+       PROC(SEQUENCE,          enc_sequence,           dec_sequence),
+       PROC(GET_LEASE_TIME,    enc_get_lease_time,     dec_get_lease_time),
+       PROC(RECLAIM_COMPLETE,  enc_reclaim_complete,   dec_reclaim_complete),
+       PROC(GETDEVICEINFO,     enc_getdeviceinfo,      dec_getdeviceinfo),
+       PROC(LAYOUTGET,         enc_layoutget,          dec_layoutget),
 #endif /* CONFIG_NFS_V4_1 */
 };