Skip to content

Commit 7133dd5

Browse files
author
Al Viro
committed
memcg_write_event_control(): switch to CLASS(fd)
some reordering required - take both fdget() to the point before the allocations, with matching move of fdput() to the very end of failure exit(s); after that it converts trivially. simplify the cleanups that involve css_put(), while we are at it... Reviewed-by: Christian Brauner <[email protected]> Signed-off-by: Al Viro <[email protected]>
1 parent 66635b0 commit 7133dd5

File tree

1 file changed

+15
-29
lines changed

1 file changed

+15
-29
lines changed

mm/memcontrol-v1.c

Lines changed: 15 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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

20462037
out_put_css:
2047-
css_put(css);
2048-
out_put_cfile:
2049-
fdput(cfile);
2038+
css_put(cfile_css);
20502039
out_put_eventfd:
20512040
eventfd_ctx_put(event->eventfd);
2052-
out_put_efile:
2053-
fdput(efile);
20542041
out_kfree:
20552042
kfree(event);
2056-
20572043
return ret;
20582044
}
20592045

0 commit comments

Comments
 (0)