inotify.c 19.3 KB
Newer Older
R
Robert Love 已提交
1 2 3 4 5 6 7
/*
 * fs/inotify.c - inode-based file event notifications
 *
 * Authors:
 *	John McCutchan	<ttb@tentacle.dhs.org>
 *	Robert Love	<rml@novell.com>
 *
8 9
 * Kernel API added by: Amy Griffis <amy.griffis@hp.com>
 *
R
Robert Love 已提交
10
 * Copyright (C) 2005 John McCutchan
11
 * Copyright 2006 Hewlett-Packard Development Company, L.P.
R
Robert Love 已提交
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2, or (at your option) any
 * later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 */

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/spinlock.h>
#include <linux/idr.h>
#include <linux/slab.h>
#include <linux/fs.h>
30
#include <linux/sched.h>
R
Robert Love 已提交
31 32 33 34 35 36 37 38 39 40 41
#include <linux/init.h>
#include <linux/list.h>
#include <linux/writeback.h>
#include <linux/inotify.h>

static atomic_t inotify_cookie;

/*
 * Lock ordering:
 *
 * dentry->d_lock (used to keep d_move() away from dentry->d_parent)
I
Ingo Molnar 已提交
42
 * iprune_mutex (synchronize shrink_icache_memory())
R
Robert Love 已提交
43
 * 	inode_lock (protects the super_block->s_inodes list)
I
Ingo Molnar 已提交
44
 * 	inode->inotify_mutex (protects inode->inotify_watches and watches->i_list)
45 46 47 48 49 50
 * 		inotify_handle->mutex (protects inotify_handle and watches->h_list)
 *
 * The inode->inotify_mutex and inotify_handle->mutex and held during execution
 * of a caller's event handler.  Thus, the caller must not hold any locks
 * taken in their event handler while calling any of the published inotify
 * interfaces.
R
Robert Love 已提交
51 52 53
 */

/*
54
 * Lifetimes of the three main data structures--inotify_handle, inode, and
R
Robert Love 已提交
55 56
 * inotify_watch--are managed by reference count.
 *
57 58 59
 * inotify_handle: Lifetime is from inotify_init() to inotify_destroy().
 * Additional references can bump the count via get_inotify_handle() and drop
 * the count via put_inotify_handle().
R
Robert Love 已提交
60
 *
61 62 63 64 65 66
 * inotify_watch: for inotify's purposes, lifetime is from inotify_add_watch()
 * to remove_watch_no_event().  Additional references can bump the count via
 * get_inotify_watch() and drop the count via put_inotify_watch().  The caller
 * is reponsible for the final put after receiving IN_IGNORED, or when using
 * IN_ONESHOT after receiving the first event.  Inotify does the final put if
 * inotify_destroy() is called.
R
Robert Love 已提交
67 68
 *
 * inode: Pinned so long as the inode is associated with a watch, from
69
 * inotify_add_watch() to the final put_inotify_watch().
R
Robert Love 已提交
70 71 72
 */

/*
73
 * struct inotify_handle - represents an inotify instance
R
Robert Love 已提交
74
 *
I
Ingo Molnar 已提交
75
 * This structure is protected by the mutex 'mutex'.
R
Robert Love 已提交
76
 */
77
struct inotify_handle {
R
Robert Love 已提交
78
	struct idr		idr;		/* idr mapping wd -> watch */
I
Ingo Molnar 已提交
79
	struct mutex		mutex;		/* protects this bad boy */
R
Robert Love 已提交
80 81
	struct list_head	watches;	/* list of watches */
	atomic_t		count;		/* reference count */
82
	u32			last_wd;	/* the last wd allocated */
83
	const struct inotify_operations *in_ops; /* inotify caller operations */
R
Robert Love 已提交
84 85
};

86
static inline void get_inotify_handle(struct inotify_handle *ih)
R
Robert Love 已提交
87
{
88
	atomic_inc(&ih->count);
R
Robert Love 已提交
89 90
}

91
static inline void put_inotify_handle(struct inotify_handle *ih)
R
Robert Love 已提交
92
{
93 94 95
	if (atomic_dec_and_test(&ih->count)) {
		idr_destroy(&ih->idr);
		kfree(ih);
R
Robert Love 已提交
96 97 98
	}
}

99 100 101 102 103
/**
 * get_inotify_watch - grab a reference to an inotify_watch
 * @watch: watch to grab
 */
