Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6:
  merge fchmod() and fchmodat() guts, kill ancient broken kludge
  xfs: fix misspelled S_IS...()
  xfs: get rid of open-coded S_ISREG(), etc.
  vfs: document locking requirements for d_move, __d_move and d_materialise_unique
  omfs: fix (mode & S_IFDIR) abuse
  btrfs: S_ISREG(mode) is not mode & S_IFREG...
  ima: fmode_t misspelled as mode_t...
  pci-label.c: size_t misspelled as mode_t
  jffs2: S_ISLNK(mode & S_IFMT) is pointless
  snd_msnd ->mode is fmode_t, not mode_t
  v9fs_iop_get_acl: get rid of unused variable
  vfs: dont chain pipe/anon/socket on superblock s_inodes list
  Documentation: Exporting: update description of d_splice_alias
  fs: add missing unlock in default_llseek()
This commit is contained in:
Linus Torvalds 2011-07-26 18:30:20 -07:00
commit e371d46ae4
25 changed files with 133 additions and 120 deletions

View File

@ -92,7 +92,14 @@ For a filesystem to be exportable it must:
1/ provide the filehandle fragment routines described below. 1/ provide the filehandle fragment routines described below.
2/ make sure that d_splice_alias is used rather than d_add 2/ make sure that d_splice_alias is used rather than d_add
when ->lookup finds an inode for a given parent and name. when ->lookup finds an inode for a given parent and name.
Typically the ->lookup routine will end with a:
If inode is NULL, d_splice_alias(inode, dentry) is eqivalent to
d_add(dentry, inode), NULL
Similarly, d_splice_alias(ERR_PTR(err), dentry) = ERR_PTR(err)
Typically the ->lookup routine will simply end with a:
return d_splice_alias(inode, dentry); return d_splice_alias(inode, dentry);
} }

View File

