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

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);
......
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