void get_inotify_watch(struct inotify_watch *watch)
R
Robert Love 已提交
104 105 106
{
	atomic_inc(&watch->count);
}
107
EXPORT_SYMBOL_GPL(get_inotify_watch);
R
Robert Love 已提交
108

109
/**
R
Robert Love 已提交
110
 * put_inotify_watch - decrements the ref count on a given watch.  cleans up
111 112 113
 * watch references if the count reaches zero.  inotify_watch is freed by
 * inotify callers via the destroy_watch() op.
 * @watch: watch to release
R
Robert Love 已提交
114
 */
115
void put_inotify_watch(struct inotify_watch *watch)
R
Robert Love 已提交
116 117
{
	if (atomic_dec_and_test(&watch->count)) {
118
		struct inotify_handle *ih = watch->ih;
R
Robert Love 已提交
119

120 121 122
		iput(watch->inode);
		ih->in_ops->destroy_watch(watch);
		put_inotify_handle(ih);
R
Robert Love 已提交
123 124
	}
}
125
EXPORT_SYMBOL_GPL(put_inotify_watch);
R
Robert Love 已提交
126 127

/*
128
 * inotify_handle_get_wd - returns the next WD for use by the given handle
R
Robert Love 已提交
129
 *
130
 * Callers must hold ih->mutex.  This function can sleep.
R
Robert Love 已提交
131
 */
132 133
static int inotify_handle_get_wd(struct inotify_handle *ih,
				 struct inotify_watch *watch)
R
Robert Love 已提交
134 135 136 137
{
	int ret;

	do {
138
		if (unlikely(!idr_pre_get(&ih->idr, GFP_KERNEL)))
R
Robert Love 已提交
139
			return -ENOSPC;
140
		ret = idr_get_new_above(&ih->idr, watch, ih->last_wd+1, &watch->wd);
R
Robert Love 已提交
141 142
	} while (ret == -EAGAIN);

143 144
	if (likely(!ret))
		ih->last_wd = watch->wd;
R
Robert Love 已提交
145

146
	return ret;
R
Robert Love 已提交
147 148
}

149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
/*
 * inotify_inode_watched - returns nonzero if there are watches on this inode
 * and zero otherwise.  We call this lockless, we do not care if we race.
 */
static inline int inotify_inode_watched(struct inode *inode)
{
	return !list_empty(&inode->inotify_watches);
}

/*
 * Get child dentry flag into synch with parent inode.
 * Flag should always be clear for negative dentrys.
 */
static void set_dentry_child_flags(struct inode *inode, int watched)
{
	struct dentry *alias;

	spin_lock(&dcache_lock);
	list_for_each_entry(alias, &inode->i_dentry, d_alias) {
		struct dentry *child;

		list_for_each_entry(child, &alias->d_subdirs, d_u.d_child) {
			if (!child->d_inode) {
				WARN_ON(child->d_flags & DCACHE_INOTIFY_PARENT_WATCHED);
				continue;
			}
			spin_lock(&child->d_lock);
			if (watched) {
				WARN_ON(child->d_flags &
						DCACHE_INOTIFY_PARENT_WATCHED);
				child->d_flags |= DCACHE_INOTIFY_PARENT_WATCHED;
			} else {
				WARN_ON(!(child->d_flags &
					DCACHE_INOTIFY_PARENT_WATCHED));
				child->d_flags&=~DCACHE_INOTIFY_PARENT_WATCHED;
			}
			spin_unlock(&child->d_lock);
		}
	}
	spin_unlock(&dcache_lock);
}

R
Robert Love 已提交
191
/*
192 193
 * inotify_find_handle - find the watch associated with the given inode and
 * handle
R
Robert Love 已提交
194
 *
I
Ingo Molnar 已提交
195
 * Callers must hold inode->inotify_mutex.
R
Robert Love 已提交
196
 */
197 198
static struct inotify_watch *inode_find_handle(struct inode *inode,
					       struct inotify_handle *ih)
R
Robert Love 已提交
199 200 201 202
{
	struct inotify_watch *watch;

	list_for_each_entry(watch, &inode->inotify_watches, i_list) {
203
		if (watch->ih == ih)
R
Robert Love 已提交
204 205 206 207 208 209 210
			return watch;
	}

	return NULL;
}

/*
211
 * remove_watch_no_event - remove watch without the IN_IGNORED event.
212 213
 *
 * Callers must hold both inode->inotify_mutex and ih->mutex.
R
Robert Love 已提交
214 215
 */
