[XFS] remove struct vnode::v_type
SGI-PV: 936236 SGI-Modid: xfs-linux:xfs-kern:195878a Signed-off-by: Christoph Hellwig <hch@sgi.com> Signed-off-by: Nathan Scott <nathans@sgi.com>
This commit is contained in:
committed by
Nathan Scott
parent
155ffd075c
commit
0432dab2d2
@@ -141,13 +141,19 @@ xfs_find_handle(
|
|||||||
return -XFS_ERROR(EINVAL);
|
return -XFS_ERROR(EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* we need the vnode */
|
switch (inode->i_mode & S_IFMT) {
|
||||||
vp = LINVFS_GET_VP(inode);
|
case S_IFREG:
|
||||||
if (vp->v_type != VREG && vp->v_type != VDIR && vp->v_type != VLNK) {
|
case S_IFDIR:
|
||||||
|
case S_IFLNK:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
iput(inode);
|
iput(inode);
|
||||||
return -XFS_ERROR(EBADF);
|
return -XFS_ERROR(EBADF);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* we need the vnode */
|
||||||
|
vp = LINVFS_GET_VP(inode);
|
||||||
|
|
||||||
/* now we can grab the fsid */
|
/* now we can grab the fsid */
|
||||||
memcpy(&handle.ha_fsid, vp->v_vfsp->vfs_altfsid, sizeof(xfs_fsid_t));
|
memcpy(&handle.ha_fsid, vp->v_vfsp->vfs_altfsid, sizeof(xfs_fsid_t));
|
||||||
hsize = sizeof(xfs_fsid_t);
|
hsize = sizeof(xfs_fsid_t);
|
||||||
@@ -386,7 +392,7 @@ xfs_readlink_by_handle(
|
|||||||
return -error;
|
return -error;
|
||||||
|
|
||||||
/* Restrict this handle operation to symlinks only. */
|
/* Restrict this handle operation to symlinks only. */
|
||||||
if (vp->v_type != VLNK) {
|
if (!S_ISLNK(inode->i_mode)) {
|
||||||
VN_RELE(vp);
|
VN_RELE(vp);
|
||||||
return -XFS_ERROR(EINVAL);
|
return -XFS_ERROR(EINVAL);
|
||||||
}
|
}
|
||||||
@@ -985,7 +991,7 @@ xfs_ioc_space(
|
|||||||
if (!(filp->f_mode & FMODE_WRITE))
|
if (!(filp->f_mode & FMODE_WRITE))
|
||||||
return -XFS_ERROR(EBADF);
|
return -XFS_ERROR(EBADF);
|
||||||
|
|
||||||
if (vp->v_type != VREG)
|
if (!VN_ISREG(vp))
|
||||||
return -XFS_ERROR(EINVAL);
|
return -XFS_ERROR(EINVAL);
|
||||||
|
|
||||||
if (copy_from_user(&bf, arg, sizeof(bf)))
|
if (copy_from_user(&bf, arg, sizeof(bf)))
|
||||||
|
@@ -140,7 +140,6 @@ linvfs_mknod(
|
|||||||
|
|
||||||
memset(&va, 0, sizeof(va));
|
memset(&va, 0, sizeof(va));
|
||||||
va.va_mask = XFS_AT_TYPE|XFS_AT_MODE;
|
va.va_mask = XFS_AT_TYPE|XFS_AT_MODE;
|
||||||
va.va_type = IFTOVT(mode);
|
|
||||||
va.va_mode = mode;
|
va.va_mode = mode;
|
||||||
|
|
||||||
switch (mode & S_IFMT) {
|
switch (mode & S_IFMT) {
|
||||||
@@ -308,14 +307,13 @@ linvfs_symlink(
|
|||||||
cvp = NULL;
|
cvp = NULL;
|
||||||
|
|
||||||
memset(&va, 0, sizeof(va));
|
memset(&va, 0, sizeof(va));
|
||||||
va.va_type = VLNK;
|
va.va_mode = S_IFLNK |
|
||||||
va.va_mode = irix_symlink_mode ? 0777 & ~current->fs->umask : S_IRWXUGO;
|
(irix_symlink_mode ? 0777 & ~current->fs->umask : S_IRWXUGO);
|
||||||
va.va_mask = XFS_AT_TYPE|XFS_AT_MODE;
|
va.va_mask = XFS_AT_TYPE|XFS_AT_MODE;
|
||||||
|
|
||||||
error = 0;
|
error = 0;
|
||||||
VOP_SYMLINK(dvp, dentry, &va, (char *)symname, &cvp, NULL, error);
|
VOP_SYMLINK(dvp, dentry, &va, (char *)symname, &cvp, NULL, error);
|
||||||
if (!error && cvp) {
|
if (!error && cvp) {
|
||||||
ASSERT(cvp->v_type == VLNK);
|
|
||||||
ip = LINVFS_GET_IP(cvp);
|
ip = LINVFS_GET_IP(cvp);
|
||||||
d_instantiate(dentry, ip);
|
d_instantiate(dentry, ip);
|
||||||
validate_fields(dir);
|
validate_fields(dir);
|
||||||
|
@@ -138,24 +138,25 @@ STATIC __inline__ void
|
|||||||
xfs_set_inodeops(
|
xfs_set_inodeops(
|
||||||
struct inode *inode)
|
struct inode *inode)
|
||||||
{
|
{
|
||||||
vnode_t *vp = LINVFS_GET_VP(inode);
|
switch (inode->i_mode & S_IFMT) {
|
||||||
|
case S_IFREG:
|
||||||
if (vp->v_type == VNON) {
|
|
||||||
vn_mark_bad(vp);
|
|
||||||
} else if (S_ISREG(inode->i_mode)) {
|
|
||||||
inode->i_op = &linvfs_file_inode_operations;
|
inode->i_op = &linvfs_file_inode_operations;
|
||||||
inode->i_fop = &linvfs_file_operations;
|
inode->i_fop = &linvfs_file_operations;
|
||||||
inode->i_mapping->a_ops = &linvfs_aops;
|
inode->i_mapping->a_ops = &linvfs_aops;
|
||||||
} else if (S_ISDIR(inode->i_mode)) {
|
break;
|
||||||
|
case S_IFDIR:
|
||||||
inode->i_op = &linvfs_dir_inode_operations;
|
inode->i_op = &linvfs_dir_inode_operations;
|
||||||
inode->i_fop = &linvfs_dir_operations;
|
inode->i_fop = &linvfs_dir_operations;
|
||||||
} else if (S_ISLNK(inode->i_mode)) {
|
break;
|
||||||
|
case S_IFLNK:
|
||||||
inode->i_op = &linvfs_symlink_inode_operations;
|
inode->i_op = &linvfs_symlink_inode_operations;
|
||||||
if (inode->i_blocks)
|
if (inode->i_blocks)
|
||||||
inode->i_mapping->a_ops = &linvfs_aops;
|
inode->i_mapping->a_ops = &linvfs_aops;
|
||||||
} else {
|
break;
|
||||||
|
default:
|
||||||
inode->i_op = &linvfs_file_inode_operations;
|
inode->i_op = &linvfs_file_inode_operations;
|
||||||
init_special_inode(inode, inode->i_mode, inode->i_rdev);
|
init_special_inode(inode, inode->i_mode, inode->i_rdev);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -167,16 +168,23 @@ xfs_revalidate_inode(
|
|||||||
{
|
{
|
||||||
struct inode *inode = LINVFS_GET_IP(vp);
|
struct inode *inode = LINVFS_GET_IP(vp);
|
||||||
|
|
||||||
inode->i_mode = (ip->i_d.di_mode & MODEMASK) | VTTOIF(vp->v_type);
|
inode->i_mode = ip->i_d.di_mode;
|
||||||
inode->i_nlink = ip->i_d.di_nlink;
|
inode->i_nlink = ip->i_d.di_nlink;
|
||||||
inode->i_uid = ip->i_d.di_uid;
|
inode->i_uid = ip->i_d.di_uid;
|
||||||
inode->i_gid = ip->i_d.di_gid;
|
inode->i_gid = ip->i_d.di_gid;
|
||||||
if (((1 << vp->v_type) & ((1<<VBLK) | (1<<VCHR))) == 0) {
|
|
||||||
|
switch (inode->i_mode & S_IFMT) {
|
||||||
|
case S_IFBLK:
|
||||||
|
case S_IFCHR:
|
||||||
|
inode->i_rdev =
|
||||||
|
MKDEV(sysv_major(ip->i_df.if_u2.if_rdev) & 0x1ff,
|
||||||
|
sysv_minor(ip->i_df.if_u2.if_rdev));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
inode->i_rdev = 0;
|
inode->i_rdev = 0;
|
||||||
} else {
|
break;
|
||||||
xfs_dev_t dev = ip->i_df.if_u2.if_rdev;
|
|
||||||
inode->i_rdev = MKDEV(sysv_major(dev) & 0x1ff, sysv_minor(dev));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inode->i_blksize = PAGE_CACHE_SIZE;
|
inode->i_blksize = PAGE_CACHE_SIZE;
|
||||||
inode->i_generation = ip->i_d.di_gen;
|
inode->i_generation = ip->i_d.di_gen;
|
||||||
i_size_write(inode, ip->i_d.di_size);
|
i_size_write(inode, ip->i_d.di_size);
|
||||||
@@ -231,7 +239,6 @@ xfs_initialize_vnode(
|
|||||||
* finish our work.
|
* finish our work.
|
||||||
*/
|
*/
|
||||||
if (ip->i_d.di_mode != 0 && unlock && (inode->i_state & I_NEW)) {
|
if (ip->i_d.di_mode != 0 && unlock && (inode->i_state & I_NEW)) {
|
||||||
vp->v_type = IFTOVT(ip->i_d.di_mode);
|
|
||||||
xfs_revalidate_inode(XFS_BHVTOM(bdp), vp, ip);
|
xfs_revalidate_inode(XFS_BHVTOM(bdp), vp, ip);
|
||||||
xfs_set_inodeops(inode);
|
xfs_set_inodeops(inode);
|
||||||
|
|
||||||
|
@@ -44,19 +44,6 @@ DEFINE_SPINLOCK(vnumber_lock);
|
|||||||
#define vptosync(v) (&vsync[((unsigned long)v) % NVSYNC])
|
#define vptosync(v) (&vsync[((unsigned long)v) % NVSYNC])
|
||||||
sv_t vsync[NVSYNC];
|
sv_t vsync[NVSYNC];
|
||||||
|
|
||||||
/*
|
|
||||||
* Translate stat(2) file types to vnode types and vice versa.
|
|
||||||
* Aware of numeric order of S_IFMT and vnode type values.
|
|
||||||
*/
|
|
||||||
enum vtype iftovt_tab[] = {
|
|
||||||
VNON, VFIFO, VCHR, VNON, VDIR, VNON, VBLK, VNON,
|
|
||||||
VREG, VNON, VLNK, VNON, VSOCK, VNON, VNON, VNON
|
|
||||||
};
|
|
||||||
|
|
||||||
u_short vttoif_tab[] = {
|
|
||||||
0, S_IFREG, S_IFDIR, S_IFBLK, S_IFCHR, S_IFLNK, S_IFIFO, 0, S_IFSOCK
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
vn_init(void)
|
vn_init(void)
|
||||||
@@ -95,7 +82,6 @@ vn_reclaim(
|
|||||||
vp->v_flag &= (VRECLM|VWAIT);
|
vp->v_flag &= (VRECLM|VWAIT);
|
||||||
VN_UNLOCK(vp, 0);
|
VN_UNLOCK(vp, 0);
|
||||||
|
|
||||||
vp->v_type = VNON;
|
|
||||||
vp->v_fbhv = NULL;
|
vp->v_fbhv = NULL;
|
||||||
|
|
||||||
#ifdef XFS_VNODE_TRACE
|
#ifdef XFS_VNODE_TRACE
|
||||||
@@ -174,7 +160,7 @@ vn_revalidate_core(
|
|||||||
{
|
{
|
||||||
struct inode *inode = LINVFS_GET_IP(vp);
|
struct inode *inode = LINVFS_GET_IP(vp);
|
||||||
|
|
||||||
inode->i_mode = VTTOIF(vap->va_type) | vap->va_mode;
|
inode->i_mode = vap->va_mode;
|
||||||
inode->i_nlink = vap->va_nlink;
|
inode->i_nlink = vap->va_nlink;
|
||||||
inode->i_uid = vap->va_uid;
|
inode->i_uid = vap->va_uid;
|
||||||
inode->i_gid = vap->va_gid;
|
inode->i_gid = vap->va_gid;
|
||||||
|
@@ -65,10 +65,6 @@ struct vattr;
|
|||||||
struct xfs_iomap;
|
struct xfs_iomap;
|
||||||
struct attrlist_cursor_kern;
|
struct attrlist_cursor_kern;
|
||||||
|
|
||||||
/*
|
|
||||||
* Vnode types. VNON means no type.
|
|
||||||
*/
|
|
||||||
enum vtype { VNON, VREG, VDIR, VBLK, VCHR, VLNK, VFIFO, VBAD, VSOCK };
|
|
||||||
|
|
||||||
typedef xfs_ino_t vnumber_t;
|
typedef xfs_ino_t vnumber_t;
|
||||||
typedef struct dentry vname_t;
|
typedef struct dentry vname_t;
|
||||||
@@ -77,11 +73,9 @@ typedef bhv_head_t vn_bhv_head_t;
|
|||||||
/*
|
/*
|
||||||
* MP locking protocols:
|
* MP locking protocols:
|
||||||
* v_flag, v_vfsp VN_LOCK/VN_UNLOCK
|
* v_flag, v_vfsp VN_LOCK/VN_UNLOCK
|
||||||
* v_type read-only or fs-dependent
|
|
||||||
*/
|
*/
|
||||||
typedef struct vnode {
|
typedef struct vnode {
|
||||||
__u32 v_flag; /* vnode flags (see below) */
|
__u32 v_flag; /* vnode flags (see below) */
|
||||||
enum vtype v_type; /* vnode type */
|
|
||||||
struct vfs *v_vfsp; /* ptr to containing VFS */
|
struct vfs *v_vfsp; /* ptr to containing VFS */
|
||||||
vnumber_t v_number; /* in-core vnode number */
|
vnumber_t v_number; /* in-core vnode number */
|
||||||
vn_bhv_head_t v_bh; /* behavior head */
|
vn_bhv_head_t v_bh; /* behavior head */
|
||||||
@@ -93,6 +87,12 @@ typedef struct vnode {
|
|||||||
/* inode MUST be last */
|
/* inode MUST be last */
|
||||||
} vnode_t;
|
} vnode_t;
|
||||||
|
|
||||||
|
#define VN_ISLNK(vp) S_ISLNK((vp)->v_inode.i_mode)
|
||||||
|
#define VN_ISREG(vp) S_ISREG((vp)->v_inode.i_mode)
|
||||||
|
#define VN_ISDIR(vp) S_ISDIR((vp)->v_inode.i_mode)
|
||||||
|
#define VN_ISCHR(vp) S_ISCHR((vp)->v_inode.i_mode)
|
||||||
|
#define VN_ISBLK(vp) S_ISBLK((vp)->v_inode.i_mode)
|
||||||
|
|
||||||
#define v_fbhv v_bh.bh_first /* first behavior */
|
#define v_fbhv v_bh.bh_first /* first behavior */
|
||||||
#define v_fops v_bh.bh_first->bd_ops /* first behavior ops */
|
#define v_fops v_bh.bh_first->bd_ops /* first behavior ops */
|
||||||
|
|
||||||
@@ -132,17 +132,6 @@ typedef enum {
|
|||||||
#define LINVFS_GET_VP(inode) ((vnode_t *)list_entry(inode, vnode_t, v_inode))
|
#define LINVFS_GET_VP(inode) ((vnode_t *)list_entry(inode, vnode_t, v_inode))
|
||||||
#define LINVFS_GET_IP(vp) (&(vp)->v_inode)
|
#define LINVFS_GET_IP(vp) (&(vp)->v_inode)
|
||||||
|
|
||||||
/*
|
|
||||||
* Convert between vnode types and inode formats (since POSIX.1
|
|
||||||
* defines mode word of stat structure in terms of inode formats).
|
|
||||||
*/
|
|
||||||
extern enum vtype iftovt_tab[];
|
|
||||||
extern u_short vttoif_tab[];
|
|
||||||
#define IFTOVT(mode) (iftovt_tab[((mode) & S_IFMT) >> 12])
|
|
||||||
#define VTTOIF(indx) (vttoif_tab[(int)(indx)])
|
|
||||||
#define MAKEIMODE(indx, mode) (int)(VTTOIF(indx) | (mode))
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Vnode flags.
|
* Vnode flags.
|
||||||
*/
|
*/
|
||||||
@@ -408,7 +397,6 @@ typedef struct vnodeops {
|
|||||||
*/
|
*/
|
||||||
typedef struct vattr {
|
typedef struct vattr {
|
||||||
int va_mask; /* bit-mask of attributes present */
|
int va_mask; /* bit-mask of attributes present */
|
||||||
enum vtype va_type; /* vnode type (for create) */
|
|
||||||
mode_t va_mode; /* file access mode and type */
|
mode_t va_mode; /* file access mode and type */
|
||||||
xfs_nlink_t va_nlink; /* number of references to file */
|
xfs_nlink_t va_nlink; /* number of references to file */
|
||||||
uid_t va_uid; /* owner user id */
|
uid_t va_uid; /* owner user id */
|
||||||
@@ -498,7 +486,7 @@ typedef struct vattr {
|
|||||||
* Check whether mandatory file locking is enabled.
|
* Check whether mandatory file locking is enabled.
|
||||||
*/
|
*/
|
||||||
#define MANDLOCK(vp, mode) \
|
#define MANDLOCK(vp, mode) \
|
||||||
((vp)->v_type == VREG && ((mode) & (VSGID|(VEXEC>>3))) == VSGID)
|
(VN_ISREG(vp) && ((mode) & (VSGID|(VEXEC>>3))) == VSGID)
|
||||||
|
|
||||||
extern void vn_init(void);
|
extern void vn_init(void);
|
||||||
extern int vn_wait(struct vnode *);
|
extern int vn_wait(struct vnode *);
|
||||||
|
@@ -85,7 +85,7 @@ xfs_acl_vhasacl_default(
|
|||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
if (vp->v_type != VDIR)
|
if (!VN_ISDIR(vp))
|
||||||
return 0;
|
return 0;
|
||||||
xfs_acl_get_attr(vp, NULL, _ACL_TYPE_DEFAULT, ATTR_KERNOVAL, &error);
|
xfs_acl_get_attr(vp, NULL, _ACL_TYPE_DEFAULT, ATTR_KERNOVAL, &error);
|
||||||
return (error == 0);
|
return (error == 0);
|
||||||
@@ -389,7 +389,7 @@ xfs_acl_allow_set(
|
|||||||
|
|
||||||
if (vp->v_inode.i_flags & (S_IMMUTABLE|S_APPEND))
|
if (vp->v_inode.i_flags & (S_IMMUTABLE|S_APPEND))
|
||||||
return EPERM;
|
return EPERM;
|
||||||
if (kind == _ACL_TYPE_DEFAULT && vp->v_type != VDIR)
|
if (kind == _ACL_TYPE_DEFAULT && !VN_ISDIR(vp))
|
||||||
return ENOTDIR;
|
return ENOTDIR;
|
||||||
if (vp->v_vfsp->vfs_flag & VFS_RDONLY)
|
if (vp->v_vfsp->vfs_flag & VFS_RDONLY)
|
||||||
return EROFS;
|
return EROFS;
|
||||||
@@ -750,7 +750,7 @@ xfs_acl_inherit(
|
|||||||
* If the new file is a directory, its default ACL is a copy of
|
* If the new file is a directory, its default ACL is a copy of
|
||||||
* the containing directory's default ACL.
|
* the containing directory's default ACL.
|
||||||
*/
|
*/
|
||||||
if (vp->v_type == VDIR)
|
if (VN_ISDIR(vp))
|
||||||
xfs_acl_set_attr(vp, pdaclp, _ACL_TYPE_DEFAULT, &error);
|
xfs_acl_set_attr(vp, pdaclp, _ACL_TYPE_DEFAULT, &error);
|
||||||
if (!error && !basicperms)
|
if (!error && !basicperms)
|
||||||
xfs_acl_set_attr(vp, cacl, _ACL_TYPE_ACCESS, &error);
|
xfs_acl_set_attr(vp, cacl, _ACL_TYPE_ACCESS, &error);
|
||||||
|
@@ -1128,7 +1128,6 @@ xfs_ialloc(
|
|||||||
ASSERT(ip != NULL);
|
ASSERT(ip != NULL);
|
||||||
|
|
||||||
vp = XFS_ITOV(ip);
|
vp = XFS_ITOV(ip);
|
||||||
vp->v_type = IFTOVT(mode);
|
|
||||||
ip->i_d.di_mode = (__uint16_t)mode;
|
ip->i_d.di_mode = (__uint16_t)mode;
|
||||||
ip->i_d.di_onlink = 0;
|
ip->i_d.di_onlink = 0;
|
||||||
ip->i_d.di_nlink = nlink;
|
ip->i_d.di_nlink = nlink;
|
||||||
@@ -1250,7 +1249,7 @@ xfs_ialloc(
|
|||||||
*/
|
*/
|
||||||
xfs_trans_log_inode(tp, ip, flags);
|
xfs_trans_log_inode(tp, ip, flags);
|
||||||
|
|
||||||
/* now that we have a v_type we can set Linux inode ops (& unlock) */
|
/* now that we have an i_mode we can set Linux inode ops (& unlock) */
|
||||||
VFS_INIT_VNODE(XFS_MTOVFS(tp->t_mountp), vp, XFS_ITOBHV(ip), 1);
|
VFS_INIT_VNODE(XFS_MTOVFS(tp->t_mountp), vp, XFS_ITOBHV(ip), 1);
|
||||||
|
|
||||||
*ipp = ip;
|
*ipp = ip;
|
||||||
|
@@ -104,7 +104,7 @@ xfs_open(
|
|||||||
* If it's a directory with any blocks, read-ahead block 0
|
* If it's a directory with any blocks, read-ahead block 0
|
||||||
* as we're almost certain to have the next operation be a read there.
|
* as we're almost certain to have the next operation be a read there.
|
||||||
*/
|
*/
|
||||||
if (vp->v_type == VDIR && ip->i_d.di_nextents > 0) {
|
if (VN_ISDIR(vp) && ip->i_d.di_nextents > 0) {
|
||||||
mode = xfs_ilock_map_shared(ip);
|
mode = xfs_ilock_map_shared(ip);
|
||||||
if (ip->i_d.di_nextents > 0)
|
if (ip->i_d.di_nextents > 0)
|
||||||
(void)xfs_da_reada_buf(NULL, ip, 0, XFS_DATA_FORK);
|
(void)xfs_da_reada_buf(NULL, ip, 0, XFS_DATA_FORK);
|
||||||
@@ -163,18 +163,21 @@ xfs_getattr(
|
|||||||
/*
|
/*
|
||||||
* Copy from in-core inode.
|
* Copy from in-core inode.
|
||||||
*/
|
*/
|
||||||
vap->va_type = vp->v_type;
|
vap->va_mode = ip->i_d.di_mode;
|
||||||
vap->va_mode = ip->i_d.di_mode & MODEMASK;
|
|
||||||
vap->va_uid = ip->i_d.di_uid;
|
vap->va_uid = ip->i_d.di_uid;
|
||||||
vap->va_gid = ip->i_d.di_gid;
|
vap->va_gid = ip->i_d.di_gid;
|
||||||
vap->va_projid = ip->i_d.di_projid;
|
vap->va_projid = ip->i_d.di_projid;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check vnode type block/char vs. everything else.
|
* Check vnode type block/char vs. everything else.
|
||||||
* Do it with bitmask because that's faster than looking
|
|
||||||
* for multiple values individually.
|
|
||||||
*/
|
*/
|
||||||
if (((1 << vp->v_type) & ((1<<VBLK) | (1<<VCHR))) == 0) {
|
switch (ip->i_d.di_mode & S_IFMT) {
|
||||||
|
case S_IFBLK:
|
||||||
|
case S_IFCHR:
|
||||||
|
vap->va_rdev = ip->i_df.if_u2.if_rdev;
|
||||||
|
vap->va_blocksize = BLKDEV_IOSIZE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
vap->va_rdev = 0;
|
vap->va_rdev = 0;
|
||||||
|
|
||||||
if (!(ip->i_d.di_flags & XFS_DIFLAG_REALTIME)) {
|
if (!(ip->i_d.di_flags & XFS_DIFLAG_REALTIME)) {
|
||||||
@@ -224,9 +227,7 @@ xfs_getattr(
|
|||||||
(ip->i_d.di_extsize << mp->m_sb.sb_blocklog) :
|
(ip->i_d.di_extsize << mp->m_sb.sb_blocklog) :
|
||||||
(mp->m_sb.sb_rextsize << mp->m_sb.sb_blocklog);
|
(mp->m_sb.sb_rextsize << mp->m_sb.sb_blocklog);
|
||||||
}
|
}
|
||||||
} else {
|
break;
|
||||||
vap->va_rdev = ip->i_df.if_u2.if_rdev;
|
|
||||||
vap->va_blocksize = BLKDEV_IOSIZE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
vap->va_atime.tv_sec = ip->i_d.di_atime.t_sec;
|
vap->va_atime.tv_sec = ip->i_d.di_atime.t_sec;
|
||||||
@@ -468,7 +469,7 @@ xfs_setattr(
|
|||||||
m |= S_ISGID;
|
m |= S_ISGID;
|
||||||
#if 0
|
#if 0
|
||||||
/* Linux allows this, Irix doesn't. */
|
/* Linux allows this, Irix doesn't. */
|
||||||
if ((vap->va_mode & S_ISVTX) && vp->v_type != VDIR)
|
if ((vap->va_mode & S_ISVTX) && !VN_ISDIR(vp))
|
||||||
m |= S_ISVTX;
|
m |= S_ISVTX;
|
||||||
#endif
|
#endif
|
||||||
if (m && !capable(CAP_FSETID))
|
if (m && !capable(CAP_FSETID))
|
||||||
@@ -546,10 +547,10 @@ xfs_setattr(
|
|||||||
goto error_return;
|
goto error_return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vp->v_type == VDIR) {
|
if (VN_ISDIR(vp)) {
|
||||||
code = XFS_ERROR(EISDIR);
|
code = XFS_ERROR(EISDIR);
|
||||||
goto error_return;
|
goto error_return;
|
||||||
} else if (vp->v_type != VREG) {
|
} else if (!VN_ISREG(vp)) {
|
||||||
code = XFS_ERROR(EINVAL);
|
code = XFS_ERROR(EINVAL);
|
||||||
goto error_return;
|
goto error_return;
|
||||||
}
|
}
|
||||||
@@ -1567,7 +1568,7 @@ xfs_release(
|
|||||||
vp = BHV_TO_VNODE(bdp);
|
vp = BHV_TO_VNODE(bdp);
|
||||||
ip = XFS_BHVTOI(bdp);
|
ip = XFS_BHVTOI(bdp);
|
||||||
|
|
||||||
if ((vp->v_type != VREG) || (ip->i_d.di_mode == 0)) {
|
if (!VN_ISREG(vp) || (ip->i_d.di_mode == 0)) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1895,7 +1896,7 @@ xfs_create(
|
|||||||
dp = XFS_BHVTOI(dir_bdp);
|
dp = XFS_BHVTOI(dir_bdp);
|
||||||
mp = dp->i_mount;
|
mp = dp->i_mount;
|
||||||
|
|
||||||
dm_di_mode = vap->va_mode|VTTOIF(vap->va_type);
|
dm_di_mode = vap->va_mode;
|
||||||
namelen = VNAMELEN(dentry);
|
namelen = VNAMELEN(dentry);
|
||||||
|
|
||||||
if (DM_EVENT_ENABLED(dir_vp->v_vfsp, dp, DM_EVENT_CREATE)) {
|
if (DM_EVENT_ENABLED(dir_vp->v_vfsp, dp, DM_EVENT_CREATE)) {
|
||||||
@@ -1973,8 +1974,7 @@ xfs_create(
|
|||||||
(error = XFS_DIR_CANENTER(mp, tp, dp, name, namelen)))
|
(error = XFS_DIR_CANENTER(mp, tp, dp, name, namelen)))
|
||||||
goto error_return;
|
goto error_return;
|
||||||
rdev = (vap->va_mask & XFS_AT_RDEV) ? vap->va_rdev : 0;
|
rdev = (vap->va_mask & XFS_AT_RDEV) ? vap->va_rdev : 0;
|
||||||
error = xfs_dir_ialloc(&tp, dp,
|
error = xfs_dir_ialloc(&tp, dp, vap->va_mode, 1,
|
||||||
MAKEIMODE(vap->va_type,vap->va_mode), 1,
|
|
||||||
rdev, credp, prid, resblks > 0,
|
rdev, credp, prid, resblks > 0,
|
||||||
&ip, &committed);
|
&ip, &committed);
|
||||||
if (error) {
|
if (error) {
|
||||||
@@ -2620,7 +2620,7 @@ xfs_link(
|
|||||||
vn_trace_entry(src_vp, __FUNCTION__, (inst_t *)__return_address);
|
vn_trace_entry(src_vp, __FUNCTION__, (inst_t *)__return_address);
|
||||||
|
|
||||||
target_namelen = VNAMELEN(dentry);
|
target_namelen = VNAMELEN(dentry);
|
||||||
if (src_vp->v_type == VDIR)
|
if (VN_ISDIR(src_vp))
|
||||||
return XFS_ERROR(EPERM);
|
return XFS_ERROR(EPERM);
|
||||||
|
|
||||||
src_bdp = vn_bhv_lookup_unlocked(VN_BHV_HEAD(src_vp), &xfs_vnodeops);
|
src_bdp = vn_bhv_lookup_unlocked(VN_BHV_HEAD(src_vp), &xfs_vnodeops);
|
||||||
@@ -2805,7 +2805,7 @@ xfs_mkdir(
|
|||||||
|
|
||||||
tp = NULL;
|
tp = NULL;
|
||||||
dp_joined_to_trans = B_FALSE;
|
dp_joined_to_trans = B_FALSE;
|
||||||
dm_di_mode = vap->va_mode|VTTOIF(vap->va_type);
|
dm_di_mode = vap->va_mode;
|
||||||
|
|
||||||
if (DM_EVENT_ENABLED(dir_vp->v_vfsp, dp, DM_EVENT_CREATE)) {
|
if (DM_EVENT_ENABLED(dir_vp->v_vfsp, dp, DM_EVENT_CREATE)) {
|
||||||
error = XFS_SEND_NAMESP(mp, DM_EVENT_CREATE,
|
error = XFS_SEND_NAMESP(mp, DM_EVENT_CREATE,
|
||||||
@@ -2879,8 +2879,7 @@ xfs_mkdir(
|
|||||||
/*
|
/*
|
||||||
* create the directory inode.
|
* create the directory inode.
|
||||||
*/
|
*/
|
||||||
error = xfs_dir_ialloc(&tp, dp,
|
error = xfs_dir_ialloc(&tp, dp, vap->va_mode, 2,
|
||||||
MAKEIMODE(vap->va_type,vap->va_mode), 2,
|
|
||||||
0, credp, prid, resblks > 0,
|
0, credp, prid, resblks > 0,
|
||||||
&cdp, NULL);
|
&cdp, NULL);
|
||||||
if (error) {
|
if (error) {
|
||||||
@@ -3650,7 +3649,7 @@ xfs_rwlock(
|
|||||||
vnode_t *vp;
|
vnode_t *vp;
|
||||||
|
|
||||||
vp = BHV_TO_VNODE(bdp);
|
vp = BHV_TO_VNODE(bdp);
|
||||||
if (vp->v_type == VDIR)
|
if (VN_ISDIR(vp))
|
||||||
return 1;
|
return 1;
|
||||||
ip = XFS_BHVTOI(bdp);
|
ip = XFS_BHVTOI(bdp);
|
||||||
if (locktype == VRWLOCK_WRITE) {
|
if (locktype == VRWLOCK_WRITE) {
|
||||||
@@ -3681,7 +3680,7 @@ xfs_rwunlock(
|
|||||||
vnode_t *vp;
|
vnode_t *vp;
|
||||||
|
|
||||||
vp = BHV_TO_VNODE(bdp);
|
vp = BHV_TO_VNODE(bdp);
|
||||||
if (vp->v_type == VDIR)
|
if (VN_ISDIR(vp))
|
||||||
return;
|
return;
|
||||||
ip = XFS_BHVTOI(bdp);
|
ip = XFS_BHVTOI(bdp);
|
||||||
if (locktype == VRWLOCK_WRITE) {
|
if (locktype == VRWLOCK_WRITE) {
|
||||||
@@ -4567,7 +4566,7 @@ xfs_change_file_space(
|
|||||||
/*
|
/*
|
||||||
* must be a regular file and have write permission
|
* must be a regular file and have write permission
|
||||||
*/
|
*/
|
||||||
if (vp->v_type != VREG)
|
if (!VN_ISREG(vp))
|
||||||
return XFS_ERROR(EINVAL);
|
return XFS_ERROR(EINVAL);
|
||||||
|
|
||||||
xfs_ilock(ip, XFS_ILOCK_SHARED);
|
xfs_ilock(ip, XFS_ILOCK_SHARED);
|
||||||
|
Reference in New Issue
Block a user