Commit e36cb0b8 authored by David Howells's avatar David Howells Committed by Al Viro

VFS: (Scripted) Convert S_ISLNK/DIR/REG(dentry->d_inode) to d_is_*(dentry)

Convert the following where appropriate:

 (1) S_ISLNK(dentry->d_inode) to d_is_symlink(dentry).

 (2) S_ISREG(dentry->d_inode) to d_is_reg(dentry).

 (3) S_ISDIR(dentry->d_inode) to d_is_dir(dentry).  This is actually more
     complicated than it appears as some calls should be converted to
     d_can_lookup() instead.  The difference is whether the directory in
     question is a real dir with a ->lookup op or whether it's a fake dir with
     a ->d_automount op.

In some circumstances, we can subsume checks for dentry->d_inode not being
NULL into this, provided we the code isn't in a filesystem that expects
d_inode to be NULL if the dirent really *is* negative (ie. if we're going to
use d_inode() rather than d_backing_inode() to get the inode pointer).

Note that the dentry type field may be set to something other than
DCACHE_MISS_TYPE when d_inode is NULL in the case of unionmount, where the VFS
manages the fall-through from a negative dentry to a lower layer.  In such a
case, the dentry type of the negative union dentry is set to the same as the
type of the lower dentry.

However, if you know d_inode is not NULL at the call site, then you can use
the d_is_xxx() functions even in a filesystem.

There is one further complication: a 0,0 chardev dentry may be labelled
DCACHE_WHITEOUT_TYPE rather than DCACHE_SPECIAL_TYPE.  Strictly, this was
intended for special directory entry types that don't have attached inodes.

The following perl+coccinelle script was used:

use strict;

my @callers;
open($fd, 'git grep -l \'S_IS[A-Z].*->d_inode\' |') ||
    die "Can't grep for S_ISDIR and co. callers";
@callers = <$fd>;
close($fd);
unless (@callers) {
    print "No matches\n";
    exit(0);
}

my @cocci = (
    '@@',
    'expression E;',
    '@@',
    '',
    '- S_ISLNK(E->d_inode->i_mode)',
    '+ d_is_symlink(E)',
    '',
    '@@',
    'expression E;',
    '@@',
    '',
    '- S_ISDIR(E->d_inode->i_mode)',
    '+ d_is_dir(E)',
    '',
    '@@',
    'expression E;',
    '@@',
    '',
    '- S_ISREG(E->d_inode->i_mode)',
    '+ d_is_reg(E)' );

my $coccifile = "tmp.sp.cocci";
open($fd, ">$coccifile") || die $coccifile;
print($fd "$_\n") || die $coccifile foreach (@cocci);
close($fd);

foreach my $file (@callers) {
    chomp $file;
    print "Processing ", $file, "\n";
    system("spatch", "--sp-file", $coccifile, $file, "--in-place", "--no-show-diff") == 0 ||
	die "spatch failed";
}