static void remove_watch_no_event(struct inotify_watch *watch,
216
				  struct inotify_handle *ih)
R
Robert Love 已提交
217 218
{
	list_del(&watch->i_list);
219
	list_del(&watch->h_list);
R
Robert Love 已提交
220

221 222 223
	if (!inotify_inode_watched(watch->inode))
		set_dentry_child_flags(watch->inode, 0);

224
	idr_remove(&ih->idr, watch->wd);
R
Robert Love 已提交
225 226
}

227 228 229 230 231 232
/**
 * inotify_remove_watch_locked - Remove a watch from both the handle and the
 * inode.  Sends the IN_IGNORED event signifying that the inode is no longer
 * watched.  May be invoked from a caller's event handler.
 * @ih: inotify handle associated with watch
 * @watch: watch to remove
R
Robert Love 已提交
233
 *
234
 * Callers must hold both inode->inotify_mutex and ih->mutex.
R
Robert Love 已提交
235
 */
236 237
void inotify_remove_watch_locked(struct inotify_handle *ih,
				 struct inotify_watch *watch)
R
Robert Love 已提交
238
{
239
	remove_watch_no_event(watch, ih);
240
	ih->in_ops->handle_event(watch, watch->wd, IN_IGNORED, 0, NULL, NULL);
R
Robert Love 已提交
241
}
242
EXPORT_SYMBOL_GPL(inotify_remove_watch_locked);
R
Robert Love 已提交
243

244
/* Kernel API for producing events */
245

R
Robert Love 已提交
246
/*
247
 * inotify_d_instantiate - instantiate dcache entry for inode
R
Robert Love 已提交
248
 */
249
void inotify_d_instantiate(struct dentry *entry, struct inode *inode)
R
Robert Love 已提交
250
{
251 252 253 254 255 256 257 258
	struct dentry *parent;

	if (!inode)
		return;

	WARN_ON(entry->d_flags & DCACHE_INOTIFY_PARENT_WATCHED);
	spin_lock(&entry->d_lock);
	parent = entry->d_parent;
259
	if (parent->d_inode && inotify_inode_watched(parent->d_inode))
260 261
		entry->d_flags |= DCACHE_INOTIFY_PARENT_WATCHED;
	spin_unlock(&entry->d_lock);
R
Robert Love 已提交
262 263
}

264 265 266 267 268 269 270 271 272 273 274 275 276
/*
 * inotify_d_move - dcache entry has been moved
 */
void inotify_d_move(struct dentry *entry)
{
	struct dentry *parent;

	parent = entry->d_parent;
	if (inotify_inode_watched(parent->d_inode))
		entry->d_flags |= DCACHE_INOTIFY_PARENT_WATCHED;
	else
		entry->d_flags &= ~DCACHE_INOTIFY_PARENT_WATCHED;
}
R
Robert Love 已提交
277 278 279 280 281 282 283

/**
 * inotify_inode_queue_event - queue an event to all watches on this inode
 * @inode: inode event is originating from
 * @mask: event mask describing this event
 * @cookie: cookie for synchronization, or zero
 * @name: filename, if any
284
 * @n_inode: inode associated with name
R
Robert Love 已提交
285 286
 */
void inotify_inode_queue_event(struct inode *inode, u32 mask, u32 cookie,
287
			       const char *name, struct inode *n_inode)
R
Robert Love 已提交
288 289 290 291 292 293
{
	struct inotify_watch *watch, *next;

	if (!inotify_inode_watched(inode))
		return;

I
Ingo Molnar 已提交
294
	mutex_lock(&inode->inotify_mutex);
R
Robert Love 已提交
295 296 297
	list_for_each_entry_safe(watch, next, &inode->inotify_watches, i_list) {
		u32 watch_mask = watch->mask;
		if (watch_mask & mask) {
298 299
			struct inotify_handle *ih= watch->ih;
			mutex_lock(&ih->mutex);
R
Robert Love 已提交
300
			if (watch_mask & IN_ONESHOT)
301
				remove_watch_no_event(watch, ih);
302 303
			ih->in_ops->handle_event(watch, watch->wd, mask, cookie,
						 name, n_inode);
304
			mutex_unlock(&ih->mutex);
R
Robert Love 已提交
305 306
		}
	}
I
Ingo Molnar 已提交
307
	mutex_unlock(&inode->inotify_mutex);
R
Robert Love 已提交
308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323
}
EXPORT_SYMBOL_GPL(inotify_inode_queue_event);

