On Wed, Jul 27, 2011 at 08:34:22PM -0400, Ted Ts'o wrote: > > > + dentry = list_first_entry(&inode->i_dentry, > > > + struct dentry, d_alias); > > > > ... and what if you don't have a dentry for that inode anymore? > > I thought you were complaining that dentry could never be NULL > earlier? We earlier checked for NULL, but I figured you knew > something I didn't.... The pointer won't be NULL, of course, but what guarantees that inode->i_dentry won't be *empty*? IOW, you could get a perfectly non-NULL pointer, equal to (char *)inode + offsetof(struct inode, i_dentry) - offsetof(struct dentry, d_alias) and treating it as struct dentry * won't do you any good... > > > + next = igrab(dentry->d_parent->d_inode); > > > > what protects you against rename() (OK, d_mode()) here? > > Does it matter? We'll get either the old or the new parent directory, > but either way it will be a valid inode, right? Or am I missing > something? Once d_move() has happened, there's nothing to protect the old parent anymore... Granted, it's a hell of a narrow race window, but you need at least ->d_lock on your dentry... -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html