Merge tag 'drm-misc-next-2022-06-17' of git://anongit.freedesktop.org/drm/drm-misc...
[linux-block.git] / drivers / dma-buf / dma-buf.c
index 5e1b0534b3ce44a1bc8db328eaeeb4c5a358a16b..630133284e2b28f03b4b6c3f880ce3e9ef879fbb 100644 (file)
@@ -514,6 +514,7 @@ static inline int is_dma_buf_file(struct file *file)
 
 static struct file *dma_buf_getfile(struct dma_buf *dmabuf, int flags)
 {
+       static atomic64_t dmabuf_inode = ATOMIC64_INIT(0);
        struct file *file;
        struct inode *inode = alloc_anon_inode(dma_buf_mnt->mnt_sb);
 
@@ -523,6 +524,13 @@ static struct file *dma_buf_getfile(struct dma_buf *dmabuf, int flags)
        inode->i_size = dmabuf->size;
        inode_set_bytes(inode, dmabuf->size);
 
+       /*
+        * The ->i_ino acquired from get_next_ino() is not unique thus
+        * not suitable for using it as dentry name by dmabuf stats.
+        * Override ->i_ino with the unique and dmabuffs specific
+        * value.
+        */
+       inode->i_ino = atomic64_add_return(1, &dmabuf_inode);
        file = alloc_file_pseudo(inode, dma_buf_mnt, "dmabuf",
                                 flags, &dma_buf_fops);
        if (IS_ERR(file))
@@ -650,10 +658,6 @@ struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info)
        file->f_mode |= FMODE_LSEEK;
        dmabuf->file = file;
 
-       ret = dma_buf_stats_setup(dmabuf);
-       if (ret)
-               goto err_sysfs;
-
        mutex_init(&dmabuf->lock);
        INIT_LIST_HEAD(&dmabuf->attachments);
 
@@ -661,6 +665,10 @@ struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info)
        list_add(&dmabuf->list_node, &db_list.head);
        mutex_unlock(&db_list.lock);
 
+       ret = dma_buf_stats_setup(dmabuf);
+       if (ret)
+               goto err_sysfs;
+
        return dmabuf;
 
 err_sysfs: