mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-01 08:04:22 +08:00
fanotify: open code fill_event_metadata()
The helper is quite trivial and open coding it will make it easier to implement copying event fid info to user. Signed-off-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Jan Kara <jack@suse.cz>
This commit is contained in:
parent
33913997d5
commit
bb2f7b4542
@ -114,36 +114,6 @@ static int create_fd(struct fsnotify_group *group,
|
|||||||
return client_fd;
|
return client_fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fill_event_metadata(struct fsnotify_group *group,
|
|
||||||
struct fanotify_event_metadata *metadata,
|
|
||||||
struct fsnotify_event *fsn_event,
|
|
||||||
struct file **file)
|
|
||||||
{
|
|
||||||
int ret = 0;
|
|
||||||
struct fanotify_event *event;
|
|
||||||
|
|
||||||
pr_debug("%s: group=%p metadata=%p event=%p\n", __func__,
|
|
||||||
group, metadata, fsn_event);
|
|
||||||
|
|
||||||
*file = NULL;
|
|
||||||
event = container_of(fsn_event, struct fanotify_event, fse);
|
|
||||||
metadata->event_len = FAN_EVENT_METADATA_LEN;
|
|
||||||
metadata->metadata_len = FAN_EVENT_METADATA_LEN;
|
|
||||||
metadata->vers = FANOTIFY_METADATA_VERSION;
|
|
||||||
metadata->reserved = 0;
|
|
||||||
metadata->mask = event->mask & FANOTIFY_OUTGOING_EVENTS;
|
|
||||||
metadata->pid = pid_vnr(event->pid);
|
|
||||||
if (unlikely(event->mask & FAN_Q_OVERFLOW))
|
|
||||||
metadata->fd = FAN_NOFD;
|
|
||||||
else {
|
|
||||||
metadata->fd = create_fd(group, event, file);
|
|
||||||
if (metadata->fd < 0)
|
|
||||||
ret = metadata->fd;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct fanotify_perm_event *dequeue_event(
|
static struct fanotify_perm_event *dequeue_event(
|
||||||
struct fsnotify_group *group, int fd)
|
struct fsnotify_group *group, int fd)
|
||||||
{
|
{
|
||||||
@ -205,37 +175,50 @@ static int process_access_response(struct fsnotify_group *group,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t copy_event_to_user(struct fsnotify_group *group,
|
static ssize_t copy_event_to_user(struct fsnotify_group *group,
|
||||||
struct fsnotify_event *event,
|
struct fsnotify_event *fsn_event,
|
||||||
char __user *buf, size_t count)
|
char __user *buf, size_t count)
|
||||||
{
|
{
|
||||||
struct fanotify_event_metadata fanotify_event_metadata;
|
struct fanotify_event_metadata metadata;
|
||||||
struct file *f;
|
struct fanotify_event *event;
|
||||||
|
struct file *f = NULL;
|
||||||
int fd, ret;
|
int fd, ret;
|
||||||
|
|
||||||
pr_debug("%s: group=%p event=%p\n", __func__, group, event);
|
pr_debug("%s: group=%p event=%p\n", __func__, group, fsn_event);
|
||||||
|
|
||||||
ret = fill_event_metadata(group, &fanotify_event_metadata, event, &f);
|
event = container_of(fsn_event, struct fanotify_event, fse);
|
||||||
if (ret < 0)
|
metadata.event_len = FAN_EVENT_METADATA_LEN;
|
||||||
return ret;
|
metadata.metadata_len = FAN_EVENT_METADATA_LEN;
|
||||||
|
metadata.vers = FANOTIFY_METADATA_VERSION;
|
||||||
|
metadata.reserved = 0;
|
||||||
|
metadata.mask = event->mask & FANOTIFY_OUTGOING_EVENTS;
|
||||||
|
metadata.pid = pid_vnr(event->pid);
|
||||||
|
|
||||||
|
if (unlikely(event->mask & FAN_Q_OVERFLOW)) {
|
||||||
|
fd = FAN_NOFD;
|
||||||
|
} else {
|
||||||
|
fd = create_fd(group, event, &f);
|
||||||
|
if (fd < 0)
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
metadata.fd = fd;
|
||||||
|
|
||||||
fd = fanotify_event_metadata.fd;
|
|
||||||
ret = -EFAULT;
|
ret = -EFAULT;
|
||||||
/*
|
/*
|
||||||
* Sanity check copy size in case get_one_event() and
|
* Sanity check copy size in case get_one_event() and
|
||||||
* fill_event_metadata() event_len sizes ever get out of sync.
|
* fill_event_metadata() event_len sizes ever get out of sync.
|
||||||
*/
|
*/
|
||||||
if (WARN_ON_ONCE(fanotify_event_metadata.event_len > count))
|
if (WARN_ON_ONCE(metadata.event_len > count))
|
||||||
goto out_close_fd;
|
|
||||||
if (copy_to_user(buf, &fanotify_event_metadata,
|
|
||||||
fanotify_event_metadata.event_len))
|
|
||||||
goto out_close_fd;
|
goto out_close_fd;
|
||||||
|
|
||||||
if (fanotify_is_perm_event(FANOTIFY_E(event)->mask))
|
if (copy_to_user(buf, &metadata, metadata.event_len))
|
||||||
FANOTIFY_PE(event)->fd = fd;
|
goto out_close_fd;
|
||||||
|
|
||||||
|
if (fanotify_is_perm_event(event->mask))
|
||||||
|
FANOTIFY_PE(fsn_event)->fd = fd;
|
||||||
|
|
||||||
if (fd != FAN_NOFD)
|
if (fd != FAN_NOFD)
|
||||||
fd_install(fd, f);
|
fd_install(fd, f);
|
||||||
return fanotify_event_metadata.event_len;
|
return metadata.event_len;
|
||||||
|
|
||||||
out_close_fd:
|
out_close_fd:
|
||||||
if (fd != FAN_NOFD) {
|
if (fd != FAN_NOFD) {
|
||||||
|
Loading…
Reference in New Issue
Block a user