@@ -1911,8 +1911,6 @@ static ssize_t memcg_write_event_control(struct kernfs_open_file *of,
19111911 struct mem_cgroup_event * event ;
19121912 struct cgroup_subsys_state * cfile_css ;
19131913 unsigned int efd , cfd ;
1914- struct fd efile ;
1915- struct fd cfile ;
19161914 struct dentry * cdentry ;
19171915 const char * name ;
19181916 char * endp ;
@@ -1936,6 +1934,12 @@ static ssize_t memcg_write_event_control(struct kernfs_open_file *of,
19361934 else
19371935 return - EINVAL ;
19381936
1937+ CLASS (fd , efile )(efd );
1938+ if (fd_empty (efile ))
1939+ return - EBADF ;
1940+
1941+ CLASS (fd , cfile )(cfd );
1942+
19391943 event = kzalloc (sizeof (* event ), GFP_KERNEL );
19401944 if (!event )
19411945 return - ENOMEM ;
@@ -1946,20 +1950,13 @@ static ssize_t memcg_write_event_control(struct kernfs_open_file *of,
19461950 init_waitqueue_func_entry (& event -> wait , memcg_event_wake );
19471951 INIT_WORK (& event -> remove , memcg_event_remove );
19481952
1949- efile = fdget (efd );
1950- if (!fd_file (efile )) {
1951- ret = - EBADF ;
1952- goto out_kfree ;
1953- }
1954-
19551953 event -> eventfd = eventfd_ctx_fileget (fd_file (efile ));
19561954 if (IS_ERR (event -> eventfd )) {
19571955 ret = PTR_ERR (event -> eventfd );
1958- goto out_put_efile ;
1956+ goto out_kfree ;
19591957 }
19601958
1961- cfile = fdget (cfd );
1962- if (!fd_file (cfile )) {
1959+ if (fd_empty (cfile )) {
19631960 ret = - EBADF ;
19641961 goto out_put_eventfd ;
19651962 }
@@ -1968,7 +1965,7 @@ static ssize_t memcg_write_event_control(struct kernfs_open_file *of,
19681965 /* AV: shouldn't we check that it's been opened for read instead? */
19691966 ret = file_permission (fd_file (cfile ), MAY_READ );
19701967 if (ret < 0 )
1971- goto out_put_cfile ;
1968+ goto out_put_eventfd ;
19721969
19731970 /*
19741971 * The control file must be a regular cgroup1 file. As a regular cgroup
@@ -1977,7 +1974,7 @@ static ssize_t memcg_write_event_control(struct kernfs_open_file *of,
19771974 cdentry = fd_file (cfile )-> f_path .dentry ;
19781975 if (cdentry -> d_sb -> s_type != & cgroup_fs_type || !d_is_reg (cdentry )) {
19791976 ret = - EINVAL ;
1980- goto out_put_cfile ;
1977+ goto out_put_eventfd ;
19811978 }
19821979
19831980 /*
@@ -2010,7 +2007,7 @@ static ssize_t memcg_write_event_control(struct kernfs_open_file *of,
20102007 event -> unregister_event = memsw_cgroup_usage_unregister_event ;
20112008 } else {
20122009 ret = - EINVAL ;
2013- goto out_put_cfile ;
2010+ goto out_put_eventfd ;
20142011 }
20152012
20162013 /*
@@ -2022,11 +2019,9 @@ static ssize_t memcg_write_event_control(struct kernfs_open_file *of,
20222019 & memory_cgrp_subsys );
20232020 ret = - EINVAL ;
20242021 if (IS_ERR (cfile_css ))
2025- goto out_put_cfile ;
2026- if (cfile_css != css ) {
2027- css_put (cfile_css );
2028- goto out_put_cfile ;
2029- }
2022+ goto out_put_eventfd ;
2023+ if (cfile_css != css )
2024+ goto out_put_css ;
20302025
20312026 ret = event -> register_event (memcg , event -> eventfd , buf );
20322027 if (ret )
@@ -2037,23 +2032,14 @@ static ssize_t memcg_write_event_control(struct kernfs_open_file *of,
20372032 spin_lock_irq (& memcg -> event_list_lock );
20382033 list_add (& event -> list , & memcg -> event_list );
20392034 spin_unlock_irq (& memcg -> event_list_lock );
2040-
2041- fdput (cfile );
2042- fdput (efile );
2043-
20442035 return nbytes ;
20452036
20462037out_put_css :
2047- css_put (css );
2048- out_put_cfile :
2049- fdput (cfile );
2038+ css_put (cfile_css );
20502039out_put_eventfd :
20512040 eventfd_ctx_put (event -> eventfd );
2052- out_put_efile :
2053- fdput (efile );
20542041out_kfree :
20552042 kfree (event );
2056-
20572043 return ret ;
20582044}
20592045
0 commit comments