]> Git Repo - linux.git/commitdiff
Merge tag 'configfs-for-5.4' of git://git.infradead.org/users/hch/configfs
authorLinus Torvalds <[email protected]>
Thu, 19 Sep 2019 20:09:28 +0000 (13:09 -0700)
committerLinus Torvalds <[email protected]>
Thu, 19 Sep 2019 20:09:28 +0000 (13:09 -0700)
Pull configfs updates from Christoph Hellwig:

 - fix a symlink deadlock (Al Viro)

 - various cleanups (Al Viro, me)

* tag 'configfs-for-5.4' of git://git.infradead.org/users/hch/configfs:
  configfs: calculate the symlink target only once
  configfs: make configfs_create() return inode
  configfs: factor dirent removal into helpers
  configfs: fix a deadlock in configfs_symlink()

1  2 
fs/configfs/inode.c

diff --combined fs/configfs/inode.c
index 884dcf06cfbec85e486327d4cde9d6cfcdebabb3,9c3d309839a8cfdf6827731d5f725294bc34f8c1..680aba9c00d5a51306317e2d52db37a6ab30b244
@@@ -76,14 -76,14 +76,14 @@@ int configfs_setattr(struct dentry * de
        if (ia_valid & ATTR_GID)
                sd_iattr->ia_gid = iattr->ia_gid;
        if (ia_valid & ATTR_ATIME)
 -              sd_iattr->ia_atime = timespec64_trunc(iattr->ia_atime,
 -                                                    inode->i_sb->s_time_gran);
 +              sd_iattr->ia_atime = timestamp_truncate(iattr->ia_atime,
 +                                                    inode);
        if (ia_valid & ATTR_MTIME)
 -              sd_iattr->ia_mtime = timespec64_trunc(iattr->ia_mtime,
 -                                                    inode->i_sb->s_time_gran);
 +              sd_iattr->ia_mtime = timestamp_truncate(iattr->ia_mtime,
 +                                                    inode);
        if (ia_valid & ATTR_CTIME)
 -              sd_iattr->ia_ctime = timespec64_trunc(iattr->ia_ctime,
 -                                                    inode->i_sb->s_time_gran);
 +              sd_iattr->ia_ctime = timestamp_truncate(iattr->ia_ctime,
 +                                                    inode);
        if (ia_valid & ATTR_MODE) {
                umode_t mode = iattr->ia_mode;
  
@@@ -164,41 -164,27 +164,27 @@@ static void configfs_set_inode_lock_cla
  
  #endif /* CONFIG_LOCKDEP */
  
int configfs_create(struct dentry * dentry, umode_t mode, void (*init)(struct inode *))
struct inode *configfs_create(struct dentry *dentry, umode_t mode)
  {
-       int error = 0;
        struct inode *inode = NULL;
        struct configfs_dirent *sd;
        struct inode *p_inode;
  
        if (!dentry)
-               return -ENOENT;
+               return ERR_PTR(-ENOENT);
  
        if (d_really_is_positive(dentry))
-               return -EEXIST;
+               return ERR_PTR(-EEXIST);
  
        sd = dentry->d_fsdata;
        inode = configfs_new_inode(mode, sd, dentry->d_sb);
        if (!inode)
-               return -ENOMEM;
+               return ERR_PTR(-ENOMEM);
  
        p_inode = d_inode(dentry->d_parent);
        p_inode->i_mtime = p_inode->i_ctime = current_time(p_inode);
        configfs_set_inode_lock_class(sd, inode);
-       init(inode);
-       if (S_ISDIR(mode) || S_ISLNK(mode)) {
-               /*
-                * ->symlink(), ->mkdir(), configfs_register_subsystem() or
-                * create_default_group() - already hashed.
-                */
-               d_instantiate(dentry, inode);
-               dget(dentry);  /* pin link and directory dentries in core */
-       } else {
-               /* ->lookup() */
-               d_add(dentry, inode);
-       }
-       return error;
+       return inode;
  }
  
  /*
This page took 0.063863 seconds and 4 git commands to generate.