/**
 * inotify_dentry_parent_queue_event - queue an event to a dentry's parent
 * @dentry: the dentry in question, we queue against this dentry's parent
 * @mask: event mask describing this event
 * @cookie: cookie for synchronization, or zero
 * @name: filename, if any
 */
void inotify_dentry_parent_queue_event(struct dentry *dentry, u32 mask,
				       u32 cookie, const char *name)
{
	struct dentry *parent;
	struct inode *inode;

324
	if (!(dentry->d_flags & DCACHE_INOTIFY_PARENT_WATCHED))
J
John McCutchan 已提交
325 326
		return;

R
Robert Love 已提交
327 328 329 330 331 332 333
	spin_lock(&dentry->d_lock);
	parent = dentry->d_parent;
	inode = parent->d_inode;

	if (inotify_inode_watched(inode)) {
		dget(parent);
		spin_unlock(&dentry->d_lock);
334 335
		inotify_inode_queue_event(inode, mask, cookie, name,
					  dentry->d_inode);
R
Robert Love 已提交
336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355
		dput(parent);
	} else
		spin_unlock(&dentry->d_lock);
}
EXPORT_SYMBOL_GPL(inotify_dentry_parent_queue_event);

/**
 * inotify_get_cookie - return a unique cookie for use in synchronizing events.
 */
u32 inotify_get_cookie(void)
{
	return atomic_inc_return(&inotify_cookie);
}
EXPORT_SYMBOL_GPL(inotify_get_cookie);

/**
 * inotify_unmount_inodes - an sb is unmounting.  handle any watched inodes.
 * @list: list of inodes being unmounted (sb->s_inodes)
 *
 * Called with inode_lock held, protecting the unmounting super block's list
I
Ingo Molnar 已提交
356
 * of inodes, and with iprune_mutex held, keeping shrink_icache_memory() at bay.
R
Robert Love 已提交
357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386
 * We temporarily drop inode_lock, however, and CAN block.
 */
void inotify_unmount_inodes(struct list_head *list)
{
	struct inode *inode, *next_i, *need_iput = NULL;

	list_for_each_entry_safe(inode, next_i, list, i_sb_list) {
		struct inotify_watch *watch, *next_w;
		struct inode *need_iput_tmp;
		struct list_head *watches;

		/*
		 * If i_count is zero, the inode cannot have any watches and
		 * doing an __iget/iput with MS_ACTIVE clear would actually
		 * evict all inodes with zero i_count from icache which is
		 * unnecessarily violent and may in fact be illegal to do.
		 */
		if (!atomic_read(&inode->i_count))
			continue;

		/*
		 * We cannot __iget() an inode in state I_CLEAR, I_FREEING, or
		 * I_WILL_FREE which is fine because by that point the inode
		 * cannot have any associated watches.
		 */
		if (inode->i_state & (I_CLEAR | I_FREEING | I_WILL_FREE))
			continue;

		need_iput_tmp = need_iput;
		need_iput = NULL;
387
		/* In case inotify_remove_watch_locked() drops a reference. */
R
Robert Love 已提交
388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404
		if (inode != need_iput_tmp)
			__iget(inode);
		else
			need_iput_tmp = NULL;
		/* In case the dropping of a reference would nuke next_i. */
		if ((&next_i->i_sb_list != list) &&
				atomic_read(&next_i->i_count) &&
				!(next_i->i_state & (I_CLEAR | I_FREEING |
					I_WILL_FREE))) {
			__iget(next_i);
			need_iput = next_i;
		}

		/*
		 * We can safely drop inode_lock here because we hold
		 * references on both inode and next_i.  Also no new inodes
		 * will be added since the umount has begun.  Finally,
I
Ingo Molnar 已提交
405
		 * iprune_mutex keeps shrink_icache_memory() away.
R
Robert Love 已提交
406 407 408 409 410 411 412
		 */
		spin_unlock(&inode_lock);

		if (need_iput_tmp)
			iput(need_iput_tmp);

		/* for each watch, send IN_UNMOUNT and then remove it */
I
Ingo Molnar 已提交
413
		mutex_lock(&inode->inotify_mutex);
R
Robert Love 已提交
414 415
		watches = &inode->inotify_watches;
		list_for_each_entry_safe(watch, next_w, watches, i_list) {
416 417 418
			struct inotify_handle *ih= watch->ih;
			mutex_lock(&ih->mutex);
			ih->in_ops->handle_event(watch, watch->wd, IN_UNMOUNT, 0,
419
						 NULL, NULL);
420
			inotify_remove_watch_locked(ih, watch);
421
			mutex_unlock(&ih->mutex);
R
Robert Love 已提交
422
		}
I
Ingo Molnar 已提交
423
		mutex_unlock(&inode->inotify_mutex);
R
Robert Love 已提交
424 425 426 427 428 429 430 431 432 433 434 435 436 437 438
		iput(inode);		

		spin_lock(&inode_lock);
	}
}
EXPORT_SYMBOL_GPL(inotify_unmount_inodes);