@ -55,7 +55,7 @@ enum smbios_attr_enum {
SMBIOS_ATTR_INSTANCE_SHOW, SMBIOS_ATTR_INSTANCE_SHOW,
}; };
static mode_t static size_t
find_smbios_instance_string(struct pci_dev *pdev, char *buf, find_smbios_instance_string(struct pci_dev *pdev, char *buf,
enum smbios_attr_enum attribute) enum smbios_attr_enum attribute)
{ {

View File

@ -187,7 +187,7 @@ EXPORT_SYMBOL_GPL(anon_inode_getfd);
*/ */
static struct inode *anon_inode_mkinode(void) static struct inode *anon_inode_mkinode(void)
{ {
struct inode *inode = new_inode(anon_inode_mnt->mnt_sb); struct inode *inode = new_inode_pseudo(anon_inode_mnt->mnt_sb);
if (!inode) if (!inode)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);

View File

@ -4467,7 +4467,7 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans,
inode->i_generation = BTRFS_I(inode)->generation; inode->i_generation = BTRFS_I(inode)->generation;
btrfs_set_inode_space_info(root, inode); btrfs_set_inode_space_info(root, inode);
if (mode & S_IFDIR) if (S_ISDIR(mode))
owner = 0; owner = 0;
else else
owner = 1; owner = 1;
@ -4512,7 +4512,7 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans,
btrfs_inherit_iflags(inode, dir); btrfs_inherit_iflags(inode, dir);
if ((mode & S_IFREG)) { if (S_ISREG(mode)) {
if (btrfs_test_opt(root, NODATASUM)) if (btrfs_test_opt(root, NODATASUM))
BTRFS_I(inode)->flags |= BTRFS_INODE_NODATASUM; BTRFS_I(inode)->flags |= BTRFS_INODE_NODATASUM;
if (btrfs_test_opt(root, NODATACOW) || if (btrfs_test_opt(root, NODATACOW) ||

View File

@ -2138,8 +2138,9 @@ static void dentry_unlock_parents_for_move(struct dentry *dentry,
* @target: new dentry * @target: new dentry
* *
* Update the dcache to reflect the move of a file name. Negative * Update the dcache to reflect the move of a file name. Negative
* dcache entries should not be moved in this way. Caller hold * dcache entries should not be moved in this way. Caller must hold
* rename_lock. * rename_lock, the i_mutex of the source and target directories,
* and the sb->s_vfs_rename_mutex if they differ. See lock_rename().
*/ */
static void __d_move(struct dentry * dentry, struct dentry * target) static void __d_move(struct dentry * dentry, struct dentry * target)
{ {
@ -2202,7 +2203,8 @@ static void __d_move(struct dentry * dentry, struct dentry * target)
* @target: new dentry * @target: new dentry
* *
* Update the dcache to reflect the move of a file name. Negative * Update the dcache to reflect the move of a file name. Negative
* dcache entries should not be moved in this way. * dcache entries should not be moved in this way. See the locking
* requirements for __d_move.
*/ */
void d_move(struct dentry *dentry, struct dentry *target) void d_move(struct dentry *dentry, struct dentry *target)
{ {
@ -2320,7 +2322,8 @@ static void __d_materialise_dentry(struct dentry *dentry, struct dentry *anon)
* @inode: inode to bind to the dentry, to which aliases may be attached * @inode: inode to bind to the dentry, to which aliases may be attached
* *
* Introduces an dentry into the tree, substituting an extant disconnected * Introduces an dentry into the tree, substituting an extant disconnected
* root directory alias in its place if there is one * root directory alias in its place if there is one. Caller must hold the
* i_mutex of the parent directory.
*/ */
struct dentry *d_materialise_unique(struct dentry *dentry, struct inode *inode) struct dentry *d_materialise_unique(struct dentry *dentry, struct inode *inode)
{ {

View File

@ -361,9 +361,11 @@ EXPORT_SYMBOL_GPL(inode_sb_list_add);
static inline void inode_sb_list_del(struct inode *inode) static inline void inode_sb_list_del(struct inode *inode)
{ {
spin_lock(&inode_sb_list_lock); if (!list_empty(&inode->i_sb_list)) {
list_del_init(&inode->i_sb_list); spin_lock(&inode_sb_list_lock);
spin_unlock(&inode_sb_list_lock); list_del_init(&inode->i_sb_list);
spin_unlock(&inode_sb_list_lock);
}
} }
static unsigned long hash(struct super_block *sb, unsigned long hashval) static unsigned long hash(struct super_block *sb, unsigned long hashval)
@ -795,6 +797,29 @@ unsigned int get_next_ino(void)
} }
EXPORT_SYMBOL(get_next_ino); EXPORT_SYMBOL(get_next_ino);
/**
* new_inode_pseudo - obtain an inode
* @sb: superblock
*
* Allocates a new inode for given superblock.
* Inode wont be chained in superblock s_inodes list
* This means :
* - fs can't be unmount
* - quotas, fsnotify, writeback can't work
*/
struct inode *new_inode_pseudo(struct super_block *sb)
{
struct inode *inode = alloc_inode(sb);
if (inode) {
spin_lock(&inode->i_lock);
inode->i_state = 0;
spin_unlock(&inode->i_lock);
INIT_LIST_HEAD(&inode->i_sb_list);
}
return inode;
}
/** /**
* new_inode - obtain an inode * new_inode - obtain an inode
* @sb: superblock * @sb: superblock
@ -813,13 +838,9 @@ struct inode *new_inode(struct super_block *sb)
spin_lock_prefetch(&inode_sb_list_lock); spin_lock_prefetch(&inode_sb_list_lock);
inode = alloc_inode(sb); inode = new_inode_pseudo(sb);
if (inode) { if (inode)
spin_lock(&inode->i_lock);
inode->i_state = 0;
spin_unlock(&inode->i_lock);
inode_sb_list_add(inode); inode_sb_list_add(inode);
}
return inode; return inode;
} }
EXPORT_SYMBOL(new_inode); EXPORT_SYMBOL(new_inode);

View File

@ -80,7 +80,7 @@ int jffs2_do_setattr (struct inode *inode, struct iattr *iattr)
ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE); ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
if (ret) { if (ret) {
jffs2_free_raw_inode(ri); jffs2_free_raw_inode(ri);
if (S_ISLNK(inode->i_mode & S_IFMT)) if (S_ISLNK(inode->i_mode))
kfree(mdata); kfree(mdata);
return ret; return ret;
} }

View File

@ -93,7 +93,7 @@ int omfs_make_empty(struct inode *inode, struct super_block *sb)
memset(bh->b_data, 0, sizeof(struct omfs_inode)); memset(bh->b_data, 0, sizeof(struct omfs_inode));
if (inode->i_mode & S_IFDIR) { if (S_ISDIR(inode->i_mode)) {
memset(&bh->b_data[OMFS_DIR_START], 0xff, memset(&bh->b_data[OMFS_DIR_START], 0xff,
sbi->s_sys_blocksize - OMFS_DIR_START); sbi->s_sys_blocksize - OMFS_DIR_START);
} else } else

View File

@ -446,74 +446,52 @@ SYSCALL_DEFINE1(chroot, const char __user *, filename)
return error; return error;
} }
SYSCALL_DEFINE2(fchmod, unsigned int, fd, mode_t, mode) static int chmod_common(struct path *path, umode_t mode)
{ {
struct inode * inode; struct inode *inode = path->dentry->d_inode;
struct dentry * dentry;
struct file * file;
int err = -EBADF;
struct iattr newattrs; struct iattr newattrs;
int error;
file = fget(fd); error = mnt_want_write(path->mnt);
if (!file) if (error)
goto out; return error;
dentry = file->f_path.dentry;
inode = dentry->d_inode;
audit_inode(NULL, dentry);
err = mnt_want_write_file(file);
if (err)
goto out_putf;
mutex_lock(&inode->i_mutex); mutex_lock(&inode->i_mutex);
err = security_path_chmod(dentry, file->f_vfsmnt, mode); error = security_path_chmod(path->dentry, path->mnt, mode);
if (err) if (error)
goto out_unlock; goto out_unlock;
if (mode == (mode_t) -1)
mode = inode->i_mode;
newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO); newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
newattrs.ia_valid = ATTR_MODE | ATTR_CTIME; newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
err = notify_change(dentry, &newattrs); error = notify_change(path->dentry, &newattrs);
out_unlock: out_unlock:
mutex_unlock(&inode->i_mutex); mutex_unlock(&inode->i_mutex);
mnt_drop_write(file->f_path.mnt); mnt_drop_write(path->mnt);
out_putf: return error;
fput(file); }
out:
SYSCALL_DEFINE2(fchmod, unsigned int, fd, mode_t, mode)
{
struct file * file;
int err = -EBADF;
file = fget(fd);
if (file) {
audit_inode(NULL, file->f_path.dentry);
err = chmod_common(&file->f_path, mode);
fput(file);
}
return err; return err;
} }
SYSCALL_DEFINE3(fchmodat, int, dfd, const char __user *, filename, mode_t, mode) SYSCALL_DEFINE3(fchmodat, int, dfd, const char __user *, filename, mode_t, mode)
{ {
struct path path; struct path path;
struct inode *inode;
int error; int error;
struct iattr newattrs;
error = user_path_at(dfd, filename, LOOKUP_FOLLOW, &path); error = user_path_at(dfd, filename, LOOKUP_FOLLOW, &path);
if (error) if (!error) {
goto out; error = chmod_common(&path, mode);
inode = path.dentry->d_inode; path_put(&path);
}
error = mnt_want_write(path.mnt);
if (error)
goto dput_and_out;
mutex_lock(&inode->i_mutex);
error = security_path_chmod(path.dentry, path.mnt, mode);
if (error)
goto out_unlock;
if (mode == (mode_t) -1)
mode = inode->i_mode;
newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
error = notify_change(path.dentry, &newattrs);
out_unlock:
mutex_unlock(&inode->i_mutex);
mnt_drop_write(path.mnt);
dput_and_out:
path_put(&path);
out:
return error; return error;
} }

View File

@ -948,7 +948,7 @@ static const struct dentry_operations pipefs_dentry_operations = {
static struct inode * get_pipe_inode(void) static struct inode * get_pipe_inode(void)
{ {
struct inode *inode = new_inode(pipe_mnt->mnt_sb); struct inode *inode = new_inode_pseudo(pipe_mnt->mnt_sb);
struct pipe_inode_info *pipe; struct pipe_inode_info *pipe;
if (!inode) if (!inode)

View File

@ -166,8 +166,10 @@ loff_t default_llseek(struct file *file, loff_t offset, int origin)
* long as offset isn't at the end of the file then the * long as offset isn't at the end of the file then the
* offset is data. * offset is data.
*/ */
if (offset >= inode->i_size) if (offset >= inode->i_size) {
return -ENXIO; retval = -ENXIO;
goto out;
}
break; break;
case SEEK_HOLE: case SEEK_HOLE:
/* /*
@ -175,8 +177,10 @@ loff_t default_llseek(struct file *file, loff_t offset, int origin)
* as long as offset isn't i_size or larger, return * as long as offset isn't i_size or larger, return
* i_size. * i_size.
*/ */
if (offset >= inode->i_size) if (offset >= inode->i_size) {
return -ENXIO; retval = -ENXIO;
goto out;
}
offset = inode->i_size; offset = inode->i_size;
break; break;
} }

View File

@ -265,7 +265,7 @@ xfs_open_by_handle(
return PTR_ERR(filp); return PTR_ERR(filp);
} }
if (inode->i_mode & S_IFREG) { if (S_ISREG(inode->i_mode)) {
filp->f_flags |= O_NOATIME; filp->f_flags |= O_NOATIME;
filp->f_mode |= FMODE_NOCMTIME; filp->f_mode |= FMODE_NOCMTIME;
} }
@ -850,14 +850,14 @@ xfs_set_diflags(
di_flags |= XFS_DIFLAG_NODEFRAG; di_flags |= XFS_DIFLAG_NODEFRAG;
if (xflags & XFS_XFLAG_FILESTREAM) if (xflags & XFS_XFLAG_FILESTREAM)
di_flags |= XFS_DIFLAG_FILESTREAM; di_flags |= XFS_DIFLAG_FILESTREAM;
if ((ip->i_d.di_mode & S_IFMT) == S_IFDIR) { if (S_ISDIR(ip->i_d.di_mode)) {
if (xflags & XFS_XFLAG_RTINHERIT) if (xflags & XFS_XFLAG_RTINHERIT)
di_flags |= XFS_DIFLAG_RTINHERIT; di_flags |= XFS_DIFLAG_RTINHERIT;
if (xflags & XFS_XFLAG_NOSYMLINKS) if (xflags & XFS_XFLAG_NOSYMLINKS)
di_flags |= XFS_DIFLAG_NOSYMLINKS; di_flags |= XFS_DIFLAG_NOSYMLINKS;
if (xflags & XFS_XFLAG_EXTSZINHERIT) if (xflags & XFS_XFLAG_EXTSZINHERIT)
di_flags |= XFS_DIFLAG_EXTSZINHERIT; di_flags |= XFS_DIFLAG_EXTSZINHERIT;
} else if ((ip->i_d.di_mode & S_IFMT) == S_IFREG) { } else if (S_ISREG(ip->i_d.di_mode)) {
if (xflags & XFS_XFLAG_REALTIME) if (xflags & XFS_XFLAG_REALTIME)
di_flags |= XFS_DIFLAG_REALTIME; di_flags |= XFS_DIFLAG_REALTIME;
if (xflags & XFS_XFLAG_EXTSIZE) if (xflags & XFS_XFLAG_EXTSIZE)

View File

@ -414,7 +414,7 @@ xfs_bmap_add_attrfork_local(
if (ip->i_df.if_bytes <= XFS_IFORK_DSIZE(ip)) if (ip->i_df.if_bytes <= XFS_IFORK_DSIZE(ip))
return 0; return 0;
if ((ip->i_d.di_mode & S_IFMT) == S_IFDIR) { if (S_ISDIR(ip->i_d.di_mode)) {
mp = ip->i_mount; mp = ip->i_mount;
memset(&dargs, 0, sizeof(dargs)); memset(&dargs, 0, sizeof(dargs));
dargs.dp = ip; dargs.dp = ip;
@ -3344,8 +3344,7 @@ xfs_bmap_local_to_extents(
* We don't want to deal with the case of keeping inode data inline yet. * We don't want to deal with the case of keeping inode data inline yet.
* So sending the data fork of a regular inode is invalid. * So sending the data fork of a regular inode is invalid.
*/ */
ASSERT(!((ip->i_d.di_mode & S_IFMT) == S_IFREG && ASSERT(!(S_ISREG(ip->i_d.di_mode) && whichfork == XFS_DATA_FORK));
whichfork == XFS_DATA_FORK));
ifp = XFS_IFORK_PTR(ip, whichfork); ifp = XFS_IFORK_PTR(ip, whichfork);
ASSERT(XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_LOCAL); ASSERT(XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_LOCAL);
flags = 0; flags = 0;
@ -4052,7 +4051,7 @@ xfs_bmap_one_block(
#ifndef DEBUG #ifndef DEBUG
if (whichfork == XFS_DATA_FORK) { if (whichfork == XFS_DATA_FORK) {
return ((ip->i_d.di_mode & S_IFMT) == S_IFREG) ? return S_ISREG(ip->i_d.di_mode) ?
(ip->i_size == ip->i_mount->m_sb.sb_blocksize) : (ip->i_size == ip->i_mount->m_sb.sb_blocksize) :
(ip->i_d.di_size == ip->i_mount->m_sb.sb_blocksize); (ip->i_d.di_size == ip->i_mount->m_sb.sb_blocksize);
} }

View File

@ -121,7 +121,7 @@ xfs_dir_isempty(
{ {
xfs_dir2_sf_hdr_t *sfp; xfs_dir2_sf_hdr_t *sfp;
ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR); ASSERT(S_ISDIR(dp->i_d.di_mode));
if (dp->i_d.di_size == 0) /* might happen during shutdown. */ if (dp->i_d.di_size == 0) /* might happen during shutdown. */
return 1; return 1;
if (dp->i_d.di_size > XFS_IFORK_DSIZE(dp)) if (dp->i_d.di_size > XFS_IFORK_DSIZE(dp))
@ -179,7 +179,7 @@ xfs_dir_init(
memset((char *)&args, 0, sizeof(args)); memset((char *)&args, 0, sizeof(args));
args.dp = dp; args.dp = dp;
args.trans = tp; args.trans = tp;
ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR); ASSERT(S_ISDIR(dp->i_d.di_mode));
if ((error = xfs_dir_ino_validate(tp->t_mountp, pdp->i_ino))) if ((error = xfs_dir_ino_validate(tp->t_mountp, pdp->i_ino)))
return error; return error;
return xfs_dir2_sf_create(&args, pdp->i_ino); return xfs_dir2_sf_create(&args, pdp->i_ino);
@ -202,7 +202,7 @@ xfs_dir_createname(
int rval; int rval;
int v; /* type-checking value */ int v; /* type-checking value */
ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR); ASSERT(S_ISDIR(dp->i_d.di_mode));
if ((rval = xfs_dir_ino_validate(tp->t_mountp, inum))) if ((rval = xfs_dir_ino_validate(tp->t_mountp, inum)))
return rval; return rval;
XFS_STATS_INC(xs_dir_create); XFS_STATS_INC(xs_dir_create);
@ -278,7 +278,7 @@ xfs_dir_lookup(
int rval; int rval;
int v; /* type-checking value */ int v; /* type-checking value */
ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR); ASSERT(S_ISDIR(dp->i_d.di_mode));
XFS_STATS_INC(xs_dir_lookup); XFS_STATS_INC(xs_dir_lookup);
memset(&args, 0, sizeof(xfs_da_args_t)); memset(&args, 0, sizeof(xfs_da_args_t));
@ -333,7 +333,7 @@ xfs_dir_removename(
int rval; int rval;
int v; /* type-checking value */ int v; /* type-checking value */
ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR); ASSERT(S_ISDIR(dp->i_d.di_mode));
XFS_STATS_INC(xs_dir_remove); XFS_STATS_INC(xs_dir_remove);
memset(&args, 0, sizeof(xfs_da_args_t)); memset(&args, 0, sizeof(xfs_da_args_t));
@ -382,7 +382,7 @@ xfs_readdir(
if (XFS_FORCED_SHUTDOWN(dp->i_mount)) if (XFS_FORCED_SHUTDOWN(dp->i_mount))
return XFS_ERROR(EIO); return XFS_ERROR(EIO);
ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR); ASSERT(S_ISDIR(dp->i_d.di_mode));
XFS_STATS_INC(xs_dir_getdents); XFS_STATS_INC(xs_dir_getdents);
if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL)
@ -414,7 +414,7 @@ xfs_dir_replace(
int rval; int rval;
int v; /* type-checking value */ int v; /* type-checking value */
ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR); ASSERT(S_ISDIR(dp->i_d.di_mode));
if ((rval = xfs_dir_ino_validate(tp->t_mountp, inum))) if ((rval = xfs_dir_ino_validate(tp->t_mountp, inum)))
return rval; return rval;
@ -464,7 +464,7 @@ xfs_dir_canenter(
if (resblks) if (resblks)
return 0; return 0;
ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR); ASSERT(S_ISDIR(dp->i_d.di_mode));
memset(&args, 0, sizeof(xfs_da_args_t)); memset(&args, 0, sizeof(xfs_da_args_t));
args.name = name->name; args.name = name->name;

View File

@ -344,9 +344,9 @@ _xfs_filestream_update_ag(
* Either ip is a regular file and pip is a directory, or ip is a * Either ip is a regular file and pip is a directory, or ip is a
* directory and pip is NULL. * directory and pip is NULL.
*/ */
ASSERT(ip && (((ip->i_d.di_mode & S_IFREG) && pip && ASSERT(ip && ((S_ISREG(ip->i_d.di_mode) && pip &&
(pip->i_d.di_mode & S_IFDIR)) || S_ISDIR(pip->i_d.di_mode)) ||
((ip->i_d.di_mode & S_IFDIR) && !pip))); (S_ISDIR(ip->i_d.di_mode) && !pip)));
mp = ip->i_mount; mp = ip->i_mount;
cache = mp->m_filestream; cache = mp->m_filestream;
@ -537,7 +537,7 @@ xfs_filestream_lookup_ag(
xfs_agnumber_t ag; xfs_agnumber_t ag;
int ref; int ref;
if (!(ip->i_d.di_mode & (S_IFREG | S_IFDIR))) { if (!S_ISREG(ip->i_d.di_mode) && !S_ISDIR(ip->i_d.di_mode)) {
ASSERT(0); ASSERT(0);
return NULLAGNUMBER; return NULLAGNUMBER;
} }
@ -579,9 +579,9 @@ xfs_filestream_associate(
xfs_agnumber_t ag, rotorstep, startag; xfs_agnumber_t ag, rotorstep, startag;
int err = 0; int err = 0;
ASSERT(pip->i_d.di_mode & S_IFDIR); ASSERT(S_ISDIR(pip->i_d.di_mode));
ASSERT(ip->i_d.di_mode & S_IFREG); ASSERT(S_ISREG(ip->i_d.di_mode));
if (!(pip->i_d.di_mode & S_IFDIR) || !(ip->i_d.di_mode & S_IFREG)) if (!S_ISDIR(pip->i_d.di_mode) || !S_ISREG(ip->i_d.di_mode))
return -EINVAL; return -EINVAL;
mp = pip->i_mount; mp = pip->i_mount;

View File

@ -368,7 +368,7 @@ xfs_iformat(
/* /*
* no local regular files yet * no local regular files yet
*/ */
if (unlikely((be16_to_cpu(dip->di_mode) & S_IFMT) == S_IFREG)) { if (unlikely(S_ISREG(be16_to_cpu(dip->di_mode)))) {
xfs_warn(ip->i_mount, xfs_warn(ip->i_mount,
"corrupt inode %Lu (local format for regular file).", "corrupt inode %Lu (local format for regular file).",
(unsigned long long) ip->i_ino); (unsigned long long) ip->i_ino);
@ -1040,7 +1040,7 @@ xfs_ialloc(
if (pip && XFS_INHERIT_GID(pip)) { if (pip && XFS_INHERIT_GID(pip)) {
ip->i_d.di_gid = pip->i_d.di_gid; ip->i_d.di_gid = pip->i_d.di_gid;
if ((pip->i_d.di_mode & S_ISGID) && (mode & S_IFMT) == S_IFDIR) { if ((pip->i_d.di_mode & S_ISGID) && S_ISDIR(mode)) {
ip->i_d.di_mode |= S_ISGID; ip->i_d.di_mode |= S_ISGID;
} }
} }
@ -1097,14 +1097,14 @@ xfs_ialloc(
if (pip && (pip->i_d.di_flags & XFS_DIFLAG_ANY)) { if (pip && (pip->i_d.di_flags & XFS_DIFLAG_ANY)) {
uint di_flags = 0; uint di_flags = 0;
if ((mode & S_IFMT) == S_IFDIR) { if (S_ISDIR(mode)) {
if (pip->i_d.di_flags & XFS_DIFLAG_RTINHERIT) if (pip->i_d.di_flags & XFS_DIFLAG_RTINHERIT)
di_flags |= XFS_DIFLAG_RTINHERIT; di_flags |= XFS_DIFLAG_RTINHERIT;
if (pip->i_d.di_flags & XFS_DIFLAG_EXTSZINHERIT) { if (pip->i_d.di_flags & XFS_DIFLAG_EXTSZINHERIT) {
di_flags |= XFS_DIFLAG_EXTSZINHERIT; di_flags |= XFS_DIFLAG_EXTSZINHERIT;
ip->i_d.di_extsize = pip->i_d.di_extsize; ip->i_d.di_extsize = pip->i_d.di_extsize;
} }
} else if ((mode & S_IFMT) == S_IFREG) { } else if (S_ISREG(mode)) {
if (pip->i_d.di_flags & XFS_DIFLAG_RTINHERIT) if (pip->i_d.di_flags & XFS_DIFLAG_RTINHERIT)
di_flags |= XFS_DIFLAG_REALTIME; di_flags |= XFS_DIFLAG_REALTIME;
if (pip->i_d.di_flags & XFS_DIFLAG_EXTSZINHERIT) { if (pip->i_d.di_flags & XFS_DIFLAG_EXTSZINHERIT) {
@ -1188,7 +1188,7 @@ xfs_isize_check(
int nimaps; int nimaps;
xfs_bmbt_irec_t imaps[2]; xfs_bmbt_irec_t imaps[2];
if ((ip->i_d.di_mode & S_IFMT) != S_IFREG) if (!S_ISREG(ip->i_d.di_mode))
return; return;
if (XFS_IS_REALTIME_INODE(ip)) if (XFS_IS_REALTIME_INODE(ip))
@ -1828,7 +1828,7 @@ xfs_ifree(
ASSERT(ip->i_d.di_nextents == 0); ASSERT(ip->i_d.di_nextents == 0);
ASSERT(ip->i_d.di_anextents == 0); ASSERT(ip->i_d.di_anextents == 0);
ASSERT((ip->i_d.di_size == 0 && ip->i_size == 0) || ASSERT((ip->i_d.di_size == 0 && ip->i_size == 0) ||
((ip->i_d.di_mode & S_IFMT) != S_IFREG)); (!S_ISREG(ip->i_d.di_mode)));
ASSERT(ip->i_d.di_nblocks == 0); ASSERT(ip->i_d.di_nblocks == 0);
/* /*
@ -2671,7 +2671,7 @@ xfs_iflush_int(
__func__, ip->i_ino, ip, ip->i_d.di_magic); __func__, ip->i_ino, ip, ip->i_d.di_magic);
goto corrupt_out; goto corrupt_out;
} }
if ((ip->i_d.di_mode & S_IFMT) == S_IFREG) { if (S_ISREG(ip->i_d.di_mode)) {
if (XFS_TEST_ERROR( if (XFS_TEST_ERROR(
(ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS) && (ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS) &&
(ip->i_d.di_format != XFS_DINODE_FMT_BTREE), (ip->i_d.di_format != XFS_DINODE_FMT_BTREE),
@ -2681,7 +2681,7 @@ xfs_iflush_int(
__func__, ip->i_ino, ip); __func__, ip->i_ino, ip);
goto corrupt_out; goto corrupt_out;
} }
} else if ((ip->i_d.di_mode & S_IFMT) == S_IFDIR) { } else if (S_ISDIR(ip->i_d.di_mode)) {
if (XFS_TEST_ERROR( if (XFS_TEST_ERROR(
(ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS) && (ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS) &&
(ip->i_d.di_format != XFS_DINODE_FMT_BTREE) && (ip->i_d.di_format != XFS_DINODE_FMT_BTREE) &&

View File

@ -263,7 +263,7 @@ typedef struct xfs_inode {
struct inode i_vnode; /* embedded VFS inode */ struct inode i_vnode; /* embedded VFS inode */
} xfs_inode_t; } xfs_inode_t;
#define XFS_ISIZE(ip) (((ip)->i_d.di_mode & S_IFMT) == S_IFREG) ? \ #define XFS_ISIZE(ip) S_ISREG((ip)->i_d.di_mode) ? \
(ip)->i_size : (ip)->i_d.di_size; (ip)->i_size : (ip)->i_d.di_size;
/* Convert from vfs inode to xfs inode */ /* Convert from vfs inode to xfs inode */

View File

@ -2283,7 +2283,7 @@ xlog_recover_inode_pass2(
/* Take the opportunity to reset the flush iteration count */ /* Take the opportunity to reset the flush iteration count */
dicp->di_flushiter = 0; dicp->di_flushiter = 0;
if (unlikely((dicp->di_mode & S_IFMT) == S_IFREG)) { if (unlikely(S_ISREG(dicp->di_mode))) {
if ((dicp->di_format != XFS_DINODE_FMT_EXTENTS) && if ((dicp->di_format != XFS_DINODE_FMT_EXTENTS) &&
(dicp->di_format != XFS_DINODE_FMT_BTREE)) { (dicp->di_format != XFS_DINODE_FMT_BTREE)) {
XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(3)", XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(3)",
@ -2296,7 +2296,7 @@ xlog_recover_inode_pass2(
error = EFSCORRUPTED; error = EFSCORRUPTED;
goto error; goto error;
} }
} else if (unlikely((dicp->di_mode & S_IFMT) == S_IFDIR)) { } else if (unlikely(S_ISDIR(dicp->di_mode))) {
if ((dicp->di_format != XFS_DINODE_FMT_EXTENTS) && if ((dicp->di_format != XFS_DINODE_FMT_EXTENTS) &&
(dicp->di_format != XFS_DINODE_FMT_BTREE) && (dicp->di_format != XFS_DINODE_FMT_BTREE) &&
(dicp->di_format != XFS_DINODE_FMT_LOCAL)) { (dicp->di_format != XFS_DINODE_FMT_LOCAL)) {

View File

@ -1331,7 +1331,7 @@ xfs_mountfs(
ASSERT(rip != NULL); ASSERT(rip != NULL);
if (unlikely((rip->i_d.di_mode & S_IFMT) != S_IFDIR)) { if (unlikely(!S_ISDIR(rip->i_d.di_mode))) {
xfs_warn(mp, "corrupted root inode %llu: not a directory", xfs_warn(mp, "corrupted root inode %llu: not a directory",
(unsigned long long)rip->i_ino); (unsigned long long)rip->i_ino);
xfs_iunlock(rip, XFS_ILOCK_EXCL); xfs_iunlock(rip, XFS_ILOCK_EXCL);

View File

@ -116,7 +116,7 @@ xfs_rename(
trace_xfs_rename(src_dp, target_dp, src_name, target_name); trace_xfs_rename(src_dp, target_dp, src_name, target_name);
new_parent = (src_dp != target_dp); new_parent = (src_dp != target_dp);
src_is_directory = ((src_ip->i_d.di_mode & S_IFMT) == S_IFDIR); src_is_directory = S_ISDIR(src_ip->i_d.di_mode);
if (src_is_directory) { if (src_is_directory) {
/* /*
@ -226,7 +226,7 @@ xfs_rename(
* target and source are directories and that target can be * target and source are directories and that target can be
* destroyed, or that neither is a directory. * destroyed, or that neither is a directory.
*/ */
if ((target_ip->i_d.di_mode & S_IFMT) == S_IFDIR) { if (S_ISDIR(target_ip->i_d.di_mode)) {
/* /*
* Make sure target dir is empty. * Make sure target dir is empty.
*/ */

View File

@ -121,7 +121,7 @@ xfs_readlink(
xfs_ilock(ip, XFS_ILOCK_SHARED); xfs_ilock(ip, XFS_ILOCK_SHARED);
ASSERT((ip->i_d.di_mode & S_IFMT) == S_IFLNK); ASSERT(S_ISLNK(ip->i_d.di_mode));
ASSERT(ip->i_d.di_size <= MAXPATHLEN); ASSERT(ip->i_d.di_size <= MAXPATHLEN);
pathlen = ip->i_d.di_size; pathlen = ip->i_d.di_size;
@ -529,7 +529,7 @@ xfs_release(
if (ip->i_d.di_nlink == 0) if (ip->i_d.di_nlink == 0)
return 0; return 0;
if ((((ip->i_d.di_mode & S_IFMT) == S_IFREG) && if ((S_ISREG(ip->i_d.di_mode) &&
((ip->i_size > 0) || (VN_CACHED(VFS_I(ip)) > 0 || ((ip->i_size > 0) || (VN_CACHED(VFS_I(ip)) > 0 ||
ip->i_delayed_blks > 0)) && ip->i_delayed_blks > 0)) &&
(ip->i_df.if_flags & XFS_IFEXTENTS)) && (ip->i_df.if_flags & XFS_IFEXTENTS)) &&
@ -610,7 +610,7 @@ xfs_inactive(
truncate = ((ip->i_d.di_nlink == 0) && truncate = ((ip->i_d.di_nlink == 0) &&
((ip->i_d.di_size != 0) || (ip->i_size != 0) || ((ip->i_d.di_size != 0) || (ip->i_size != 0) ||
(ip->i_d.di_nextents > 0) || (ip->i_delayed_blks > 0)) && (ip->i_d.di_nextents > 0) || (ip->i_delayed_blks > 0)) &&
((ip->i_d.di_mode & S_IFMT) == S_IFREG)); S_ISREG(ip->i_d.di_mode));
mp = ip->i_mount; mp = ip->i_mount;
@ -621,7 +621,7 @@ xfs_inactive(
goto out; goto out;
if (ip->i_d.di_nlink != 0) { if (ip->i_d.di_nlink != 0) {
if ((((ip->i_d.di_mode & S_IFMT) == S_IFREG) && if ((S_ISREG(ip->i_d.di_mode) &&
((ip->i_size > 0) || (VN_CACHED(VFS_I(ip)) > 0 || ((ip->i_size > 0) || (VN_CACHED(VFS_I(ip)) > 0 ||
ip->i_delayed_blks > 0)) && ip->i_delayed_blks > 0)) &&
(ip->i_df.if_flags & XFS_IFEXTENTS) && (ip->i_df.if_flags & XFS_IFEXTENTS) &&
@ -669,7 +669,7 @@ xfs_inactive(
xfs_iunlock(ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); xfs_iunlock(ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL);
return VN_INACTIVE_CACHE; return VN_INACTIVE_CACHE;
} }
} else if ((ip->i_d.di_mode & S_IFMT) == S_IFLNK) { } else if (S_ISLNK(ip->i_d.di_mode)) {
/* /*
* If we get an error while cleaning up a * If we get an error while cleaning up a

View File

@ -2310,7 +2310,8 @@ extern void __iget(struct inode * inode);
extern void iget_failed(struct inode *); extern void iget_failed(struct inode *);
extern void end_writeback(struct inode *); extern void end_writeback(struct inode *);
extern void __destroy_inode(struct inode *); extern void __destroy_inode(struct inode *);
extern struct inode *new_inode(struct super_block *); extern struct inode *new_inode_pseudo(struct super_block *sb);
extern struct inode *new_inode(struct super_block *sb);
extern void free_inode_nonrcu(struct inode *inode); extern void free_inode_nonrcu(struct inode *inode);
extern int should_remove_suid(struct dentry *); extern int should_remove_suid(struct dentry *);
extern int file_remove_suid(struct file *); extern int file_remove_suid(struct file *);

View File

@ -467,7 +467,7 @@ static struct socket *sock_alloc(void)
struct inode *inode; struct inode *inode;
struct socket *sock; struct socket *sock;
inode = new_inode(sock_mnt->mnt_sb); inode = new_inode_pseudo(sock_mnt->mnt_sb);
if (!inode) if (!inode)
return NULL; return NULL;

View File

@ -86,7 +86,7 @@ static void ima_check_last_writer(struct ima_iint_cache *iint,
struct inode *inode, struct inode *inode,
struct file *file) struct file *file)
{ {
mode_t mode = file->f_mode; fmode_t mode = file->f_mode;
mutex_lock(&iint->mutex); mutex_lock(&iint->mutex);
if (mode & FMODE_WRITE && if (mode & FMODE_WRITE &&

View File

@ -249,7 +249,7 @@ struct snd_msnd {
/* State variables */ /* State variables */
enum { msndClassic, msndPinnacle } type; enum { msndClassic, msndPinnacle } type;
mode_t mode; fmode_t mode;
unsigned long flags; unsigned long flags;
#define F_RESETTING 0 #define F_RESETTING 0
#define F_HAVEDIGITAL 1 #define F_HAVEDIGITAL 1