@@ -95,10 +95,11 @@ static int dma_buf_file_release(struct inode *inode, struct file *file)
9595 return - EINVAL ;
9696
9797 dmabuf = file -> private_data ;
98-
99- mutex_lock (& db_list .lock );
100- list_del (& dmabuf -> list_node );
101- mutex_unlock (& db_list .lock );
98+ if (dmabuf ) {
99+ mutex_lock (& db_list .lock );
100+ list_del (& dmabuf -> list_node );
101+ mutex_unlock (& db_list .lock );
102+ }
102103
103104 return 0 ;
104105}
@@ -528,17 +529,17 @@ static inline int is_dma_buf_file(struct file *file)
528529 return file -> f_op == & dma_buf_fops ;
529530}
530531
531- static struct file * dma_buf_getfile (struct dma_buf * dmabuf , int flags )
532+ static struct file * dma_buf_getfile (size_t size , int flags )
532533{
533534 static atomic64_t dmabuf_inode = ATOMIC64_INIT (0 );
534- struct file * file ;
535535 struct inode * inode = alloc_anon_inode (dma_buf_mnt -> mnt_sb );
536+ struct file * file ;
536537
537538 if (IS_ERR (inode ))
538539 return ERR_CAST (inode );
539540
540- inode -> i_size = dmabuf -> size ;
541- inode_set_bytes (inode , dmabuf -> size );
541+ inode -> i_size = size ;
542+ inode_set_bytes (inode , size );
542543
543544 /*
544545 * The ->i_ino acquired from get_next_ino() is not unique thus
@@ -552,8 +553,6 @@ static struct file *dma_buf_getfile(struct dma_buf *dmabuf, int flags)
552553 flags , & dma_buf_fops );
553554 if (IS_ERR (file ))
554555 goto err_alloc_file ;
555- file -> private_data = dmabuf ;
556- file -> f_path .dentry -> d_fsdata = dmabuf ;
557556
558557 return file ;
559558
@@ -619,19 +618,11 @@ struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info)
619618 size_t alloc_size = sizeof (struct dma_buf );
620619 int ret ;
621620
622- if (!exp_info -> resv )
623- alloc_size += sizeof (struct dma_resv );
624- else
625- /* prevent &dma_buf[1] == dma_buf->resv */
626- alloc_size += 1 ;
627-
628- if (WARN_ON (!exp_info -> priv
629- || !exp_info -> ops
630- || !exp_info -> ops -> map_dma_buf
631- || !exp_info -> ops -> unmap_dma_buf
632- || !exp_info -> ops -> release )) {
621+ if (WARN_ON (!exp_info -> priv || !exp_info -> ops
622+ || !exp_info -> ops -> map_dma_buf
623+ || !exp_info -> ops -> unmap_dma_buf
624+ || !exp_info -> ops -> release ))
633625 return ERR_PTR (- EINVAL );
634- }
635626
636627 if (WARN_ON (exp_info -> ops -> cache_sgt_mapping &&
637628 (exp_info -> ops -> pin || exp_info -> ops -> unpin )))
@@ -643,10 +634,21 @@ struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info)
643634 if (!try_module_get (exp_info -> owner ))
644635 return ERR_PTR (- ENOENT );
645636
637+ file = dma_buf_getfile (exp_info -> size , exp_info -> flags );
638+ if (IS_ERR (file )) {
639+ ret = PTR_ERR (file );
640+ goto err_module ;
641+ }
642+
643+ if (!exp_info -> resv )
644+ alloc_size += sizeof (struct dma_resv );
645+ else
646+ /* prevent &dma_buf[1] == dma_buf->resv */
647+ alloc_size += 1 ;
646648 dmabuf = kzalloc (alloc_size , GFP_KERNEL );
647649 if (!dmabuf ) {
648650 ret = - ENOMEM ;
649- goto err_module ;
651+ goto err_file ;
650652 }
651653
652654 dmabuf -> priv = exp_info -> priv ;
@@ -658,43 +660,35 @@ struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info)
658660 init_waitqueue_head (& dmabuf -> poll );
659661 dmabuf -> cb_in .poll = dmabuf -> cb_out .poll = & dmabuf -> poll ;
660662 dmabuf -> cb_in .active = dmabuf -> cb_out .active = 0 ;
663+ INIT_LIST_HEAD (& dmabuf -> attachments );
661664
662665 if (!resv ) {
663- resv = (struct dma_resv * )& dmabuf [1 ];
664- dma_resv_init (resv );
666+ dmabuf -> resv = (struct dma_resv * )& dmabuf [1 ];
667+ dma_resv_init (dmabuf -> resv );
668+ } else {
669+ dmabuf -> resv = resv ;
665670 }
666- dmabuf -> resv = resv ;
667671
668- file = dma_buf_getfile (dmabuf , exp_info -> flags );
669- if (IS_ERR (file )) {
670- ret = PTR_ERR (file );
672+ ret = dma_buf_stats_setup (dmabuf , file );
673+ if (ret )
671674 goto err_dmabuf ;
672- }
673675
676+ file -> private_data = dmabuf ;
677+ file -> f_path .dentry -> d_fsdata = dmabuf ;
674678 dmabuf -> file = file ;
675679
676- INIT_LIST_HEAD (& dmabuf -> attachments );
677-
678680 mutex_lock (& db_list .lock );
679681 list_add (& dmabuf -> list_node , & db_list .head );
680682 mutex_unlock (& db_list .lock );
681683
682- ret = dma_buf_stats_setup (dmabuf );
683- if (ret )
684- goto err_sysfs ;
685-
686684 return dmabuf ;
687685
688- err_sysfs :
689- /*
690- * Set file->f_path.dentry->d_fsdata to NULL so that when
691- * dma_buf_release() gets invoked by dentry_ops, it exits
692- * early before calling the release() dma_buf op.
693- */
694- file -> f_path .dentry -> d_fsdata = NULL ;
695- fput (file );
696686err_dmabuf :
687+ if (!resv )
688+ dma_resv_fini (dmabuf -> resv );
697689 kfree (dmabuf );
690+ err_file :
691+ fput (file );
698692err_module :
699693 module_put (exp_info -> owner );
700694 return ERR_PTR (ret );
0 commit comments