static int ovl_create_object(struct dentry *dentry, int mode, dev_t rdev, const char *link) { int err; struct inode *inode; struct ovl_cattr attr = { .rdev = rdev, .link = link, }; err = ovl_want_write(dentry); if (err) goto out; /* Preallocate inode to be used by ovl_get_inode() */ err = -ENOMEM; inode = ovl_new_inode(dentry->d_sb, mode, rdev); if (!inode) goto out_drop_write; inode_init_owner(inode, dentry->d_parent->d_inode, mode); attr.mode = inode->i_mode; err = ovl_create_or_link(dentry, inode, &attr, false); /* Did we end up using the preallocated inode? */ if (inode != d_inode(dentry)) iput(inode); out_drop_write: ovl_drop_write(dentry); out: return err; }
static int ovl_create_object(struct dentry *dentry, int mode, dev_t rdev, const char *link) { int err; struct inode *inode; struct kstat stat = { .rdev = rdev, }; err = ovl_want_write(dentry); if (err) goto out; err = -ENOMEM; inode = ovl_new_inode(dentry->d_sb, mode); if (!inode) goto out_drop_write; inode_init_owner(inode, dentry->d_parent->d_inode, mode); stat.mode = inode->i_mode; err = ovl_create_or_link(dentry, inode, &stat, link, NULL); if (err) iput(inode); out_drop_write: ovl_drop_write(dentry); out: return err; }
static int ovl_create_object(struct dentry *dentry, int mode, dev_t rdev, const char *link) { int err; err = ovl_want_write(dentry); if (!err) { err = ovl_create_or_link(dentry, mode, rdev, link, NULL); ovl_drop_write(dentry); } return err; }