/**
 * inotify_inode_is_dead - an inode has been deleted, cleanup any watches
 * @inode: inode that is about to be removed
 */
void inotify_inode_is_dead(struct inode *inode)
{
	struct inotify_watch *watch, *next;

I
Ingo Molnar 已提交
439
	mutex_lock(&inode->inotify_mutex);
R
Robert Love 已提交
440
	list_for_each_entry_safe(watch, next, &inode->inotify_watches, i_list) {
441 442
		struct inotify_handle *ih = watch->ih;
		mutex_lock(&ih->mutex);
443
		inotify_remove_watch_locked(ih, watch);
444
		mutex_unlock(&ih->mutex);
R
Robert Love 已提交
445
	}
I
Ingo Molnar 已提交
446
	mutex_unlock(&inode->inotify_mutex);
R
Robert Love 已提交
447 448 449
}
EXPORT_SYMBOL_GPL(inotify_inode_is_dead);

450
/* Kernel Consumer API */
R
Robert Love 已提交
451

452 453 454 455 456
/**
 * inotify_init - allocate and initialize an inotify instance
 * @ops: caller's inotify operations
 */
struct inotify_handle *inotify_init(const struct inotify_operations *ops)
R
Robert Love 已提交
457
{
458
	struct inotify_handle *ih;
R
Robert Love 已提交
459

460 461 462
	ih = kmalloc(sizeof(struct inotify_handle), GFP_KERNEL);
	if (unlikely(!ih))
		return ERR_PTR(-ENOMEM);
R
Robert Love 已提交
463

464 465 466 467 468 469 470
	idr_init(&ih->idr);
	INIT_LIST_HEAD(&ih->watches);
	mutex_init(&ih->mutex);
	ih->last_wd = 0;
	ih->in_ops = ops;
	atomic_set(&ih->count, 0);
	get_inotify_handle(ih);
R
Robert Love 已提交
471

472
	return ih;
R
Robert Love 已提交
473
}
474
EXPORT_SYMBOL_GPL(inotify_init);
R
Robert Love 已提交
475

476 477 478 479 480 481 482 483 484 485 486 487 488
/**
 * inotify_init_watch - initialize an inotify watch
 * @watch: watch to initialize
 */
void inotify_init_watch(struct inotify_watch *watch)
{
	INIT_LIST_HEAD(&watch->h_list);
	INIT_LIST_HEAD(&watch->i_list);
	atomic_set(&watch->count, 0);
	get_inotify_watch(watch); /* initial get */
}
EXPORT_SYMBOL_GPL(inotify_init_watch);

489 490 491 492 493
/**
 * inotify_destroy - clean up and destroy an inotify instance
 * @ih: inotify handle
 */
