forked from Minki/linux
NFS: Fix the type of struct nfs_fattr->mode
There is no point in using anything other than umode_t, since we copy the content pretty much directly into inode->i_mode. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
1ca277d88d
commit
bca794785c
@ -156,7 +156,7 @@ int nfs4_path_walk(struct nfs_server *server,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fattr.type != NFDIR) {
|
if (!S_ISDIR(fattr.mode)) {
|
||||||
printk(KERN_ERR "nfs4_get_root:"
|
printk(KERN_ERR "nfs4_get_root:"
|
||||||
" getroot encountered non-directory\n");
|
" getroot encountered non-directory\n");
|
||||||
return -ENOTDIR;
|
return -ENOTDIR;
|
||||||
@ -213,7 +213,7 @@ eat_dot_dir:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fattr.type != NFDIR) {
|
if (!S_ISDIR(fattr.mode)) {
|
||||||
printk(KERN_ERR "nfs4_get_root:"
|
printk(KERN_ERR "nfs4_get_root:"
|
||||||
" lookupfh encountered non-directory\n");
|
" lookupfh encountered non-directory\n");
|
||||||
return -ENOTDIR;
|
return -ENOTDIR;
|
||||||
|
@ -120,8 +120,8 @@ xdr_decode_time(__be32 *p, struct timespec *timep)
|
|||||||
static __be32 *
|
static __be32 *
|
||||||
xdr_decode_fattr(__be32 *p, struct nfs_fattr *fattr)
|
xdr_decode_fattr(__be32 *p, struct nfs_fattr *fattr)
|
||||||
{
|
{
|
||||||
u32 rdev;
|
u32 rdev, type;
|
||||||
fattr->type = (enum nfs_ftype) ntohl(*p++);
|
type = ntohl(*p++);
|
||||||
fattr->mode = ntohl(*p++);
|
fattr->mode = ntohl(*p++);
|
||||||
fattr->nlink = ntohl(*p++);
|
fattr->nlink = ntohl(*p++);
|
||||||
fattr->uid = ntohl(*p++);
|
fattr->uid = ntohl(*p++);
|
||||||
@ -138,8 +138,7 @@ xdr_decode_fattr(__be32 *p, struct nfs_fattr *fattr)
|
|||||||
p = xdr_decode_time(p, &fattr->ctime);
|
p = xdr_decode_time(p, &fattr->ctime);
|
||||||
fattr->valid |= NFS_ATTR_FATTR_V2;
|
fattr->valid |= NFS_ATTR_FATTR_V2;
|
||||||
fattr->rdev = new_decode_dev(rdev);
|
fattr->rdev = new_decode_dev(rdev);
|
||||||
if (fattr->type == NFCHR && rdev == NFS2_FIFO_DEV) {
|
if (type == NFCHR && rdev == NFS2_FIFO_DEV) {
|
||||||
fattr->type = NFFIFO;
|
|
||||||
fattr->mode = (fattr->mode & ~S_IFMT) | S_IFIFO;
|
fattr->mode = (fattr->mode & ~S_IFMT) | S_IFIFO;
|
||||||
fattr->rdev = 0;
|
fattr->rdev = 0;
|
||||||
}
|
}
|
||||||
|
@ -91,19 +91,15 @@
|
|||||||
/*
|
/*
|
||||||
* Map file type to S_IFMT bits
|
* Map file type to S_IFMT bits
|
||||||
*/
|
*/
|
||||||
static struct {
|
static const umode_t nfs_type2fmt[] = {
|
||||||
unsigned int mode;
|
[NF3BAD] = 0,
|
||||||
unsigned int nfs2type;
|
[NF3REG] = S_IFREG,
|
||||||
} nfs_type2fmt[] = {
|
[NF3DIR] = S_IFDIR,
|
||||||
{ 0, NFNON },
|
[NF3BLK] = S_IFBLK,
|
||||||
{ S_IFREG, NFREG },
|
[NF3CHR] = S_IFCHR,
|
||||||
{ S_IFDIR, NFDIR },
|
[NF3LNK] = S_IFLNK,
|
||||||
{ S_IFBLK, NFBLK },
|
[NF3SOCK] = S_IFSOCK,
|
||||||
{ S_IFCHR, NFCHR },
|
[NF3FIFO] = S_IFIFO,
|
||||||
{ S_IFLNK, NFLNK },
|
|
||||||
{ S_IFSOCK, NFSOCK },
|
|
||||||
{ S_IFIFO, NFFIFO },
|
|
||||||
{ 0, NFBAD }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -148,13 +144,12 @@ static __be32 *
|
|||||||
xdr_decode_fattr(__be32 *p, struct nfs_fattr *fattr)
|
xdr_decode_fattr(__be32 *p, struct nfs_fattr *fattr)
|
||||||
{
|
{
|
||||||
unsigned int type, major, minor;
|
unsigned int type, major, minor;
|
||||||
int fmode;
|
umode_t fmode;
|
||||||
|
|
||||||
type = ntohl(*p++);
|
type = ntohl(*p++);
|
||||||
if (type >= NF3BAD)
|
if (type > NF3FIFO)
|
||||||
type = NF3BAD;
|
type = NF3NON;
|
||||||
fmode = nfs_type2fmt[type].mode;
|
fmode = nfs_type2fmt[type];
|
||||||
fattr->type = nfs_type2fmt[type].nfs2type;
|
|
||||||
fattr->mode = (ntohl(*p++) & ~S_IFMT) | fmode;
|
fattr->mode = (ntohl(*p++) & ~S_IFMT) | fmode;
|
||||||
fattr->nlink = ntohl(*p++);
|
fattr->nlink = ntohl(*p++);
|
||||||
fattr->uid = ntohl(*p++);
|
fattr->uid = ntohl(*p++);
|
||||||
|
@ -522,20 +522,17 @@ static int nfs4_stat_to_errno(int);
|
|||||||
decode_lookup_maxsz + \
|
decode_lookup_maxsz + \
|
||||||
decode_fs_locations_maxsz)
|
decode_fs_locations_maxsz)
|
||||||
|
|
||||||
static struct {
|
static const umode_t nfs_type2fmt[] = {
|
||||||
unsigned int mode;
|
[NF4BAD] = 0,
|
||||||
unsigned int nfs2type;
|
[NF4REG] = S_IFREG,
|
||||||
} nfs_type2fmt[] = {
|
[NF4DIR] = S_IFDIR,
|
||||||
{ 0, NFNON },
|
[NF4BLK] = S_IFBLK,
|
||||||
{ S_IFREG, NFREG },
|
[NF4CHR] = S_IFCHR,
|
||||||
{ S_IFDIR, NFDIR },
|
[NF4LNK] = S_IFLNK,
|
||||||
{ S_IFBLK, NFBLK },
|
[NF4SOCK] = S_IFSOCK,
|
||||||
{ S_IFCHR, NFCHR },
|
[NF4FIFO] = S_IFIFO,
|
||||||
{ S_IFLNK, NFLNK },
|
[NF4ATTRDIR] = 0,
|
||||||
{ S_IFSOCK, NFSOCK },
|
[NF4NAMEDATTR] = 0,
|
||||||
{ S_IFIFO, NFFIFO },
|
|
||||||
{ 0, NFNON },
|
|
||||||
{ 0, NFNON },
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct compound_hdr {
|
struct compound_hdr {
|
||||||
@ -2173,7 +2170,7 @@ static int decode_attr_type(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *
|
|||||||
}
|
}
|
||||||
bitmap[0] &= ~FATTR4_WORD0_TYPE;
|
bitmap[0] &= ~FATTR4_WORD0_TYPE;
|
||||||
}
|
}
|
||||||
dprintk("%s: type=0%o\n", __func__, nfs_type2fmt[*type].nfs2type);
|
dprintk("%s: type=0%o\n", __func__, nfs_type2fmt[*type]);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2580,8 +2577,9 @@ static int decode_attr_maxwrite(struct xdr_stream *xdr, uint32_t *bitmap, uint32
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int decode_attr_mode(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *mode)
|
static int decode_attr_mode(struct xdr_stream *xdr, uint32_t *bitmap, umode_t *mode)
|
||||||
{
|
{
|
||||||
|
uint32_t tmp;
|
||||||
__be32 *p;
|
__be32 *p;
|
||||||
|
|
||||||
*mode = 0;
|
*mode = 0;
|
||||||
@ -2589,8 +2587,8 @@ static int decode_attr_mode(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *
|
|||||||
return -EIO;
|
return -EIO;
|
||||||
if (likely(bitmap[1] & FATTR4_WORD1_MODE)) {
|
if (likely(bitmap[1] & FATTR4_WORD1_MODE)) {
|
||||||
READ_BUF(4);
|
READ_BUF(4);
|
||||||
READ32(*mode);
|
READ32(tmp);
|
||||||
*mode &= ~S_IFMT;
|
*mode = tmp & ~S_IFMT;
|
||||||
bitmap[1] &= ~FATTR4_WORD1_MODE;
|
bitmap[1] &= ~FATTR4_WORD1_MODE;
|
||||||
}
|
}
|
||||||
dprintk("%s: file mode=0%o\n", __func__, (unsigned int)*mode);
|
dprintk("%s: file mode=0%o\n", __func__, (unsigned int)*mode);
|
||||||
@ -2994,7 +2992,8 @@ static int decode_getfattr(struct xdr_stream *xdr, struct nfs_fattr *fattr, cons
|
|||||||
uint32_t attrlen,
|
uint32_t attrlen,
|
||||||
bitmap[2] = {0},
|
bitmap[2] = {0},
|
||||||
type;
|
type;
|
||||||
int status, fmode = 0;
|
int status;
|
||||||
|
umode_t fmode = 0;
|
||||||
uint64_t fileid;
|
uint64_t fileid;
|
||||||
|
|
||||||
if ((status = decode_op_hdr(xdr, OP_GETATTR)) != 0)
|
if ((status = decode_op_hdr(xdr, OP_GETATTR)) != 0)
|
||||||
@ -3008,8 +3007,7 @@ static int decode_getfattr(struct xdr_stream *xdr, struct nfs_fattr *fattr, cons
|
|||||||
|
|
||||||
if ((status = decode_attr_type(xdr, bitmap, &type)) != 0)
|
if ((status = decode_attr_type(xdr, bitmap, &type)) != 0)
|
||||||
goto xdr_error;
|
goto xdr_error;
|
||||||
fattr->type = nfs_type2fmt[type].nfs2type;
|
fattr->mode = nfs_type2fmt[type];
|
||||||
fattr->mode = nfs_type2fmt[type].mode;
|
|
||||||
|
|
||||||
if ((status = decode_attr_change(xdr, bitmap, &fattr->change_attr)) != 0)
|
if ((status = decode_attr_change(xdr, bitmap, &fattr->change_attr)) != 0)
|
||||||
goto xdr_error;
|
goto xdr_error;
|
||||||
|
@ -28,8 +28,7 @@ static inline int nfs_fsid_equal(const struct nfs_fsid *a, const struct nfs_fsid
|
|||||||
|
|
||||||
struct nfs_fattr {
|
struct nfs_fattr {
|
||||||
unsigned int valid; /* which fields are valid */
|
unsigned int valid; /* which fields are valid */
|
||||||
enum nfs_ftype type; /* always use NFSv2 types */
|
umode_t mode;
|
||||||
__u32 mode;
|
|
||||||
__u32 nlink;
|
__u32 nlink;
|
||||||
__u32 uid;
|
__u32 uid;
|
||||||
__u32 gid;
|
__u32 gid;
|
||||||
|
Loading…
Reference in New Issue
Block a user