Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

configfs: make configfs_create() return inode

Get rid of the callback, deal with that and dentry in callers

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Christoph Hellwig <hch@lst.de>

authored by

Al Viro and committed by
Christoph Hellwig
2743c515 1cf7a003

+39 -59
+1 -1
fs/configfs/configfs_internal.h
··· 66 66 extern int configfs_is_root(struct config_item *item); 67 67 68 68 extern struct inode * configfs_new_inode(umode_t mode, struct configfs_dirent *, struct super_block *); 69 - extern int configfs_create(struct dentry *, umode_t mode, void (*init)(struct inode *)); 69 + extern struct inode *configfs_create(struct dentry *, umode_t mode); 70 70 71 71 extern int configfs_create_file(struct config_item *, const struct configfs_attribute *); 72 72 extern int configfs_create_bin_file(struct config_item *,
+33 -39
fs/configfs/dir.c
··· 265 265 configfs_put(sd); 266 266 } 267 267 268 - static void init_dir(struct inode * inode) 269 - { 270 - inode->i_op = &configfs_dir_inode_operations; 271 - inode->i_fop = &configfs_dir_operations; 272 - 273 - /* directory inodes start off with i_nlink == 2 (for "." entry) */ 274 - inc_nlink(inode); 275 - } 276 - 277 - static void configfs_init_file(struct inode * inode) 278 - { 279 - inode->i_size = PAGE_SIZE; 280 - inode->i_fop = &configfs_file_operations; 281 - } 282 - 283 - static void configfs_init_bin_file(struct inode *inode) 284 - { 285 - inode->i_size = 0; 286 - inode->i_fop = &configfs_bin_file_operations; 287 - } 288 - 289 - static void init_symlink(struct inode * inode) 290 - { 291 - inode->i_op = &configfs_symlink_inode_operations; 292 - } 293 - 294 268 /** 295 269 * configfs_create_dir - create a directory for an config_item. 296 270 * @item: config_itemwe're creating directory for. ··· 280 306 int error; 281 307 umode_t mode = S_IFDIR| S_IRWXU | S_IRUGO | S_IXUGO; 282 308 struct dentry *p = dentry->d_parent; 309 + struct inode *inode; 283 310 284 311 BUG_ON(!item); 285 312 ··· 295 320 return error; 296 321 297 322 configfs_set_dir_dirent_depth(p->d_fsdata, dentry->d_fsdata); 298 - error = configfs_create(dentry, mode, init_dir); 299 - if (error) 323 + inode = configfs_create(dentry, mode); 324 + if (IS_ERR(inode)) 300 325 goto out_remove; 301 326 327 + inode->i_op = &configfs_dir_inode_operations; 328 + inode->i_fop = &configfs_dir_operations; 329 + /* directory inodes start off with i_nlink == 2 (for "." entry) */ 330 + inc_nlink(inode); 331 + d_instantiate(dentry, inode); 332 + /* already hashed */ 333 + dget(dentry); /* pin directory dentries in core */ 302 334 inc_nlink(d_inode(p)); 303 335 item->ci_dentry = dentry; 304 336 return 0; 305 337 306 338 out_remove: 307 339 configfs_remove_dirent(dentry); 308 - return error; 340 + return PTR_ERR(inode); 309 341 } 310 342 311 343 /* ··· 360 378 int err = 0; 361 379 umode_t mode = S_IFLNK | S_IRWXUGO; 362 380 struct configfs_dirent *p = parent->d_fsdata; 381 + struct inode *inode; 363 382 364 383 err = configfs_make_dirent(p, dentry, sl, mode, 365 384 CONFIGFS_ITEM_LINK, p->s_frag); 366 385 if (err) 367 386 return err; 368 387 369 - err = configfs_create(dentry, mode, init_symlink); 370 - if (err) 388 + inode = configfs_create(dentry, mode); 389 + if (IS_ERR(inode)) 371 390 goto out_remove; 391 + 392 + inode->i_op = &configfs_symlink_inode_operations; 393 + d_instantiate(dentry, inode); 394 + dget(dentry); /* pin link dentries in core */ 372 395 return 0; 373 396 374 397 out_remove: 375 398 configfs_remove_dirent(dentry); 376 - return err; 399 + return PTR_ERR(inode); 377 400 } 378 401 379 402 static void remove_dir(struct dentry * d) ··· 427 440 static int configfs_attach_attr(struct configfs_dirent * sd, struct dentry * dentry) 428 441 { 429 442 struct configfs_attribute * attr = sd->s_element; 430 - int error; 443 + struct inode *inode; 431 444 432 445 spin_lock(&configfs_dirent_lock); 433 446 dentry->d_fsdata = configfs_get(sd); 434 447 sd->s_dentry = dentry; 435 448 spin_unlock(&configfs_dirent_lock); 436 449 437 - error = configfs_create(dentry, (attr->ca_mode & S_IALLUGO) | S_IFREG, 438 - (sd->s_type & CONFIGFS_ITEM_BIN_ATTR) ? 439 - configfs_init_bin_file : 440 - configfs_init_file); 441 - if (error) 450 + inode = configfs_create(dentry, (attr->ca_mode & S_IALLUGO) | S_IFREG); 451 + if (IS_ERR(inode)) { 442 452 configfs_put(sd); 443 - return error; 453 + return PTR_ERR(inode); 454 + } 455 + if (sd->s_type & CONFIGFS_ITEM_BIN_ATTR) { 456 + inode->i_size = 0; 457 + inode->i_fop = &configfs_bin_file_operations; 458 + } else { 459 + inode->i_size = PAGE_SIZE; 460 + inode->i_fop = &configfs_file_operations; 461 + } 462 + d_add(dentry, inode); 463 + return 0; 444 464 } 445 465 446 466 static struct dentry * configfs_lookup(struct inode *dir,
+5 -19
fs/configfs/inode.c
··· 164 164 165 165 #endif /* CONFIG_LOCKDEP */ 166 166 167 - int configfs_create(struct dentry * dentry, umode_t mode, void (*init)(struct inode *)) 167 + struct inode *configfs_create(struct dentry *dentry, umode_t mode) 168 168 { 169 - int error = 0; 170 169 struct inode *inode = NULL; 171 170 struct configfs_dirent *sd; 172 171 struct inode *p_inode; 173 172 174 173 if (!dentry) 175 - return -ENOENT; 174 + return ERR_PTR(-ENOENT); 176 175 177 176 if (d_really_is_positive(dentry)) 178 - return -EEXIST; 177 + return ERR_PTR(-EEXIST); 179 178 180 179 sd = dentry->d_fsdata; 181 180 inode = configfs_new_inode(mode, sd, dentry->d_sb); 182 181 if (!inode) 183 - return -ENOMEM; 182 + return ERR_PTR(-ENOMEM); 184 183 185 184 p_inode = d_inode(dentry->d_parent); 186 185 p_inode->i_mtime = p_inode->i_ctime = current_time(p_inode); 187 186 configfs_set_inode_lock_class(sd, inode); 188 - 189 - init(inode); 190 - if (S_ISDIR(mode) || S_ISLNK(mode)) { 191 - /* 192 - * ->symlink(), ->mkdir(), configfs_register_subsystem() or 193 - * create_default_group() - already hashed. 194 - */ 195 - d_instantiate(dentry, inode); 196 - dget(dentry); /* pin link and directory dentries in core */ 197 - } else { 198 - /* ->lookup() */ 199 - d_add(dentry, inode); 200 - } 201 - return error; 187 + return inode; 202 188 } 203 189 204 190 /*