void inotify_destroy(struct inotify_handle *ih)
R
Robert Love 已提交
494 495
{
	/*
496
	 * Destroy all of the watches for this handle. Unfortunately, not very
R
Robert Love 已提交
497 498
	 * pretty.  We cannot do a simple iteration over the list, because we
	 * do not know the inode until we iterate to the watch.  But we need to
499
	 * hold inode->inotify_mutex before ih->mutex.  The following works.
R
Robert Love 已提交
500 501 502 503 504 505
	 */
	while (1) {
		struct inotify_watch *watch;
		struct list_head *watches;
		struct inode *inode;

506 507
		mutex_lock(&ih->mutex);
		watches = &ih->watches;
R
Robert Love 已提交
508
		if (list_empty(watches)) {
509
			mutex_unlock(&ih->mutex);
R
Robert Love 已提交
510 511
			break;
		}
512
		watch = list_first_entry(watches, struct inotify_watch, h_list);
R
Robert Love 已提交
513
		get_inotify_watch(watch);
514
		mutex_unlock(&ih->mutex);
R
Robert Love 已提交
515 516

		inode = watch->inode;
I
Ingo Molnar 已提交
517
		mutex_lock(&inode->inotify_mutex);
518
		mutex_lock(&ih->mutex);
519 520

		/* make sure we didn't race with another list removal */
521 522 523 524
		if (likely(idr_find(&ih->idr, watch->wd))) {
			remove_watch_no_event(watch, ih);
			put_inotify_watch(watch);
		}
525

526
		mutex_unlock(&ih->mutex);
I
Ingo Molnar 已提交
527
		mutex_unlock(&inode->inotify_mutex);
R
Robert Love 已提交
528 529 530
		put_inotify_watch(watch);
	}

531 532
	/* free this handle: the put matching the get in inotify_init() */
	put_inotify_handle(ih);
R
Robert Love 已提交
533
}
534
EXPORT_SYMBOL_GPL(inotify_destroy);
R
Robert Love 已提交
535

536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566
/**
 * inotify_find_watch - find an existing watch for an (ih,inode) pair
 * @ih: inotify handle
 * @inode: inode to watch
 * @watchp: pointer to existing inotify_watch
 *
 * Caller must pin given inode (via nameidata).
 */
s32 inotify_find_watch(struct inotify_handle *ih, struct inode *inode,
		       struct inotify_watch **watchp)
{
	struct inotify_watch *old;
	int ret = -ENOENT;

	mutex_lock(&inode->inotify_mutex);
	mutex_lock(&ih->mutex);

	old = inode_find_handle(inode, ih);
	if (unlikely(old)) {
		get_inotify_watch(old); /* caller must put watch */
		*watchp = old;
		ret = old->wd;
	}

	mutex_unlock(&ih->mutex);
	mutex_unlock(&inode->inotify_mutex);

	return ret;
}
EXPORT_SYMBOL_GPL(inotify_find_watch);

567 568 569 570 571
/**
 * inotify_find_update_watch - find and update the mask of an existing watch
 * @ih: inotify handle
 * @inode: inode's watch to update
 * @mask: mask of events to watch
R
Robert Love 已提交
572
 *
573
 * Caller must pin given inode (via nameidata).
R
Robert Love 已提交
574
 */
575 576
s32 inotify_find_update_watch(struct inotify_handle *ih, struct inode *inode,
			      u32 mask)
R
Robert Love 已提交
577
{
578 579 580
	struct inotify_watch *old;
	int mask_add = 0;
	int ret;
R
Robert Love 已提交
581

582 583 584 585 586 587
	if (mask & IN_MASK_ADD)
		mask_add = 1;

	/* don't allow invalid bits: we don't want flags set */
	mask &= IN_ALL_EVENTS | IN_ONESHOT;
	if (unlikely(!mask))
R
Robert Love 已提交
588 589
		return -EINVAL;

I
Ingo Molnar 已提交
590
	mutex_lock(&inode->inotify_mutex);
591
	mutex_lock(&ih->mutex);
R
Robert Love 已提交
592

593 594 595 596 597 598 599 600
	/*
	 * Handle the case of re-adding a watch on an (inode,ih) pair that we
	 * are already watching.  We just update the mask and return its wd.
	 */
	old = inode_find_handle(inode, ih);
	if (unlikely(!old)) {
		ret = -ENOENT;
		goto out;
R
Robert Love 已提交
601 602
	}

603 604 605 606 607 608 609 610
	if (mask_add)
		old->mask |= mask;
	else
		old->mask = mask;
	ret = old->wd;
out:
	mutex_unlock(&ih->mutex);
	mutex_unlock(&inode->inotify_mutex);
R
Robert Love 已提交
611 612
	return ret;
}
613
EXPORT_SYMBOL_GPL(inotify_find_update_watch);
R
Robert Love 已提交
614

615 616 617 618 619 620 621 622 623 624 625 626 627
/**
 * inotify_add_watch - add a watch to an inotify instance
 * @ih: inotify handle
 * @watch: caller allocated watch structure
 * @inode: inode to watch
 * @mask: mask of events to watch
 *
 * Caller must pin given inode (via nameidata).
 * Caller must ensure it only calls inotify_add_watch() once per watch.
 * Calls inotify_handle_get_wd() so may sleep.
 */