[AV: overlayfs parts skipped]
Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 2c616d4d
...@@ -74,7 +74,7 @@ static void hypfs_remove(struct dentry *dentry) ...@@ -74,7 +74,7 @@ static void hypfs_remove(struct dentry *dentry)
parent = dentry->d_parent; parent = dentry->d_parent;
mutex_lock(&parent->d_inode->i_mutex); mutex_lock(&parent->d_inode->i_mutex);
if (hypfs_positive(dentry)) { if (hypfs_positive(dentry)) {
if (S_ISDIR(dentry->d_inode->i_mode)) if (d_is_dir(dentry))
simple_rmdir(parent->d_inode, dentry); simple_rmdir(parent->d_inode, dentry);
else else
simple_unlink(parent->d_inode, dentry); simple_unlink(parent->d_inode, dentry);
......
...@@ -1127,7 +1127,7 @@ static int v9fs_vfs_setattr(struct dentry *dentry, struct iattr *iattr) ...@@ -1127,7 +1127,7 @@ static int v9fs_vfs_setattr(struct dentry *dentry, struct iattr *iattr)
} }
/* Write all dirty data */ /* Write all dirty data */
if (S_ISREG(dentry->d_inode->i_mode)) if (d_is_reg(dentry))
filemap_write_and_wait(dentry->d_inode->i_mapping); filemap_write_and_wait(dentry->d_inode->i_mapping);
retval = p9_client_wstat(fid, &wstat); retval = p9_client_wstat(fid, &wstat);
......
...@@ -374,7 +374,7 @@ static struct dentry *should_expire(struct dentry *dentry, ...@@ -374,7 +374,7 @@ static struct dentry *should_expire(struct dentry *dentry,
return NULL; return NULL;
} }
if (dentry->d_inode && S_ISLNK(dentry->d_inode->i_mode)) { if (dentry->d_inode && d_is_symlink(dentry)) {
DPRINTK("checking symlink %p %pd", dentry, dentry); DPRINTK("checking symlink %p %pd", dentry, dentry);
/* /*
* A symlink can't be "busy" in the usual sense so * A symlink can't be "busy" in the usual sense so
......
...@@ -371,7 +371,7 @@ static struct vfsmount *autofs4_d_automount(struct path *path) ...@@ -371,7 +371,7 @@ static struct vfsmount *autofs4_d_automount(struct path *path)
* having d_mountpoint() true, so there's no need to call back * having d_mountpoint() true, so there's no need to call back
* to the daemon. * to the daemon.
*/ */
if (dentry->d_inode && S_ISLNK(dentry->d_inode->i_mode)) { if (dentry->d_inode && d_is_symlink(dentry)) {
spin_unlock(&sbi->fs_lock); spin_unlock(&sbi->fs_lock);
goto done; goto done;
} }
...@@ -485,7 +485,7 @@ static int autofs4_d_manage(struct dentry *dentry, bool rcu_walk) ...@@ -485,7 +485,7 @@ static int autofs4_d_manage(struct dentry *dentry, bool rcu_walk)
* an incorrect ELOOP error return. * an incorrect ELOOP error return.
*/ */
if ((!d_mountpoint(dentry) && !simple_empty(dentry)) || if ((!d_mountpoint(dentry) && !simple_empty(dentry)) ||
(dentry->d_inode && S_ISLNK(dentry->d_inode->i_mode))) (dentry->d_inode && d_is_symlink(dentry)))
status = -EISDIR; status = -EISDIR;
} }
spin_unlock(&sbi->fs_lock); spin_unlock(&sbi->fs_lock);
......
...@@ -776,11 +776,11 @@ static int btrfs_may_delete(struct inode *dir, struct dentry *victim, int isdir) ...@@ -776,11 +776,11 @@ static int btrfs_may_delete(struct inode *dir, struct dentry *victim, int isdir)
IS_IMMUTABLE(victim->d_inode) || IS_SWAPFILE(victim->d_inode)) IS_IMMUTABLE(victim->d_inode) || IS_SWAPFILE(victim->d_inode))
return -EPERM; return -EPERM;
if (isdir) { if (isdir) {
if (!S_ISDIR(victim->d_inode->i_mode)) if (!d_is_dir(victim))
return -ENOTDIR; return -ENOTDIR;
if (IS_ROOT(victim)) if (IS_ROOT(victim))
return -EBUSY; return -EBUSY;
} else if (S_ISDIR(victim->d_inode->i_mode)) } else if (d_is_dir(victim))
return -EISDIR; return -EISDIR;
if (IS_DEADDIR(dir)) if (IS_DEADDIR(dir))
return -ENOENT; return -ENOENT;
......
...@@ -574,7 +574,7 @@ static int cachefiles_daemon_cull(struct cachefiles_cache *cache, char *args) ...@@ -574,7 +574,7 @@ static int cachefiles_daemon_cull(struct cachefiles_cache *cache, char *args)
/* extract the directory dentry from the cwd */ /* extract the directory dentry from the cwd */
get_fs_pwd(current->fs, &path); get_fs_pwd(current->fs, &path);
if (!S_ISDIR(path.dentry->d_inode->i_mode)) if (!d_is_dir(path.dentry))
goto notdir; goto notdir;
cachefiles_begin_secure(cache, &saved_cred); cachefiles_begin_secure(cache, &saved_cred);
...@@ -646,7 +646,7 @@ static int cachefiles_daemon_inuse(struct cachefiles_cache *cache, char *args) ...@@ -646,7 +646,7 @@ static int cachefiles_daemon_inuse(struct cachefiles_cache *cache, char *args)
/* extract the directory dentry from the cwd */ /* extract the directory dentry from the cwd */
get_fs_pwd(current->fs, &path); get_fs_pwd(current->fs, &path);
if (!S_ISDIR(path.dentry->d_inode->i_mode)) if (!d_is_dir(path.dentry))
goto notdir; goto notdir;
cachefiles_begin_secure(cache, &saved_cred); cachefiles_begin_secure(cache, &saved_cred);
......
...@@ -277,7 +277,7 @@ static int cachefiles_bury_object(struct cachefiles_cache *cache, ...@@ -277,7 +277,7 @@ static int cachefiles_bury_object(struct cachefiles_cache *cache,
_debug("remove %p from %p", rep, dir); _debug("remove %p from %p", rep, dir);
/* non-directories can just be unlinked */ /* non-directories can just be unlinked */
if (!S_ISDIR(rep->d_inode->i_mode)) { if (!d_is_dir(rep)) {
_debug("unlink stale object"); _debug("unlink stale object");
path.mnt = cache->mnt; path.mnt = cache->mnt;
...@@ -323,7 +323,7 @@ static int cachefiles_bury_object(struct cachefiles_cache *cache, ...@@ -323,7 +323,7 @@ static int cachefiles_bury_object(struct cachefiles_cache *cache,
return 0; return 0;
} }
if (!S_ISDIR(cache->graveyard->d_inode->i_mode)) { if (!d_is_dir(cache->graveyard)) {
unlock_rename(cache->graveyard, dir); unlock_rename(cache->graveyard, dir);
cachefiles_io_error(cache, "Graveyard no longer a directory"); cachefiles_io_error(cache, "Graveyard no longer a directory");
return -EIO; return -EIO;
...@@ -475,7 +475,7 @@ int cachefiles_walk_to_object(struct cachefiles_object *parent, ...@@ -475,7 +475,7 @@ int cachefiles_walk_to_object(struct cachefiles_object *parent,
ASSERT(parent->dentry); ASSERT(parent->dentry);
ASSERT(parent->dentry->d_inode); ASSERT(parent->dentry->d_inode);
if (!(S_ISDIR(parent->dentry->d_inode->i_mode))) { if (!(d_is_dir(parent->dentry))) {
// TODO: convert file to dir // TODO: convert file to dir
_leave("looking up in none directory"); _leave("looking up in none directory");
return -ENOBUFS; return -ENOBUFS;
...@@ -539,7 +539,7 @@ int cachefiles_walk_to_object(struct cachefiles_object *parent, ...@@ -539,7 +539,7 @@ int cachefiles_walk_to_object(struct cachefiles_object *parent,
_debug("mkdir -> %p{%p{ino=%lu}}", _debug("mkdir -> %p{%p{ino=%lu}}",
next, next->d_inode, next->d_inode->i_ino); next, next->d_inode, next->d_inode->i_ino);
} else if (!S_ISDIR(next->d_inode->i_mode)) { } else if (!d_is_dir(next)) {
pr_err("inode %lu is not a directory\n", pr_err("inode %lu is not a directory\n",
next->d_inode->i_ino); next->d_inode->i_ino);
ret = -ENOBUFS; ret = -ENOBUFS;
...@@ -568,8 +568,8 @@ int cachefiles_walk_to_object(struct cachefiles_object *parent, ...@@ -568,8 +568,8 @@ int cachefiles_walk_to_object(struct cachefiles_object *parent,
_debug("create -> %p{%p{ino=%lu}}", _debug("create -> %p{%p{ino=%lu}}",
next, next->d_inode, next->d_inode->i_ino); next, next->d_inode, next->d_inode->i_ino);
} else if (!S_ISDIR(next->d_inode->i_mode) && } else if (!d_is_dir(next) &&
!S_ISREG(next->d_inode->i_mode) !d_is_reg(next)
) { ) {
pr_err("inode %lu is not a file or directory\n", pr_err("inode %lu is not a file or directory\n",
next->d_inode->i_ino); next->d_inode->i_ino);
...@@ -642,7 +642,7 @@ int cachefiles_walk_to_object(struct cachefiles_object *parent, ...@@ -642,7 +642,7 @@ int cachefiles_walk_to_object(struct cachefiles_object *parent,
/* open a file interface onto a data file */ /* open a file interface onto a data file */
if (object->type != FSCACHE_COOKIE_TYPE_INDEX) { if (object->type != FSCACHE_COOKIE_TYPE_INDEX) {
if (S_ISREG(object->dentry->d_inode->i_mode)) { if (d_is_reg(object->dentry)) {
const struct address_space_operations *aops; const struct address_space_operations *aops;
ret = -EPERM; ret = -EPERM;
...@@ -763,7 +763,7 @@ struct dentry *cachefiles_get_directory(struct cachefiles_cache *cache, ...@@ -763,7 +763,7 @@ struct dentry *cachefiles_get_directory(struct cachefiles_cache *cache,
/* we need to make sure the subdir is a directory */ /* we need to make sure the subdir is a directory */
ASSERT(subdir->d_inode); ASSERT(subdir->d_inode);
if (!S_ISDIR(subdir->d_inode->i_mode)) { if (!d_is_dir(subdir)) {
pr_err("%s is not a directory\n", dirname); pr_err("%s is not a directory\n", dirname);
ret = -EIO; ret = -EIO;
goto check_error; goto check_error;
......
...@@ -902,7 +902,7 @@ static int ceph_unlink(struct inode *dir, struct dentry *dentry) ...@@ -902,7 +902,7 @@ static int ceph_unlink(struct inode *dir, struct dentry *dentry)
} else if (ceph_snap(dir) == CEPH_NOSNAP) { } else if (ceph_snap(dir) == CEPH_NOSNAP) {
dout("unlink/rmdir dir %p dn %p inode %p\n", dout("unlink/rmdir dir %p dn %p inode %p\n",
dir, dentry, inode); dir, dentry, inode);
op = S_ISDIR(dentry->d_inode->i_mode) ? op = d_is_dir(dentry) ?
CEPH_MDS_OP_RMDIR : CEPH_MDS_OP_UNLINK; CEPH_MDS_OP_RMDIR : CEPH_MDS_OP_UNLINK;
} else } else
goto out; goto out;
......
...@@ -292,7 +292,7 @@ int ceph_atomic_open(struct inode *dir, struct dentry *dentry, ...@@ -292,7 +292,7 @@ int ceph_atomic_open(struct inode *dir, struct dentry *dentry,
} }
if (err) if (err)
goto out_req; goto out_req;
if (dn || dentry->d_inode == NULL || S_ISLNK(dentry->d_inode->i_mode)) { if (dn || dentry->d_inode == NULL || d_is_symlink(dentry)) {
/* make vfs retry on splice, ENOENT, or symlink */ /* make vfs retry on splice, ENOENT, or symlink */
dout("atomic_open finish_no_open on dn %p\n", dn); dout("atomic_open finish_no_open on dn %p\n", dn);
err = finish_no_open(file, dn); err = finish_no_open(file, dn);
......
...@@ -304,7 +304,7 @@ static int coda_rename(struct inode *old_dir, struct dentry *old_dentry, ...@@ -304,7 +304,7 @@ static int coda_rename(struct inode *old_dir, struct dentry *old_dentry,
(const char *) old_name, (const char *)new_name); (const char *) old_name, (const char *)new_name);
if (!error) { if (!error) {
if (new_dentry->d_inode) { if (new_dentry->d_inode) {
if (S_ISDIR(new_dentry->d_inode->i_mode)) { if (d_is_dir(new_dentry)) {
coda_dir_drop_nlink(old_dir); coda_dir_drop_nlink(old_dir);
coda_dir_inc_nlink(new_dir); coda_dir_inc_nlink(new_dir);
} }
......
...@@ -690,7 +690,7 @@ struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry, ...@@ -690,7 +690,7 @@ struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry,
} }
d_move(old_dentry, dentry); d_move(old_dentry, dentry);
fsnotify_move(old_dir->d_inode, new_dir->d_inode, old_name, fsnotify_move(old_dir->d_inode, new_dir->d_inode, old_name,
S_ISDIR(old_dentry->d_inode->i_mode), d_is_dir(old_dentry),
NULL, old_dentry); NULL, old_dentry);
fsnotify_oldname_free(old_name); fsnotify_oldname_free(old_name);
unlock_rename(new_dir, old_dir); unlock_rename(new_dir, old_dir);
......
...@@ -230,7 +230,7 @@ static int ecryptfs_open(struct inode *inode, struct file *file) ...@@ -230,7 +230,7 @@ static int ecryptfs_open(struct inode *inode, struct file *file)
} }
ecryptfs_set_file_lower( ecryptfs_set_file_lower(
file, ecryptfs_inode_to_private(inode)->lower_file); file, ecryptfs_inode_to_private(inode)->lower_file);
if (S_ISDIR(ecryptfs_dentry->d_inode->i_mode)) { if (d_is_dir(ecryptfs_dentry)) {
ecryptfs_printk(KERN_DEBUG, "This is a directory\n"); ecryptfs_printk(KERN_DEBUG, "This is a directory\n");
mutex_lock(&crypt_stat->cs_mutex); mutex_lock(&crypt_stat->cs_mutex);
crypt_stat->flags &= ~(ECRYPTFS_ENCRYPTED); crypt_stat->flags &= ~(ECRYPTFS_ENCRYPTED);
......
...@@ -907,9 +907,9 @@ static int ecryptfs_setattr(struct dentry *dentry, struct iattr *ia) ...@@ -907,9 +907,9 @@ static int ecryptfs_setattr(struct dentry *dentry, struct iattr *ia)
lower_inode = ecryptfs_inode_to_lower(inode); lower_inode = ecryptfs_inode_to_lower(inode);
lower_dentry = ecryptfs_dentry_to_lower(dentry); lower_dentry = ecryptfs_dentry_to_lower(dentry);
mutex_lock(&crypt_stat->cs_mutex); mutex_lock(&crypt_stat->cs_mutex);
if (S_ISDIR(dentry->d_inode->i_mode)) if (d_is_dir(dentry))
crypt_stat->flags &= ~(ECRYPTFS_ENCRYPTED); crypt_stat->flags &= ~(ECRYPTFS_ENCRYPTED);
else if (S_ISREG(dentry->d_inode->i_mode) else if (d_is_reg(dentry)
&& (!(crypt_stat->flags & ECRYPTFS_POLICY_APPLIED) && (!(crypt_stat->flags & ECRYPTFS_POLICY_APPLIED)
|| !(crypt_stat->flags & ECRYPTFS_KEY_VALID))) { || !(crypt_stat->flags & ECRYPTFS_KEY_VALID))) {
struct ecryptfs_mount_crypt_stat *mount_crypt_stat; struct ecryptfs_mount_crypt_stat *mount_crypt_stat;
......
...@@ -429,7 +429,7 @@ struct dentry *exportfs_decode_fh(struct vfsmount *mnt, struct fid *fid, ...@@ -429,7 +429,7 @@ struct dentry *exportfs_decode_fh(struct vfsmount *mnt, struct fid *fid,
if (IS_ERR(result)) if (IS_ERR(result))
return result; return result;
if (S_ISDIR(result->d_inode->i_mode)) { if (d_is_dir(result)) {
/* /*
* This request is for a directory. * This request is for a directory.
* *
......
...@@ -971,7 +971,7 @@ int fuse_reverse_inval_entry(struct super_block *sb, u64 parent_nodeid, ...@@ -971,7 +971,7 @@ int fuse_reverse_inval_entry(struct super_block *sb, u64 parent_nodeid,
err = -EBUSY; err = -EBUSY;
goto badentry; goto badentry;
} }
if (S_ISDIR(entry->d_inode->i_mode)) { if (d_is_dir(entry)) {
shrink_dcache_parent(entry); shrink_dcache_parent(entry);
if (!simple_empty(entry)) { if (!simple_empty(entry)) {
err = -ENOTEMPTY; err = -ENOTEMPTY;
......
...@@ -1809,7 +1809,7 @@ int gfs2_dir_del(struct gfs2_inode *dip, const struct dentry *dentry) ...@@ -1809,7 +1809,7 @@ int gfs2_dir_del(struct gfs2_inode *dip, const struct dentry *dentry)
gfs2_consist_inode(dip); gfs2_consist_inode(dip);
dip->i_entries--; dip->i_entries--;
dip->i_inode.i_mtime = dip->i_inode.i_ctime = tv; dip->i_inode.i_mtime = dip->i_inode.i_ctime = tv;
if (S_ISDIR(dentry->d_inode->i_mode)) if (d_is_dir(dentry))
drop_nlink(&dip->i_inode); drop_nlink(&dip->i_inode);
mark_inode_dirty(&dip->i_inode); mark_inode_dirty(&dip->i_inode);
......
...@@ -530,7 +530,7 @@ static int hfsplus_rename(struct inode *old_dir, struct dentry *old_dentry, ...@@ -530,7 +530,7 @@ static int hfsplus_rename(struct inode *old_dir, struct dentry *old_dentry,
/* Unlink destination if it already exists */ /* Unlink destination if it already exists */
if (new_dentry->d_inode) { if (new_dentry->d_inode) {
if (S_ISDIR(new_dentry->d_inode->i_mode)) if (d_is_dir(new_dentry))
res = hfsplus_rmdir(new_dir, new_dentry); res = hfsplus_rmdir(new_dir, new_dentry);
else else
res = hfsplus_unlink(new_dir, new_dentry); res = hfsplus_unlink(new_dir, new_dentry);
......
...@@ -678,10 +678,10 @@ static struct inode *get_inode(struct super_block *sb, struct dentry *dentry) ...@@ -678,10 +678,10 @@ static struct inode *get_inode(struct super_block *sb, struct dentry *dentry)
return NULL; return NULL;
} }
if (S_ISDIR(dentry->d_inode->i_mode)) { if (d_is_dir(dentry)) {
inode->i_op = &hppfs_dir_iops; inode->i_op = &hppfs_dir_iops;
inode->i_fop = &hppfs_dir_fops; inode->i_fop = &hppfs_dir_fops;
} else if (S_ISLNK(dentry->d_inode->i_mode)) { } else if (d_is_symlink(dentry)) {
inode->i_op = &hppfs_link_iops; inode->i_op = &hppfs_link_iops;
inode->i_fop = &hppfs_file_fops; inode->i_fop = &hppfs_file_fops;
} else { } else {
......
...@@ -252,7 +252,7 @@ static int jffs2_link (struct dentry *old_dentry, struct inode *dir_i, struct de ...@@ -252,7 +252,7 @@ static int jffs2_link (struct dentry *old_dentry, struct inode *dir_i, struct de
if (!f->inocache) if (!f->inocache)
return -EIO; return -EIO;
if (S_ISDIR(old_dentry->d_inode->i_mode)) if (d_is_dir(old_dentry))
return -EPERM; return -EPERM;
/* XXX: This is ugly */ /* XXX: This is ugly */
...@@ -772,7 +772,7 @@ static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry, ...@@ -772,7 +772,7 @@ static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
*/ */
if (new_dentry->d_inode) { if (new_dentry->d_inode) {
victim_f = JFFS2_INODE_INFO(new_dentry->d_inode); victim_f = JFFS2_INODE_INFO(new_dentry->d_inode);
if (S_ISDIR(new_dentry->d_inode->i_mode)) { if (d_is_dir(new_dentry)) {
struct jffs2_full_dirent *fd; struct jffs2_full_dirent *fd;
mutex_lock(&victim_f->sem); mutex_lock(&victim_f->sem);
...@@ -807,7 +807,7 @@ static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry, ...@@ -807,7 +807,7 @@ static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
if (victim_f) { if (victim_f) {
/* There was a victim. Kill it off nicely */ /* There was a victim. Kill it off nicely */
if (S_ISDIR(new_dentry->d_inode->i_mode)) if (d_is_dir(new_dentry))
clear_nlink(new_dentry->d_inode); clear_nlink(new_dentry->d_inode);
else else
drop_nlink(new_dentry->d_inode); drop_nlink(new_dentry->d_inode);
...@@ -815,7 +815,7 @@ static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry, ...@@ -815,7 +815,7 @@ static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
inode which didn't exist. */ inode which didn't exist. */
if (victim_f->inocache) { if (victim_f->inocache) {
mutex_lock(&victim_f->sem); mutex_lock(&victim_f->sem);
if (S_ISDIR(new_dentry->d_inode->i_mode)) if (d_is_dir(new_dentry))
victim_f->inocache->pino_nlink = 0; victim_f->inocache->pino_nlink = 0;
else else
victim_f->inocache->pino_nlink--; victim_f->inocache->pino_nlink--;
...@@ -825,7 +825,7 @@ static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry, ...@@ -825,7 +825,7 @@ static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
/* If it was a directory we moved, and there was no victim, /* If it was a directory we moved, and there was no victim,
increase i_nlink on its new parent */ increase i_nlink on its new parent */
if (S_ISDIR(old_dentry->d_inode->i_mode) && !victim_f) if (d_is_dir(old_dentry) && !victim_f)
inc_nlink(new_dir_i); inc_nlink(new_dir_i);
/* Unlink the original */ /* Unlink the original */
...@@ -839,7 +839,7 @@ static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry, ...@@ -839,7 +839,7 @@ static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode); struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
mutex_lock(&f->sem); mutex_lock(&f->sem);
inc_nlink(old_dentry->d_inode); inc_nlink(old_dentry->d_inode);
if (f->inocache && !S_ISDIR(old_dentry->d_inode->i_mode)) if (f->inocache && !d_is_dir(old_dentry))
f->inocache->pino_nlink++; f->inocache->pino_nlink++;
mutex_unlock(&f->sem); mutex_unlock(&f->sem);
...@@ -852,7 +852,7 @@ static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry, ...@@ -852,7 +852,7 @@ static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
return ret; return ret;
} }
if (S_ISDIR(old_dentry->d_inode->i_mode)) if (d_is_dir(old_dentry))
drop_nlink(old_dir_i); drop_nlink(old_dir_i);
new_dir_i->i_mtime = new_dir_i->i_ctime = old_dir_i->i_mtime = old_dir_i->i_ctime = ITIME(now); new_dir_i->i_mtime = new_dir_i->i_ctime = old_dir_i->i_mtime = old_dir_i->i_ctime = ITIME(now);
......
...@@ -138,7 +138,7 @@ static struct dentry *jffs2_get_parent(struct dentry *child) ...@@ -138,7 +138,7 @@ static struct dentry *jffs2_get_parent(struct dentry *child)
struct jffs2_inode_info *f; struct jffs2_inode_info *f;
uint32_t pino; uint32_t pino;
BUG_ON(!S_ISDIR(child->d_inode->i_mode)); BUG_ON(!d_is_dir(child));
f = JFFS2_INODE_INFO(child->d_inode); f = JFFS2_INODE_INFO(child->d_inode);
......
...@@ -329,7 +329,7 @@ int simple_rename(struct inode *old_dir, struct dentry *old_dentry, ...@@ -329,7 +329,7 @@ int simple_rename(struct inode *old_dir, struct dentry *old_dentry,
struct inode *new_dir, struct dentry *new_dentry) struct inode *new_dir, struct dentry *new_dentry)
{ {
struct inode *inode = old_dentry->d_inode; struct inode *inode = old_dentry->d_inode;
int they_are_dirs = S_ISDIR(old_dentry->d_inode->i_mode); int they_are_dirs = d_is_dir(old_dentry);
if (!simple_empty(new_dentry)) if (!simple_empty(new_dentry))
return -ENOTEMPTY; return -ENOTEMPTY;
......
...@@ -2814,7 +2814,7 @@ static int atomic_open(struct nameidata *nd, struct dentry *dentry, ...@@ -2814,7 +2814,7 @@ static int atomic_open(struct nameidata *nd, struct dentry *dentry,
} else if (!dentry->d_inode) { } else if (!dentry->d_inode) {
goto out; goto out;
} else if ((open_flag & O_TRUNC) && } else if ((open_flag & O_TRUNC) &&
S_ISREG(dentry->d_inode->i_mode)) { d_is_reg(dentry)) {
goto out; goto out;
} }
/* will fail later, go on to get the right error */ /* will fail later, go on to get the right error */
......
...@@ -1907,8 +1907,8 @@ static int graft_tree(struct mount *mnt, struct mount *p, struct mountpoint *mp) ...@@ -1907,8 +1907,8 @@ static int graft_tree(struct mount *mnt, struct mount *p, struct mountpoint *mp)
if (mnt->mnt.mnt_sb->s_flags & MS_NOUSER) if (mnt->mnt.mnt_sb->s_flags & MS_NOUSER)
return -EINVAL; return -EINVAL;
if (S_ISDIR(mp->m_dentry->d_inode->i_mode) != if (d_is_dir(mp->m_dentry) !=
S_ISDIR(mnt->mnt.mnt_root->d_inode->i_mode)) d_is_dir(mnt->mnt.mnt_root))
return -ENOTDIR; return -ENOTDIR;
return attach_recursive_mnt(mnt, p, mp, NULL); return attach_recursive_mnt(mnt, p, mp, NULL);
...@@ -2180,8 +2180,8 @@ static int do_move_mount(struct path *path, const char *old_name) ...@@ -2180,8 +2180,8 @@ static int do_move_mount(struct path *path, const char *old_name)
if (!mnt_has_parent(old)) if (!mnt_has_parent(old))
goto out1; goto out1;
if (S_ISDIR(path->dentry->d_inode->i_mode) != if (d_is_dir(path->dentry) !=
S_ISDIR(old_path.dentry->d_inode->i_mode)) d_is_dir(old_path.dentry))
goto out1; goto out1;
/* /*
* Don't move a mount residing in a shared parent. * Don't move a mount residing in a shared parent.
...@@ -2271,7 +2271,7 @@ static int do_add_mount(struct mount *newmnt, struct path *path, int mnt_flags) ...@@ -2271,7 +2271,7 @@ static int do_add_mount(struct mount *newmnt, struct path *path, int mnt_flags)
goto unlock; goto unlock;
err = -EINVAL; err = -EINVAL;
if (S_ISLNK(newmnt->mnt.mnt_root->d_inode->i_mode)) if (d_is_symlink(newmnt->mnt.mnt_root))
goto unlock; goto unlock;
newmnt->mnt.mnt_flags = mnt_flags; newmnt->mnt.mnt_flags = mnt_flags;
......
...@@ -583,7 +583,7 @@ nfs4_reset_recoverydir(char *recdir) ...@@ -583,7 +583,7 @@ nfs4_reset_recoverydir(char *recdir)
if (status) if (status)
return status; return status;
status = -ENOTDIR; status = -ENOTDIR;
if (S_ISDIR(path.dentry->d_inode->i_mode)) { if (d_is_dir(path.dentry)) {
strcpy(user_recovery_dirname, recdir); strcpy(user_recovery_dirname, recdir);
status = 0; status = 0;
} }
...@@ -1426,7 +1426,7 @@ nfsd4_client_tracking_init(struct net *net) ...@@ -1426,7 +1426,7 @@ nfsd4_client_tracking_init(struct net *net)
nn->client_tracking_ops = &nfsd4_legacy_tracking_ops; nn->client_tracking_ops = &nfsd4_legacy_tracking_ops;
status = kern_path(nfs4_recoverydir(), LOOKUP_FOLLOW, &path); status = kern_path(nfs4_recoverydir(), LOOKUP_FOLLOW, &path);
if (!status) { if (!status) {
status = S_ISDIR(path.dentry->d_inode->i_mode); status = d_is_dir(path.dentry);
path_put(&path); path_put(&path);
if (status) if (status)
goto do_init; goto do_init;
......
...@@ -114,8 +114,8 @@ static inline __be32 check_pseudo_root(struct svc_rqst *rqstp, ...@@ -114,8 +114,8 @@ static inline __be32 check_pseudo_root(struct svc_rqst *rqstp,
* We're exposing only the directories and symlinks that have to be * We're exposing only the directories and symlinks that have to be
* traversed on the way to real exports: * traversed on the way to real exports:
*/ */
if (unlikely(!S_ISDIR(dentry->d_inode->i_mode) && if (unlikely(!d_is_dir(dentry) &&
!S_ISLNK(dentry->d_inode->i_mode))) !d_is_symlink(dentry)))
return nfserr_stale; return nfserr_stale;
/* /*
* A pseudoroot export gives permission to access only one * A pseudoroot export gives permission to access only one
...@@ -259,7 +259,7 @@ static __be32 nfsd_set_fh_dentry(struct svc_rqst *rqstp, struct svc_fh *fhp) ...@@ -259,7 +259,7 @@ static __be32 nfsd_set_fh_dentry(struct svc_rqst *rqstp, struct svc_fh *fhp)
goto out; goto out;
} }
if (S_ISDIR(dentry->d_inode->i_mode) && if (d_is_dir(dentry) &&
(dentry->d_flags & DCACHE_DISCONNECTED)) { (dentry->d_flags & DCACHE_DISCONNECTED)) {
printk("nfsd: find_fh_dentry returned a DISCONNECTED directory: %pd2\n", printk("nfsd: find_fh_dentry returned a DISCONNECTED directory: %pd2\n",
dentry); dentry);
...@@ -414,7 +414,7 @@ static inline void _fh_update_old(struct dentry *dentry, ...@@ -414,7 +414,7 @@ static inline void _fh_update_old(struct dentry *dentry,
{ {
fh->ofh_ino = ino_t_to_u32(dentry->d_inode->i_ino); fh->ofh_ino = ino_t_to_u32(dentry->d_inode->i_ino);
fh->ofh_generation = dentry->d_inode->i_generation; fh->ofh_generation = dentry->d_inode->i_generation;
if (S_ISDIR(dentry->d_inode->i_mode) || if (d_is_dir(dentry) ||
(exp->ex_flags & NFSEXP_NOSUBTREECHECK)) (exp->ex_flags & NFSEXP_NOSUBTREECHECK))
fh->ofh_dirino = 0; fh->ofh_dirino = 0;
} }
......
...@@ -615,9 +615,9 @@ nfsd_access(struct svc_rqst *rqstp, struct svc_fh *fhp, u32 *access, u32 *suppor ...@@ -615,9 +615,9 @@ nfsd_access(struct svc_rqst *rqstp, struct svc_fh *fhp, u32 *access, u32 *suppor
export = fhp->fh_export; export = fhp->fh_export;
dentry = fhp->fh_dentry; dentry = fhp->fh_dentry;
if (S_ISREG(dentry->d_inode->i_mode)) if (d_is_reg(dentry))
map = nfs3_regaccess; map = nfs3_regaccess;
else if (S_ISDIR(dentry->d_inode->i_mode)) else if (d_is_dir(dentry))
map = nfs3_diraccess; map = nfs3_diraccess;
else else
map = nfs3_anyaccess; map = nfs3_anyaccess;
...@@ -1402,7 +1402,7 @@ do_nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp, ...@@ -1402,7 +1402,7 @@ do_nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp,
switch (createmode) { switch (createmode) {
case NFS3_CREATE_UNCHECKED: case NFS3_CREATE_UNCHECKED:
if (! S_ISREG(dchild->d_inode->i_mode)) if (! d_is_reg(dchild))
goto out; goto out;
else if (truncp) { else if (truncp) {
/* in nfsv4, we need to treat this case a little /* in nfsv4, we need to treat this case a little
...@@ -1615,7 +1615,7 @@ nfsd_link(struct svc_rqst *rqstp, struct svc_fh *ffhp, ...@@ -1615,7 +1615,7 @@ nfsd_link(struct svc_rqst *rqstp, struct svc_fh *ffhp,
if (err) if (err)
goto out; goto out;
err = nfserr_isdir; err = nfserr_isdir;
if (S_ISDIR(tfhp->fh_dentry->d_inode->i_mode)) if (d_is_dir(tfhp->fh_dentry))
goto out; goto out;
err = nfserr_perm; err = nfserr_perm;
if (!len) if (!len)
......
...@@ -115,8 +115,8 @@ static bool fanotify_should_send_event(struct fsnotify_mark *inode_mark, ...@@ -115,8 +115,8 @@ static bool fanotify_should_send_event(struct fsnotify_mark *inode_mark,
return false; return false;
/* sorry, fanotify only gives a damn about files and dirs */ /* sorry, fanotify only gives a damn about files and dirs */
if (!S_ISREG(path->dentry->d_inode->i_mode) && if (!d_is_reg(path->dentry) &&
!S_ISDIR(path->dentry->d_inode->i_mode)) !d_is_dir(path->dentry))
return false; return false;
if (inode_mark && vfsmnt_mark) { if (inode_mark && vfsmnt_mark) {
...@@ -139,7 +139,7 @@ static bool fanotify_should_send_event(struct fsnotify_mark *inode_mark, ...@@ -139,7 +139,7 @@ static bool fanotify_should_send_event(struct fsnotify_mark *inode_mark,
BUG(); BUG();
} }
if (S_ISDIR(path->dentry->d_inode->i_mode) && if (d_is_dir(path->dentry) &&
!(marks_mask & FS_ISDIR & ~marks_ignored_mask)) !(marks_mask & FS_ISDIR & ~marks_ignored_mask))
return false; return false;
......
...@@ -19,7 +19,7 @@ void ovl_cleanup(struct inode *wdir, struct dentry *wdentry) ...@@ -19,7 +19,7 @@ void ovl_cleanup(struct inode *wdir, struct dentry *wdentry)
int err; int err;
dget(wdentry); dget(wdentry);
if (S_ISDIR(wdentry->d_inode->i_mode)) if (d_is_dir(wdentry))
err = ovl_do_rmdir(wdir, wdentry); err = ovl_do_rmdir(wdir, wdentry);
else else
err = ovl_do_unlink(wdir, wdentry); err = ovl_do_unlink(wdir, wdentry);
...@@ -693,7 +693,7 @@ static int ovl_rename2(struct inode *olddir, struct dentry *old, ...@@ -693,7 +693,7 @@ static int ovl_rename2(struct inode *olddir, struct dentry *old,
bool new_create = false; bool new_create = false;
bool cleanup_whiteout = false; bool cleanup_whiteout = false;
bool overwrite = !(flags & RENAME_EXCHANGE); bool overwrite = !(flags & RENAME_EXCHANGE);
bool is_dir = S_ISDIR(old->d_inode->i_mode); bool is_dir = d_is_dir(old);
bool new_is_dir = false; bool new_is_dir = false;
struct dentry *opaquedir = NULL; struct dentry *opaquedir = NULL;
const struct cred *old_cred = NULL; const struct cred *old_cred = NULL;
...@@ -720,7 +720,7 @@ static int ovl_rename2(struct inode *olddir, struct dentry *old, ...@@ -720,7 +720,7 @@ static int ovl_rename2(struct inode *olddir, struct dentry *old,
if (err) if (err)
goto out; goto out;
if (S_ISDIR(new->d_inode->i_mode)) if (d_is_dir(new))
new_is_dir = true; new_is_dir = true;
new_type = ovl_path_type(new); new_type = ovl_path_type(new);
......
...@@ -776,7 +776,7 @@ posix_acl_xattr_get(struct dentry *dentry, const char *name, ...@@ -776,7 +776,7 @@ posix_acl_xattr_get(struct dentry *dentry, const char *name,
if (!IS_POSIXACL(dentry->d_inode)) if (!IS_POSIXACL(dentry->d_inode))
return -EOPNOTSUPP; return -EOPNOTSUPP;
if (S_ISLNK(dentry->d_inode->i_mode)) if (d_is_symlink(dentry))
return -EOPNOTSUPP; return -EOPNOTSUPP;
acl = get_acl(dentry->d_inode, type); acl = get_acl(dentry->d_inode, type);
...@@ -836,7 +836,7 @@ posix_acl_xattr_list(struct dentry *dentry, char *list, size_t list_size, ...@@ -836,7 +836,7 @@ posix_acl_xattr_list(struct dentry *dentry, char *list, size_t list_size,
if (!IS_POSIXACL(dentry->d_inode)) if (!IS_POSIXACL(dentry->d_inode))
return -EOPNOTSUPP; return -EOPNOTSUPP;
if (S_ISLNK(dentry->d_inode->i_mode)) if (d_is_symlink(dentry))
return -EOPNOTSUPP; return -EOPNOTSUPP;
if (type == ACL_TYPE_ACCESS) if (type == ACL_TYPE_ACCESS)
......
...@@ -266,7 +266,7 @@ static int reiserfs_for_each_xattr(struct inode *inode, ...@@ -266,7 +266,7 @@ static int reiserfs_for_each_xattr(struct inode *inode,
for (i = 0; !err && i < buf.count && buf.dentries[i]; i++) { for (i = 0; !err && i < buf.count && buf.dentries[i]; i++) {
struct dentry *dentry = buf.dentries[i]; struct dentry *dentry = buf.dentries[i];
if (!S_ISDIR(dentry->d_inode->i_mode)) if (!d_is_dir(dentry))
err = action(dentry, data); err = action(dentry, data);
dput(dentry); dput(dentry);
...@@ -322,7 +322,7 @@ static int delete_one_xattr(struct dentry *dentry, void *data) ...@@ -322,7 +322,7 @@ static int delete_one_xattr(struct dentry *dentry, void *data)
struct inode *dir = dentry->d_parent->d_inode; struct inode *dir = dentry->d_parent->d_inode;
/* This is the xattr dir, handle specially. */ /* This is the xattr dir, handle specially. */
if (S_ISDIR(dentry->d_inode->i_mode)) if (d_is_dir(dentry))
return xattr_rmdir(dir, dentry); return xattr_rmdir(dir, dentry);
return xattr_unlink(dir, dentry); return xattr_unlink(dir, dentry);
......
...@@ -286,7 +286,7 @@ xfs_readlink_by_handle( ...@@ -286,7 +286,7 @@ xfs_readlink_by_handle(
return PTR_ERR(dentry); return PTR_ERR(dentry);
/* Restrict this handle operation to symlinks only. */ /* Restrict this handle operation to symlinks only. */
if (!S_ISLNK(dentry->d_inode->i_mode)) { if (!d_is_symlink(dentry)) {
error = -EINVAL; error = -EINVAL;
goto out_dput; goto out_dput;
} }
......
...@@ -2319,8 +2319,8 @@ static int shmem_rmdir(struct inode *dir, struct dentry *dentry) ...@@ -2319,8 +2319,8 @@ static int shmem_rmdir(struct inode *dir, struct dentry *dentry)
static int shmem_exchange(struct inode *old_dir, struct dentry *old_dentry, struct inode *new_dir, struct dentry *new_dentry) static int shmem_exchange(struct inode *old_dir, struct dentry *old_dentry, struct inode *new_dir, struct dentry *new_dentry)
{ {
bool old_is_dir = S_ISDIR(old_dentry->d_inode->i_mode); bool old_is_dir = d_is_dir(old_dentry);
bool new_is_dir = S_ISDIR(new_dentry->d_inode->i_mode); bool new_is_dir = d_is_dir(new_dentry);
if (old_dir != new_dir && old_is_dir != new_is_dir) { if (old_dir != new_dir && old_is_dir != new_is_dir) {
if (old_is_dir) { if (old_is_dir) {
......
...@@ -203,7 +203,7 @@ void securityfs_remove(struct dentry *dentry) ...@@ -203,7 +203,7 @@ void securityfs_remove(struct dentry *dentry)
mutex_lock(&parent->d_inode->i_mutex); mutex_lock(&parent->d_inode->i_mutex);
if (positive(dentry)) { if (positive(dentry)) {
if (dentry->d_inode) { if (dentry->d_inode) {
if (S_ISDIR(dentry->d_inode->i_mode)) if (d_is_dir(dentry))
simple_rmdir(parent->d_inode, dentry); simple_rmdir(parent->d_inode, dentry);
else else
simple_unlink(parent->d_inode, dentry); simple_unlink(parent->d_inode, dentry);
......
...@@ -1799,7 +1799,7 @@ static inline int may_rename(struct inode *old_dir, ...@@ -1799,7 +1799,7 @@ static inline int may_rename(struct inode *old_dir,
old_dsec = old_dir->i_security; old_dsec = old_dir->i_security;
old_isec = old_dentry->d_inode->i_security; old_isec = old_dentry->d_inode->i_security;
old_is_dir = S_ISDIR(old_dentry->d_inode->i_mode); old_is_dir = d_is_dir(old_dentry);
new_dsec = new_dir->i_security; new_dsec = new_dir->i_security;
ad.type = LSM_AUDIT_DATA_DENTRY; ad.type = LSM_AUDIT_DATA_DENTRY;
...@@ -1829,7 +1829,7 @@ static inline int may_rename(struct inode *old_dir, ...@@ -1829,7 +1829,7 @@ static inline int may_rename(struct inode *old_dir,
return rc; return rc;
if (d_is_positive(new_dentry)) { if (d_is_positive(new_dentry)) {
new_isec = new_dentry->d_inode->i_security; new_isec = new_dentry->d_inode->i_security;
new_is_dir = S_ISDIR(new_dentry->d_inode->i_mode); new_is_dir = d_is_dir(new_dentry);
rc = avc_has_perm(sid, new_isec->sid, rc = avc_has_perm(sid, new_isec->sid,
new_isec->sclass, new_isec->sclass,
(new_is_dir ? DIR__RMDIR : FILE__UNLINK), &ad); (new_is_dir ? DIR__RMDIR : FILE__UNLINK), &ad);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment