mirror of
https://github.com/samba-team/samba.git
synced 2025-11-09 20:23:51 +03:00
r14926: change the inotify backend to implement the rather unusual semantics
for rename. The cookies in inotify tell us (indirectly!) if its a rename between directories or not
This commit is contained in:
committed by
Gerald (Jerry) Carter
parent
2ac248edf0
commit
13574a8d0c
@@ -90,8 +90,13 @@ static int inotify_destructor(void *ptr)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
dispatch one inotify event
|
dispatch one inotify event
|
||||||
|
|
||||||
|
the cookies are used to correctly handle renames
|
||||||
*/
|
*/
|
||||||
static void inotify_dispatch(struct inotify_private *in, struct inotify_event *e)
|
static void inotify_dispatch(struct inotify_private *in,
|
||||||
|
struct inotify_event *e,
|
||||||
|
uint32_t prev_cookie,
|
||||||
|
uint32_t next_cookie)
|
||||||
{
|
{
|
||||||
struct watch_context *w;
|
struct watch_context *w;
|
||||||
struct notify_event ne;
|
struct notify_event ne;
|
||||||
@@ -101,11 +106,24 @@ static void inotify_dispatch(struct inotify_private *in, struct inotify_event *e
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* map the inotify mask to a action */
|
/* map the inotify mask to a action. This gets complicated for
|
||||||
|
renames */
|
||||||
if (e->mask & IN_CREATE) {
|
if (e->mask & IN_CREATE) {
|
||||||
ne.action = NOTIFY_ACTION_ADDED;
|
ne.action = NOTIFY_ACTION_ADDED;
|
||||||
} else if (e->mask & IN_DELETE) {
|
} else if (e->mask & IN_DELETE) {
|
||||||
ne.action = NOTIFY_ACTION_REMOVED;
|
ne.action = NOTIFY_ACTION_REMOVED;
|
||||||
|
} else if (e->mask & IN_MOVED_FROM) {
|
||||||
|
if (e->cookie == next_cookie) {
|
||||||
|
ne.action = NOTIFY_ACTION_OLD_NAME;
|
||||||
|
} else {
|
||||||
|
ne.action = NOTIFY_ACTION_REMOVED;
|
||||||
|
}
|
||||||
|
} else if (e->mask & IN_MOVED_TO) {
|
||||||
|
if (e->cookie == prev_cookie) {
|
||||||
|
ne.action = NOTIFY_ACTION_NEW_NAME;
|
||||||
|
} else {
|
||||||
|
ne.action = NOTIFY_ACTION_ADDED;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
ne.action = NOTIFY_ACTION_MODIFIED;
|
ne.action = NOTIFY_ACTION_MODIFIED;
|
||||||
}
|
}
|
||||||
@@ -129,6 +147,7 @@ static void inotify_handler(struct event_context *ev, struct fd_event *fde,
|
|||||||
struct inotify_private *in = talloc_get_type(private, struct inotify_private);
|
struct inotify_private *in = talloc_get_type(private, struct inotify_private);
|
||||||
int bufsize = 0;
|
int bufsize = 0;
|
||||||
struct inotify_event *e0, *e;
|
struct inotify_event *e0, *e;
|
||||||
|
uint32_t prev_cookie=0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
we must use FIONREAD as we cannot predict the length of the
|
we must use FIONREAD as we cannot predict the length of the
|
||||||
@@ -152,9 +171,14 @@ static void inotify_handler(struct event_context *ev, struct fd_event *fde,
|
|||||||
|
|
||||||
/* we can get more than one event in the buffer */
|
/* we can get more than one event in the buffer */
|
||||||
while (bufsize >= sizeof(*e)) {
|
while (bufsize >= sizeof(*e)) {
|
||||||
inotify_dispatch(in, e);
|
struct inotify_event *e2 = NULL;
|
||||||
bufsize -= e->len + sizeof(*e);
|
bufsize -= e->len + sizeof(*e);
|
||||||
e = (struct inotify_event *)(e->len + sizeof(*e) + (char *)e);
|
if (bufsize >= sizeof(*e)) {
|
||||||
|
e2 = (struct inotify_event *)(e->len + sizeof(*e) + (char *)e);
|
||||||
|
}
|
||||||
|
inotify_dispatch(in, e, prev_cookie, e2?e2->cookie:0);
|
||||||
|
prev_cookie = e->cookie;
|
||||||
|
e = e2;
|
||||||
}
|
}
|
||||||
|
|
||||||
talloc_free(e0);
|
talloc_free(e0);
|
||||||
|
|||||||
Reference in New Issue
Block a user