s32 inotify_add_watch(struct inotify_handle *ih, struct inotify_watch *watch,
		      struct inode *inode, u32 mask)
R
Robert Love 已提交
628
{
629
	int ret = 0;
R
Robert Love 已提交
630

631 632 633 634 635
	/* don't allow invalid bits: we don't want flags set */
	mask &= IN_ALL_EVENTS | IN_ONESHOT;
	if (unlikely(!mask))
		return -EINVAL;
	watch->mask = mask;
R
Robert Love 已提交
636

637 638
	mutex_lock(&inode->inotify_mutex);
	mutex_lock(&ih->mutex);
639

640 641
	/* Initialize a new watch */
	ret = inotify_handle_get_wd(ih, watch);
R
Robert Love 已提交
642
	if (unlikely(ret))
643 644
		goto out;
	ret = watch->wd;
R
Robert Love 已提交
645

646 647 648
	/* save a reference to handle and bump the count to make it official */
	get_inotify_handle(ih);
	watch->ih = ih;
R
Robert Love 已提交
649 650

	/*
651 652
	 * Save a reference to the inode and bump the ref count to make it
	 * official.  We hold a reference to nameidata, which makes this safe.
R
Robert Love 已提交
653
	 */
654
	watch->inode = igrab(inode);
R
Robert Love 已提交
655

656 657 658
	if (!inotify_inode_watched(inode))
		set_dentry_child_flags(inode, 1);

659 660
	/* Add the watch to the handle's and the inode's list */
	list_add(&watch->h_list, &ih->watches);
R
Robert Love 已提交
661 662
	list_add(&watch->i_list, &inode->inotify_watches);
out:
663
	mutex_unlock(&ih->mutex);
I
Ingo Molnar 已提交
664
	mutex_unlock(&inode->inotify_mutex);
R
Robert Love 已提交
665 666
	return ret;
}
667
EXPORT_SYMBOL_GPL(inotify_add_watch);
R
Robert Love 已提交
668

669 670 671 672 673 674 675 676
/**
 * inotify_rm_wd - remove a watch from an inotify instance
 * @ih: inotify handle
 * @wd: watch descriptor to remove
 *
 * Can sleep.
 */
int inotify_rm_wd(struct inotify_handle *ih, u32 wd)
R
Robert Love 已提交
677
{
678 679
	struct inotify_watch *watch;
	struct inode *inode;
R
Robert Love 已提交
680

681 682 683 684 685
	mutex_lock(&ih->mutex);
	watch = idr_find(&ih->idr, wd);
	if (unlikely(!watch)) {
		mutex_unlock(&ih->mutex);
		return -EINVAL;
R
Robert Love 已提交
686
	}
687 688 689
	get_inotify_watch(watch);
	inode = watch->inode;
	mutex_unlock(&ih->mutex);
R
Robert Love 已提交
690

691 692
	mutex_lock(&inode->inotify_mutex);
	mutex_lock(&ih->mutex);
R
Robert Love 已提交
693

694 695
	/* make sure that we did not race */
	if (likely(idr_find(&ih->idr, wd) == watch))
696
		inotify_remove_watch_locked(ih, watch);
R
Robert Love 已提交
697

698 699 700
	mutex_unlock(&ih->mutex);
	mutex_unlock(&inode->inotify_mutex);
	put_inotify_watch(watch);
R
Robert Love 已提交
701

702 703 704
	return 0;
}
EXPORT_SYMBOL_GPL(inotify_rm_wd);
R
Robert Love 已提交
705

706 707 708 709 710 711 712 713 714 715 716 717 718 719
/**
 * inotify_rm_watch - remove a watch from an inotify instance
 * @ih: inotify handle
 * @watch: watch to remove
 *
 * Can sleep.
 */
int inotify_rm_watch(struct inotify_handle *ih,
		     struct inotify_watch *watch)
{
	return inotify_rm_wd(ih, watch->wd);
}
EXPORT_SYMBOL_GPL(inotify_rm_watch);

R
Robert Love 已提交
720
/*
721
 * inotify_setup - core initialization function
R
Robert Love 已提交
722
 */
R
Robert Love 已提交
723
static int __init inotify_setup(void)
R
Robert Love 已提交
724 725 726 727 728 729
{
	atomic_set(&inotify_cookie, 0);

	return 0;
}

R
Robert Love 已提交
730
module_init(inotify_setup);