struct xfs_icreate_args args = {
.idmap = libxfs_nop_idmap,
.mode = S_IFREG | 0600,
- .flags = XFS_ICREATE_TMPFILE,
+ .flags = XFS_ICREATE_TMPFILE | XFS_ICREATE_UNLINKABLE,
};
struct xfs_inode *ip;
struct xfs_trans *tp;
}
}
+/*
+ * If we need to create attributes immediately after allocating the inode,
+ * initialise an empty attribute fork right now. We use the default fork offset
+ * for attributes here as we don't know exactly what size or how many
+ * attributes we might be adding. We can do this safely here because we know
+ * the data fork is completely empty and this saves us from needing to run a
+ * separate transaction to set the fork offset in the immediate future.
+ *
+ * If we have parent pointers and the caller hasn't told us that the file will
+ * never be linked into a directory tree, we /must/ create the attr fork.
+ */
+static inline bool
+xfs_icreate_want_attrfork(
+ struct xfs_mount *mp,
+ const struct xfs_icreate_args *args)
+{
+ if (args->flags & XFS_ICREATE_INIT_XATTRS)
+ return true;
+
+ if (!(args->flags & XFS_ICREATE_UNLINKABLE) && xfs_has_parent(mp))
+ return true;
+
+ return false;
+}
+
/* Initialise an inode's attributes. */
void
xfs_inode_init(
ASSERT(0);
}
- /*
- * If we need to create attributes immediately after allocating the
- * inode, initialise an empty attribute fork right now. We use the
- * default fork offset for attributes here as we don't know exactly what
- * size or how many attributes we might be adding. We can do this
- * safely here because we know the data fork is completely empty and
- * this saves us from needing to run a separate transaction to set the
- * fork offset in the immediate future.
- */
- if (args->flags & XFS_ICREATE_INIT_XATTRS) {
+ if (xfs_icreate_want_attrfork(mp, args)) {
ip->i_forkoff = xfs_default_attroffset(ip) >> 3;
xfs_ifork_init_attr(ip, XFS_DINODE_FMT_EXTENTS, 0);
xfs_ino_t ino;
int error;
- if (dp && xfs_has_parent(dp->i_mount))
- args.flags |= XFS_ICREATE_INIT_XATTRS;
+ /* Root directories cannot be linked to a parent. */
+ if (!dp)
+ args.flags |= XFS_ICREATE_UNLINKABLE;
/*
* Call the space management code to pick the on-disk inode to be
struct xfs_name xname;
struct xfs_parent_args *ppargs = NULL;
- if (xfs_has_parent(mp))
- args.flags |= XFS_ICREATE_INIT_XATTRS;
-
i = -libxfs_parent_start(mp, &ppargs);
if (i)
do_error(_("%d - couldn't allocate parent pointer for %s\n"),