locks.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:50k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #define MSNFS /* HACK HACK */
  2. /*
  3.  *  linux/fs/locks.c
  4.  *
  5.  *  Provide support for fcntl()'s F_GETLK, F_SETLK, and F_SETLKW calls.
  6.  *  Doug Evans (dje@spiff.uucp), August 07, 1992
  7.  *
  8.  *  Deadlock detection added.
  9.  *  FIXME: one thing isn't handled yet:
  10.  * - mandatory locks (requires lots of changes elsewhere)
  11.  *  Kelly Carmichael (kelly@[142.24.8.65]), September 17, 1994.
  12.  *
  13.  *  Miscellaneous edits, and a total rewrite of posix_lock_file() code.
  14.  *  Kai Petzke (wpp@marie.physik.tu-berlin.de), 1994
  15.  *  
  16.  *  Converted file_lock_table to a linked list from an array, which eliminates
  17.  *  the limits on how many active file locks are open.
  18.  *  Chad Page (pageone@netcom.com), November 27, 1994
  19.  * 
  20.  *  Removed dependency on file descriptors. dup()'ed file descriptors now
  21.  *  get the same locks as the original file descriptors, and a close() on
  22.  *  any file descriptor removes ALL the locks on the file for the current
  23.  *  process. Since locks still depend on the process id, locks are inherited
  24.  *  after an exec() but not after a fork(). This agrees with POSIX, and both
  25.  *  BSD and SVR4 practice.
  26.  *  Andy Walker (andy@lysaker.kvaerner.no), February 14, 1995
  27.  *
  28.  *  Scrapped free list which is redundant now that we allocate locks
  29.  *  dynamically with kmalloc()/kfree().
  30.  *  Andy Walker (andy@lysaker.kvaerner.no), February 21, 1995
  31.  *
  32.  *  Implemented two lock personalities - FL_FLOCK and FL_POSIX.
  33.  *
  34.  *  FL_POSIX locks are created with calls to fcntl() and lockf() through the
  35.  *  fcntl() system call. They have the semantics described above.
  36.  *
  37.  *  FL_FLOCK locks are created with calls to flock(), through the flock()
  38.  *  system call, which is new. Old C libraries implement flock() via fcntl()
  39.  *  and will continue to use the old, broken implementation.
  40.  *
  41.  *  FL_FLOCK locks follow the 4.4 BSD flock() semantics. They are associated
  42.  *  with a file pointer (filp). As a result they can be shared by a parent
  43.  *  process and its children after a fork(). They are removed when the last
  44.  *  file descriptor referring to the file pointer is closed (unless explicitly
  45.  *  unlocked). 
  46.  *
  47.  *  FL_FLOCK locks never deadlock, an existing lock is always removed before
  48.  *  upgrading from shared to exclusive (or vice versa). When this happens
  49.  *  any processes blocked by the current lock are woken up and allowed to
  50.  *  run before the new lock is applied.
  51.  *  Andy Walker (andy@lysaker.kvaerner.no), June 09, 1995
  52.  *
  53.  *  Removed some race conditions in flock_lock_file(), marked other possible
  54.  *  races. Just grep for FIXME to see them. 
  55.  *  Dmitry Gorodchanin (pgmdsg@ibi.com), February 09, 1996.
  56.  *
  57.  *  Addressed Dmitry's concerns. Deadlock checking no longer recursive.
  58.  *  Lock allocation changed to GFP_ATOMIC as we can't afford to sleep
  59.  *  once we've checked for blocking and deadlocking.
  60.  *  Andy Walker (andy@lysaker.kvaerner.no), April 03, 1996.
  61.  *
  62.  *  Initial implementation of mandatory locks. SunOS turned out to be
  63.  *  a rotten model, so I implemented the "obvious" semantics.
  64.  *  See 'linux/Documentation/mandatory.txt' for details.
  65.  *  Andy Walker (andy@lysaker.kvaerner.no), April 06, 1996.
  66.  *
  67.  *  Don't allow mandatory locks on mmap()'ed files. Added simple functions to
  68.  *  check if a file has mandatory locks, used by mmap(), open() and creat() to
  69.  *  see if system call should be rejected. Ref. HP-UX/SunOS/Solaris Reference
  70.  *  Manual, Section 2.
  71.  *  Andy Walker (andy@lysaker.kvaerner.no), April 09, 1996.
  72.  *
  73.  *  Tidied up block list handling. Added '/proc/locks' interface.
  74.  *  Andy Walker (andy@lysaker.kvaerner.no), April 24, 1996.
  75.  *
  76.  *  Fixed deadlock condition for pathological code that mixes calls to
  77.  *  flock() and fcntl().
  78.  *  Andy Walker (andy@lysaker.kvaerner.no), April 29, 1996.
  79.  *
  80.  *  Allow only one type of locking scheme (FL_POSIX or FL_FLOCK) to be in use
  81.  *  for a given file at a time. Changed the CONFIG_LOCK_MANDATORY scheme to
  82.  *  guarantee sensible behaviour in the case where file system modules might
  83.  *  be compiled with different options than the kernel itself.
  84.  *  Andy Walker (andy@lysaker.kvaerner.no), May 15, 1996.
  85.  *
  86.  *  Added a couple of missing wake_up() calls. Thanks to Thomas Meckel
  87.  *  (Thomas.Meckel@mni.fh-giessen.de) for spotting this.
  88.  *  Andy Walker (andy@lysaker.kvaerner.no), May 15, 1996.
  89.  *
  90.  *  Changed FL_POSIX locks to use the block list in the same way as FL_FLOCK
  91.  *  locks. Changed process synchronisation to avoid dereferencing locks that
  92.  *  have already been freed.
  93.  *  Andy Walker (andy@lysaker.kvaerner.no), Sep 21, 1996.
  94.  *
  95.  *  Made the block list a circular list to minimise searching in the list.
  96.  *  Andy Walker (andy@lysaker.kvaerner.no), Sep 25, 1996.
  97.  *
  98.  *  Made mandatory locking a mount option. Default is not to allow mandatory
  99.  *  locking.
  100.  *  Andy Walker (andy@lysaker.kvaerner.no), Oct 04, 1996.
  101.  *
  102.  *  Some adaptations for NFS support.
  103.  *  Olaf Kirch (okir@monad.swb.de), Dec 1996,
  104.  *
  105.  *  Fixed /proc/locks interface so that we can't overrun the buffer we are handed.
  106.  *  Andy Walker (andy@lysaker.kvaerner.no), May 12, 1997.
  107.  *
  108.  *  Use slab allocator instead of kmalloc/kfree.
  109.  *  Use generic list implementation from <linux/list.h>.
  110.  *  Sped up posix_locks_deadlock by only considering blocked locks.
  111.  *  Matthew Wilcox <willy@thepuffingroup.com>, March, 2000.
  112.  *
  113.  *  Leases and LOCK_MAND
  114.  *  Matthew Wilcox <willy@linuxcare.com>, June, 2000.
  115.  *  Stephen Rothwell <sfr@canb.auug.org.au>, June, 2000.
  116.  */
  117. #include <linux/slab.h>
  118. #include <linux/file.h>
  119. #include <linux/smp_lock.h>
  120. #include <linux/init.h>
  121. #include <linux/capability.h>
  122. #include <linux/sched.h>
  123. #include <linux/timer.h>
  124. #include <asm/semaphore.h>
  125. #include <asm/uaccess.h>
  126. int leases_enable = 1;
  127. int lease_break_time = 45;
  128. LIST_HEAD(file_lock_list);
  129. static LIST_HEAD(blocked_list);
  130. static kmem_cache_t *filelock_cache;
  131. /* Allocate an empty lock structure. */
  132. static struct file_lock *locks_alloc_lock(int account)
  133. {
  134. struct file_lock *fl;
  135. if (account && current->locks >= current->rlim[RLIMIT_LOCKS].rlim_cur)
  136. return NULL;
  137. fl = kmem_cache_alloc(filelock_cache, SLAB_KERNEL);
  138. if (fl)
  139. current->locks++;
  140. return fl;
  141. }
  142. /* Free a lock which is not in use. */
  143. static inline void locks_free_lock(struct file_lock *fl)
  144. {
  145. if (fl == NULL) {
  146. BUG();
  147. return;
  148. }
  149. current->locks--;
  150. if (waitqueue_active(&fl->fl_wait))
  151. panic("Attempting to free lock with active wait queue");
  152. if (!list_empty(&fl->fl_block))
  153. panic("Attempting to free lock with active block list");
  154. if (!list_empty(&fl->fl_link))
  155. panic("Attempting to free lock on active lock list");
  156. kmem_cache_free(filelock_cache, fl);
  157. }
  158. void locks_init_lock(struct file_lock *fl)
  159. {
  160. INIT_LIST_HEAD(&fl->fl_link);
  161. INIT_LIST_HEAD(&fl->fl_block);
  162. init_waitqueue_head(&fl->fl_wait);
  163. fl->fl_next = NULL;
  164. fl->fl_fasync = NULL;
  165. fl->fl_owner = 0;
  166. fl->fl_pid = 0;
  167. fl->fl_file = NULL;
  168. fl->fl_flags = 0;
  169. fl->fl_type = 0;
  170. fl->fl_start = fl->fl_end = 0;
  171. fl->fl_notify = NULL;
  172. fl->fl_insert = NULL;
  173. fl->fl_remove = NULL;
  174. }
  175. /*
  176.  * Initialises the fields of the file lock which are invariant for
  177.  * free file_locks.
  178.  */
  179. static void init_once(void *foo, kmem_cache_t *cache, unsigned long flags)
  180. {
  181. struct file_lock *lock = (struct file_lock *) foo;
  182. if ((flags & (SLAB_CTOR_VERIFY|SLAB_CTOR_CONSTRUCTOR)) !=
  183. SLAB_CTOR_CONSTRUCTOR)
  184. return;
  185. locks_init_lock(lock);
  186. }
  187. /*
  188.  * Initialize a new lock from an existing file_lock structure.
  189.  */
  190. void locks_copy_lock(struct file_lock *new, struct file_lock *fl)
  191. {
  192. new->fl_owner = fl->fl_owner;
  193. new->fl_pid = fl->fl_pid;
  194. new->fl_file = fl->fl_file;
  195. new->fl_flags = fl->fl_flags;
  196. new->fl_type = fl->fl_type;
  197. new->fl_start = fl->fl_start;
  198. new->fl_end = fl->fl_end;
  199. new->fl_notify = fl->fl_notify;
  200. new->fl_insert = fl->fl_insert;
  201. new->fl_remove = fl->fl_remove;
  202. new->fl_u = fl->fl_u;
  203. }
  204. /* Fill in a file_lock structure with an appropriate FLOCK lock. */
  205. static struct file_lock *flock_make_lock(struct file *filp, unsigned int type)
  206. {
  207. struct file_lock *fl = locks_alloc_lock(1);
  208. if (fl == NULL)
  209. return NULL;
  210. fl->fl_owner = NULL;
  211. fl->fl_file = filp;
  212. fl->fl_pid = current->pid;
  213. fl->fl_flags = FL_FLOCK;
  214. fl->fl_type = type;
  215. fl->fl_start = 0;
  216. fl->fl_end = OFFSET_MAX;
  217. fl->fl_notify = NULL;
  218. fl->fl_insert = NULL;
  219. fl->fl_remove = NULL;
  220. return fl;
  221. }
  222. static int assign_type(struct file_lock *fl, int type)
  223. {
  224. switch (type) {
  225. case F_RDLCK:
  226. case F_WRLCK:
  227. case F_UNLCK:
  228. fl->fl_type = type;
  229. break;
  230. default:
  231. return -EINVAL;
  232. }
  233. return 0;
  234. }
  235. /* Verify a "struct flock" and copy it to a "struct file_lock" as a POSIX
  236.  * style lock.
  237.  */
  238. static int flock_to_posix_lock(struct file *filp, struct file_lock *fl,
  239.        struct flock *l)
  240. {
  241. off_t start, end;
  242. switch (l->l_whence) {
  243. case 0: /*SEEK_SET*/
  244. start = 0;
  245. break;
  246. case 1: /*SEEK_CUR*/
  247. start = filp->f_pos;
  248. break;
  249. case 2: /*SEEK_END*/
  250. start = filp->f_dentry->d_inode->i_size;
  251. break;
  252. default:
  253. return -EINVAL;
  254. }
  255. if (((start += l->l_start) < 0) || (l->l_len < 0))
  256. return -EINVAL;
  257. end = start + l->l_len - 1;
  258. if (l->l_len > 0 && end < 0)
  259. return -EOVERFLOW;
  260. fl->fl_start = start; /* we record the absolute position */
  261. fl->fl_end = end;
  262. if (l->l_len == 0)
  263. fl->fl_end = OFFSET_MAX;
  264. fl->fl_owner = current->files;
  265. fl->fl_pid = current->pid;
  266. fl->fl_file = filp;
  267. fl->fl_flags = FL_POSIX;
  268. fl->fl_notify = NULL;
  269. fl->fl_insert = NULL;
  270. fl->fl_remove = NULL;
  271. return assign_type(fl, l->l_type);
  272. }
  273. #if BITS_PER_LONG == 32
  274. static int flock64_to_posix_lock(struct file *filp, struct file_lock *fl,
  275.  struct flock64 *l)
  276. {
  277. loff_t start;
  278. switch (l->l_whence) {
  279. case 0: /*SEEK_SET*/
  280. start = 0;
  281. break;
  282. case 1: /*SEEK_CUR*/
  283. start = filp->f_pos;
  284. break;
  285. case 2: /*SEEK_END*/
  286. start = filp->f_dentry->d_inode->i_size;
  287. break;
  288. default:
  289. return -EINVAL;
  290. }
  291. if (((start += l->l_start) < 0) || (l->l_len < 0))
  292. return -EINVAL;
  293. fl->fl_end = start + l->l_len - 1;
  294. if (l->l_len > 0 && fl->fl_end < 0)
  295. return -EOVERFLOW;
  296. fl->fl_start = start; /* we record the absolute position */
  297. if (l->l_len == 0)
  298. fl->fl_end = OFFSET_MAX;
  299. fl->fl_owner = current->files;
  300. fl->fl_pid = current->pid;
  301. fl->fl_file = filp;
  302. fl->fl_flags = FL_POSIX;
  303. fl->fl_notify = NULL;
  304. fl->fl_insert = NULL;
  305. fl->fl_remove = NULL;
  306. switch (l->l_type) {
  307. case F_RDLCK:
  308. case F_WRLCK:
  309. case F_UNLCK:
  310. fl->fl_type = l->l_type;
  311. break;
  312. default:
  313. return -EINVAL;
  314. }
  315. return (0);
  316. }
  317. #endif
  318. /* Allocate a file_lock initialised to this type of lease */
  319. static int lease_alloc(struct file *filp, int type, struct file_lock **flp)
  320. {
  321. struct file_lock *fl = locks_alloc_lock(1);
  322. if (fl == NULL)
  323. return -ENOMEM;
  324. fl->fl_owner = current->files;
  325. fl->fl_pid = current->pid;
  326. fl->fl_file = filp;
  327. fl->fl_flags = FL_LEASE;
  328. if (assign_type(fl, type) != 0) {
  329. locks_free_lock(fl);
  330. return -EINVAL;
  331. }
  332. fl->fl_start = 0;
  333. fl->fl_end = OFFSET_MAX;
  334. fl->fl_notify = NULL;
  335. fl->fl_insert = NULL;
  336. fl->fl_remove = NULL;
  337. *flp = fl;
  338. return 0;
  339. }
  340. /* Check if two locks overlap each other.
  341.  */
  342. static inline int locks_overlap(struct file_lock *fl1, struct file_lock *fl2)
  343. {
  344. return ((fl1->fl_end >= fl2->fl_start) &&
  345. (fl2->fl_end >= fl1->fl_start));
  346. }
  347. /*
  348.  * Check whether two locks have the same owner
  349.  * N.B. Do we need the test on PID as well as owner?
  350.  * (Clone tasks should be considered as one "owner".)
  351.  */
  352. static inline int
  353. locks_same_owner(struct file_lock *fl1, struct file_lock *fl2)
  354. {
  355. return (fl1->fl_owner == fl2->fl_owner) &&
  356.        (fl1->fl_pid   == fl2->fl_pid);
  357. }
  358. /* Remove waiter from blocker's block list.
  359.  * When blocker ends up pointing to itself then the list is empty.
  360.  */
  361. static void locks_delete_block(struct file_lock *waiter)
  362. {
  363. list_del(&waiter->fl_block);
  364. INIT_LIST_HEAD(&waiter->fl_block);
  365. list_del(&waiter->fl_link);
  366. INIT_LIST_HEAD(&waiter->fl_link);
  367. waiter->fl_next = NULL;
  368. }
  369. /* Insert waiter into blocker's block list.
  370.  * We use a circular list so that processes can be easily woken up in
  371.  * the order they blocked. The documentation doesn't require this but
  372.  * it seems like the reasonable thing to do.
  373.  */
  374. static void locks_insert_block(struct file_lock *blocker, 
  375.        struct file_lock *waiter)
  376. {
  377. if (!list_empty(&waiter->fl_block)) {
  378. printk(KERN_ERR "locks_insert_block: removing duplicated lock "
  379. "(pid=%d %Ld-%Ld type=%d)n", waiter->fl_pid,
  380. waiter->fl_start, waiter->fl_end, waiter->fl_type);
  381. locks_delete_block(waiter);
  382. }
  383. list_add_tail(&waiter->fl_block, &blocker->fl_block);
  384. waiter->fl_next = blocker;
  385. list_add(&waiter->fl_link, &blocked_list);
  386. }
  387. static inline
  388. void locks_notify_blocked(struct file_lock *waiter)
  389. {
  390. if (waiter->fl_notify)
  391. waiter->fl_notify(waiter);
  392. else
  393. wake_up(&waiter->fl_wait);
  394. }
  395. /* Wake up processes blocked waiting for blocker.
  396.  * If told to wait then schedule the processes until the block list
  397.  * is empty, otherwise empty the block list ourselves.
  398.  */
  399. static void locks_wake_up_blocks(struct file_lock *blocker, unsigned int wait)
  400. {
  401. while (!list_empty(&blocker->fl_block)) {
  402. struct file_lock *waiter = list_entry(blocker->fl_block.next, struct file_lock, fl_block);
  403. if (wait) {
  404. locks_notify_blocked(waiter);
  405. /* Let the blocked process remove waiter from the
  406.  * block list when it gets scheduled.
  407.  */
  408. yield();
  409. } else {
  410. /* Remove waiter from the block list, because by the
  411.  * time it wakes up blocker won't exist any more.
  412.  */
  413. locks_delete_block(waiter);
  414. locks_notify_blocked(waiter);
  415. }
  416. }
  417. }
  418. /* Insert file lock fl into an inode's lock list at the position indicated
  419.  * by pos. At the same time add the lock to the global file lock list.
  420.  */
  421. static void locks_insert_lock(struct file_lock **pos, struct file_lock *fl)
  422. {
  423. list_add(&fl->fl_link, &file_lock_list);
  424. /* insert into file's list */
  425. fl->fl_next = *pos;
  426. *pos = fl;
  427. if (fl->fl_insert)
  428. fl->fl_insert(fl);
  429. }
  430. /*
  431.  * Remove lock from the lock lists
  432.  */
  433. static inline void _unhash_lock(struct file_lock **thisfl_p)
  434. {
  435. struct file_lock *fl = *thisfl_p;
  436. *thisfl_p = fl->fl_next;
  437. fl->fl_next = NULL;
  438. list_del_init(&fl->fl_link);
  439. }
  440. /*
  441.  * Wake up processes that are blocked waiting for this lock,
  442.  * notify the FS that the lock has been cleared and
  443.  * finally free the lock.
  444.  */
  445. static inline void _delete_lock(struct file_lock *fl, unsigned int wait)
  446. {
  447. fasync_helper(0, fl->fl_file, 0, &fl->fl_fasync);
  448. if (fl->fl_fasync != NULL){
  449. printk(KERN_ERR "locks_delete_lock: fasync == %pn", fl->fl_fasync);
  450. fl->fl_fasync = NULL;
  451. }
  452. if (fl->fl_remove)
  453. fl->fl_remove(fl);
  454. locks_wake_up_blocks(fl, wait);
  455. locks_free_lock(fl);
  456. }
  457. /*
  458.  * Delete a lock and then free it.
  459.  */
  460. static void locks_delete_lock(struct file_lock **thisfl_p, unsigned int wait)
  461. {
  462. struct file_lock *fl = *thisfl_p;
  463. _unhash_lock(thisfl_p);
  464. _delete_lock(fl, wait);
  465. }
  466. /*
  467.  * Call back client filesystem in order to get it to unregister a lock,
  468.  * then delete lock. Essentially useful only in locks_remove_*().
  469.  * Note: this must be called with the semaphore already held!
  470.  */
  471. static inline void locks_unlock_delete(struct file_lock **thisfl_p)
  472. {
  473. struct file_lock *fl = *thisfl_p;
  474. int (*lock)(struct file *, int, struct file_lock *);
  475. _unhash_lock(thisfl_p);
  476. if (fl->fl_file->f_op &&
  477.     (lock = fl->fl_file->f_op->lock) != NULL) {
  478. fl->fl_type = F_UNLCK;
  479. lock(fl->fl_file, F_SETLK, fl);
  480. }
  481. _delete_lock(fl, 0);
  482. }
  483. /* Determine if lock sys_fl blocks lock caller_fl. Common functionality
  484.  * checks for shared/exclusive status of overlapping locks.
  485.  */
  486. static int locks_conflict(struct file_lock *caller_fl, struct file_lock *sys_fl)
  487. {
  488. switch (caller_fl->fl_type) {
  489. case F_RDLCK:
  490. return (sys_fl->fl_type == F_WRLCK);
  491. case F_WRLCK:
  492. return (1);
  493. default:
  494. printk(KERN_ERR "locks_conflict(): impossible lock type - %dn",
  495.        caller_fl->fl_type);
  496. break;
  497. }
  498. return (0); /* This should never happen */
  499. }
  500. /* Determine if lock sys_fl blocks lock caller_fl. POSIX specific
  501.  * checking before calling the locks_conflict().
  502.  */
  503. static int posix_locks_conflict(struct file_lock *caller_fl, struct file_lock *sys_fl)
  504. {
  505. /* POSIX locks owned by the same process do not conflict with
  506.  * each other.
  507.  */
  508. if (!(sys_fl->fl_flags & FL_POSIX) ||
  509.     locks_same_owner(caller_fl, sys_fl))
  510. return (0);
  511. /* Check whether they overlap */
  512. if (!locks_overlap(caller_fl, sys_fl))
  513. return 0;
  514. return (locks_conflict(caller_fl, sys_fl));
  515. }
  516. /* Determine if lock sys_fl blocks lock caller_fl. FLOCK specific
  517.  * checking before calling the locks_conflict().
  518.  */
  519. static int flock_locks_conflict(struct file_lock *caller_fl, struct file_lock *sys_fl)
  520. {
  521. /* FLOCK locks referring to the same filp do not conflict with
  522.  * each other.
  523.  */
  524. if (!(sys_fl->fl_flags & FL_FLOCK) ||
  525.     (caller_fl->fl_file == sys_fl->fl_file))
  526. return (0);
  527. #ifdef MSNFS
  528. if ((caller_fl->fl_type & LOCK_MAND) || (sys_fl->fl_type & LOCK_MAND))
  529. return 0;
  530. #endif
  531. return (locks_conflict(caller_fl, sys_fl));
  532. }
  533. static int interruptible_sleep_on_locked(wait_queue_head_t *fl_wait, int timeout)
  534. {
  535. int result = 0;
  536. DECLARE_WAITQUEUE(wait, current);
  537. current->state = TASK_INTERRUPTIBLE;
  538. add_wait_queue(fl_wait, &wait);
  539. if (timeout == 0)
  540. schedule();
  541. else
  542. result = schedule_timeout(timeout);
  543. if (signal_pending(current))
  544. result = -ERESTARTSYS;
  545. remove_wait_queue(fl_wait, &wait);
  546. current->state = TASK_RUNNING;
  547. return result;
  548. }
  549. static int locks_block_on(struct file_lock *blocker, struct file_lock *waiter)
  550. {
  551. int result;
  552. locks_insert_block(blocker, waiter);
  553. result = interruptible_sleep_on_locked(&waiter->fl_wait, 0);
  554. locks_delete_block(waiter);
  555. return result;
  556. }
  557. static int locks_block_on_timeout(struct file_lock *blocker, struct file_lock *waiter, int time)
  558. {
  559. int result;
  560. locks_insert_block(blocker, waiter);
  561. result = interruptible_sleep_on_locked(&waiter->fl_wait, time);
  562. locks_delete_block(waiter);
  563. return result;
  564. }
  565. struct file_lock *
  566. posix_test_lock(struct file *filp, struct file_lock *fl)
  567. {
  568. struct file_lock *cfl;
  569. lock_kernel();
  570. for (cfl = filp->f_dentry->d_inode->i_flock; cfl; cfl = cfl->fl_next) {
  571. if (!(cfl->fl_flags & FL_POSIX))
  572. continue;
  573. if (posix_locks_conflict(cfl, fl))
  574. break;
  575. }
  576. unlock_kernel();
  577. return (cfl);
  578. }
  579. /* This function tests for deadlock condition before putting a process to
  580.  * sleep. The detection scheme is no longer recursive. Recursive was neat,
  581.  * but dangerous - we risked stack corruption if the lock data was bad, or
  582.  * if the recursion was too deep for any other reason.
  583.  *
  584.  * We rely on the fact that a task can only be on one lock's wait queue
  585.  * at a time. When we find blocked_task on a wait queue we can re-search
  586.  * with blocked_task equal to that queue's owner, until either blocked_task
  587.  * isn't found, or blocked_task is found on a queue owned by my_task.
  588.  *
  589.  * Note: the above assumption may not be true when handling lock requests
  590.  * from a broken NFS client. But broken NFS clients have a lot more to
  591.  * worry about than proper deadlock detection anyway... --okir
  592.  */
  593. int posix_locks_deadlock(struct file_lock *caller_fl,
  594. struct file_lock *block_fl)
  595. {
  596. struct list_head *tmp;
  597. fl_owner_t caller_owner, blocked_owner;
  598. unsigned int  caller_pid, blocked_pid;
  599. caller_owner = caller_fl->fl_owner;
  600. caller_pid = caller_fl->fl_pid;
  601. blocked_owner = block_fl->fl_owner;
  602. blocked_pid = block_fl->fl_pid;
  603. next_task:
  604. if (caller_owner == blocked_owner && caller_pid == blocked_pid)
  605. return 1;
  606. list_for_each(tmp, &blocked_list) {
  607. struct file_lock *fl = list_entry(tmp, struct file_lock, fl_link);
  608. if ((fl->fl_owner == blocked_owner)
  609.     && (fl->fl_pid == blocked_pid)) {
  610. fl = fl->fl_next;
  611. blocked_owner = fl->fl_owner;
  612. blocked_pid = fl->fl_pid;
  613. goto next_task;
  614. }
  615. }
  616. return 0;
  617. }
  618. int locks_mandatory_locked(struct inode *inode)
  619. {
  620. fl_owner_t owner = current->files;
  621. struct file_lock *fl;
  622. /*
  623.  * Search the lock list for this inode for any POSIX locks.
  624.  */
  625. lock_kernel();
  626. for (fl = inode->i_flock; fl != NULL; fl = fl->fl_next) {
  627. if (!(fl->fl_flags & FL_POSIX))
  628. continue;
  629. if (fl->fl_owner != owner)
  630. break;
  631. }
  632. unlock_kernel();
  633. return fl ? -EAGAIN : 0;
  634. }
  635. int locks_mandatory_area(int read_write, struct inode *inode,
  636.  struct file *filp, loff_t offset,
  637.  size_t count)
  638. {
  639. struct file_lock *fl;
  640. struct file_lock *new_fl = locks_alloc_lock(0);
  641. int error;
  642. if (new_fl == NULL)
  643. return -ENOMEM;
  644. new_fl->fl_owner = current->files;
  645. new_fl->fl_pid = current->pid;
  646. new_fl->fl_file = filp;
  647. new_fl->fl_flags = FL_POSIX | FL_ACCESS;
  648. new_fl->fl_type = (read_write == FLOCK_VERIFY_WRITE) ? F_WRLCK : F_RDLCK;
  649. new_fl->fl_start = offset;
  650. new_fl->fl_end = offset + count - 1;
  651. error = 0;
  652. lock_kernel();
  653. repeat:
  654. /* Search the lock list for this inode for locks that conflict with
  655.  * the proposed read/write.
  656.  */
  657. for (fl = inode->i_flock; fl != NULL; fl = fl->fl_next) {
  658. if (!(fl->fl_flags & FL_POSIX))
  659. continue;
  660. if (fl->fl_start > new_fl->fl_end)
  661. break;
  662. if (posix_locks_conflict(new_fl, fl)) {
  663. error = -EAGAIN;
  664. if (filp && (filp->f_flags & O_NONBLOCK))
  665. break;
  666. error = -EDEADLK;
  667. if (posix_locks_deadlock(new_fl, fl))
  668. break;
  669. error = locks_block_on(fl, new_fl);
  670. if (error != 0)
  671. break;
  672. /*
  673.  * If we've been sleeping someone might have
  674.  * changed the permissions behind our back.
  675.  */
  676. if ((inode->i_mode & (S_ISGID | S_IXGRP)) != S_ISGID)
  677. break;
  678. goto repeat;
  679. }
  680. }
  681. locks_free_lock(new_fl);
  682. unlock_kernel();
  683. return error;
  684. }
  685. /* Try to create a FLOCK lock on filp. We always insert new FLOCK locks
  686.  * at the head of the list, but that's secret knowledge known only to
  687.  * flock_lock_file and posix_lock_file.
  688.  */
  689. static int flock_lock_file(struct file *filp, unsigned int lock_type,
  690.    unsigned int wait)
  691. {
  692. struct file_lock *fl;
  693. struct file_lock *new_fl = NULL;
  694. struct file_lock **before;
  695. struct inode * inode = filp->f_dentry->d_inode;
  696. int error, change;
  697. int unlock = (lock_type == F_UNLCK);
  698. /*
  699.  * If we need a new lock, get it in advance to avoid races.
  700.  */
  701. if (!unlock) {
  702. error = -ENOLCK;
  703. new_fl = flock_make_lock(filp, lock_type);
  704. if (!new_fl)
  705. return error;
  706. }
  707. error = 0;
  708. search:
  709. change = 0;
  710. before = &inode->i_flock;
  711. while (((fl = *before) != NULL) && (fl->fl_flags & FL_FLOCK)) {
  712. if (filp == fl->fl_file) {
  713. if (lock_type == fl->fl_type)
  714. goto out;
  715. change = 1;
  716. break;
  717. }
  718. before = &fl->fl_next;
  719. }
  720. /* change means that we are changing the type of an existing lock,
  721.  * or else unlocking it.
  722.  */
  723. if (change) {
  724. /* N.B. What if the wait argument is false? */
  725. locks_delete_lock(before, !unlock);
  726. /*
  727.  * If we waited, another lock may have been added ...
  728.  */
  729. if (!unlock)
  730. goto search;
  731. }
  732. if (unlock)
  733. goto out;
  734. repeat:
  735. for (fl = inode->i_flock; (fl != NULL) && (fl->fl_flags & FL_FLOCK);
  736.      fl = fl->fl_next) {
  737. if (!flock_locks_conflict(new_fl, fl))
  738. continue;
  739. error = -EAGAIN;
  740. if (!wait)
  741. goto out;
  742. error = locks_block_on(fl, new_fl);
  743. if (error != 0)
  744. goto out;
  745. goto repeat;
  746. }
  747. locks_insert_lock(&inode->i_flock, new_fl);
  748. new_fl = NULL;
  749. error = 0;
  750. out:
  751. if (new_fl)
  752. locks_free_lock(new_fl);
  753. return error;
  754. }
  755. /**
  756.  * posix_lock_file:
  757.  * @filp: The file to apply the lock to
  758.  * @caller: The lock to be applied
  759.  * @wait: 1 to retry automatically, 0 to return -EAGAIN
  760.  *
  761.  * Add a POSIX style lock to a file.
  762.  * We merge adjacent locks whenever possible. POSIX locks are sorted by owner
  763.  * task, then by starting address
  764.  *
  765.  * Kai Petzke writes:
  766.  * To make freeing a lock much faster, we keep a pointer to the lock before the
  767.  * actual one. But the real gain of the new coding was, that lock_it() and
  768.  * unlock_it() became one function.
  769.  *
  770.  * To all purists: Yes, I use a few goto's. Just pass on to the next function.
  771.  */
  772. int posix_lock_file(struct file *filp, struct file_lock *caller,
  773.    unsigned int wait)
  774. {
  775. struct file_lock *fl;
  776. struct file_lock *new_fl, *new_fl2;
  777. struct file_lock *left = NULL;
  778. struct file_lock *right = NULL;
  779. struct file_lock **before;
  780. struct inode * inode = filp->f_dentry->d_inode;
  781. int error, added = 0;
  782. /*
  783.  * We may need two file_lock structures for this operation,
  784.  * so we get them in advance to avoid races.
  785.  */
  786. new_fl = locks_alloc_lock(0);
  787. new_fl2 = locks_alloc_lock(0);
  788. error = -ENOLCK; /* "no luck" */
  789. if (!(new_fl && new_fl2))
  790. goto out_nolock;
  791. lock_kernel();
  792. if (caller->fl_type != F_UNLCK) {
  793.   repeat:
  794. for (fl = inode->i_flock; fl != NULL; fl = fl->fl_next) {
  795. if (!(fl->fl_flags & FL_POSIX))
  796. continue;
  797. if (!posix_locks_conflict(caller, fl))
  798. continue;
  799. error = -EAGAIN;
  800. if (!wait)
  801. goto out;
  802. error = -EDEADLK;
  803. if (posix_locks_deadlock(caller, fl))
  804. goto out;
  805. error = locks_block_on(fl, caller);
  806. if (error != 0)
  807. goto out;
  808. goto repeat;
  809.    }
  810.    }
  811. /*
  812.  * We've allocated the new locks in advance, so there are no
  813.  * errors possible (and no blocking operations) from here on.
  814.  * 
  815.  * Find the first old lock with the same owner as the new lock.
  816.  */
  817. before = &inode->i_flock;
  818. /* First skip locks owned by other processes.
  819.  */
  820. while ((fl = *before) && (!(fl->fl_flags & FL_POSIX) ||
  821.   !locks_same_owner(caller, fl))) {
  822. before = &fl->fl_next;
  823. }
  824. /* Process locks with this owner.
  825.  */
  826. while ((fl = *before) && locks_same_owner(caller, fl)) {
  827. /* Detect adjacent or overlapping regions (if same lock type)
  828.  */
  829. if (caller->fl_type == fl->fl_type) {
  830. if (fl->fl_end < caller->fl_start - 1)
  831. goto next_lock;
  832. /* If the next lock in the list has entirely bigger
  833.  * addresses than the new one, insert the lock here.
  834.  */
  835. if (fl->fl_start > caller->fl_end + 1)
  836. break;
  837. /* If we come here, the new and old lock are of the
  838.  * same type and adjacent or overlapping. Make one
  839.  * lock yielding from the lower start address of both
  840.  * locks to the higher end address.
  841.  */
  842. if (fl->fl_start > caller->fl_start)
  843. fl->fl_start = caller->fl_start;
  844. else
  845. caller->fl_start = fl->fl_start;
  846. if (fl->fl_end < caller->fl_end)
  847. fl->fl_end = caller->fl_end;
  848. else
  849. caller->fl_end = fl->fl_end;
  850. if (added) {
  851. locks_delete_lock(before, 0);
  852. continue;
  853. }
  854. caller = fl;
  855. added = 1;
  856. }
  857. else {
  858. /* Processing for different lock types is a bit
  859.  * more complex.
  860.  */
  861. if (fl->fl_end < caller->fl_start)
  862. goto next_lock;
  863. if (fl->fl_start > caller->fl_end)
  864. break;
  865. if (caller->fl_type == F_UNLCK)
  866. added = 1;
  867. if (fl->fl_start < caller->fl_start)
  868. left = fl;
  869. /* If the next lock in the list has a higher end
  870.  * address than the new one, insert the new one here.
  871.  */
  872. if (fl->fl_end > caller->fl_end) {
  873. right = fl;
  874. break;
  875. }
  876. if (fl->fl_start >= caller->fl_start) {
  877. /* The new lock completely replaces an old
  878.  * one (This may happen several times).
  879.  */
  880. if (added) {
  881. locks_delete_lock(before, 0);
  882. continue;
  883. }
  884. /* Replace the old lock with the new one.
  885.  * Wake up anybody waiting for the old one,
  886.  * as the change in lock type might satisfy
  887.  * their needs.
  888.  */
  889. locks_wake_up_blocks(fl, 0); /* This cannot schedule()! */
  890. fl->fl_start = caller->fl_start;
  891. fl->fl_end = caller->fl_end;
  892. fl->fl_type = caller->fl_type;
  893. fl->fl_u = caller->fl_u;
  894. caller = fl;
  895. added = 1;
  896. }
  897. }
  898. /* Go on to next lock.
  899.  */
  900. next_lock:
  901. before = &fl->fl_next;
  902. }
  903. error = 0;
  904. if (!added) {
  905. if (caller->fl_type == F_UNLCK)
  906. goto out;
  907. locks_copy_lock(new_fl, caller);
  908. locks_insert_lock(before, new_fl);
  909. new_fl = NULL;
  910. }
  911. if (right) {
  912. if (left == right) {
  913. /* The new lock breaks the old one in two pieces,
  914.  * so we have to use the second new lock.
  915.  */
  916. left = new_fl2;
  917. new_fl2 = NULL;
  918. locks_copy_lock(left, right);
  919. locks_insert_lock(before, left);
  920. }
  921. right->fl_start = caller->fl_end + 1;
  922. locks_wake_up_blocks(right, 0);
  923. }
  924. if (left) {
  925. left->fl_end = caller->fl_start - 1;
  926. locks_wake_up_blocks(left, 0);
  927. }
  928. out:
  929. unlock_kernel();
  930. out_nolock:
  931. /*
  932.  * Free any unused locks.
  933.  */
  934. if (new_fl)
  935. locks_free_lock(new_fl);
  936. if (new_fl2)
  937. locks_free_lock(new_fl2);
  938. return error;
  939. }
  940. static inline int flock_translate_cmd(int cmd) {
  941. #ifdef MSNFS
  942. if (cmd & LOCK_MAND)
  943. return cmd & (LOCK_MAND | LOCK_RW);
  944. #endif
  945. switch (cmd &~ LOCK_NB) {
  946. case LOCK_SH:
  947. return F_RDLCK;
  948. case LOCK_EX:
  949. return F_WRLCK;
  950. case LOCK_UN:
  951. return F_UNLCK;
  952. }
  953. return -EINVAL;
  954. }
  955. /* We already had a lease on this file; just change its type */
  956. static int lease_modify(struct file_lock **before, int arg)
  957. {
  958. struct file_lock *fl = *before;
  959. int error = assign_type(fl, arg);
  960. if (error)
  961. return error;
  962. locks_wake_up_blocks(fl, 0);
  963. if (arg == F_UNLCK) {
  964. struct file *filp = fl->fl_file;
  965. filp->f_owner.pid = 0;
  966. filp->f_owner.uid = 0;
  967. filp->f_owner.euid = 0;
  968. filp->f_owner.signum = 0;
  969. locks_delete_lock(before, 0);
  970. }
  971. return 0;
  972. }
  973. static void time_out_leases(struct inode *inode)
  974. {
  975. struct file_lock **before;
  976. struct file_lock *fl;
  977. before = &inode->i_flock;
  978. while ((fl = *before) && (fl->fl_flags & FL_LEASE)
  979. && (fl->fl_type & F_INPROGRESS)) {
  980. if ((fl->fl_break_time == 0)
  981. || time_before(jiffies, fl->fl_break_time)) {
  982. before = &fl->fl_next;
  983. continue;
  984. }
  985. printk(KERN_INFO "lease broken - owner pid = %dn", fl->fl_pid);
  986. lease_modify(before, fl->fl_type & ~F_INPROGRESS);
  987. if (fl == *before) /* lease_modify may have freed fl */
  988. before = &fl->fl_next;
  989. }
  990. }
  991. /**
  992.  * __get_lease - revoke all outstanding leases on file
  993.  * @inode: the inode of the file to return
  994.  * @mode: the open mode (read or write)
  995.  *
  996.  * get_lease (inlined for speed) has checked there already
  997.  * is a lease on this file.  Leases are broken on a call to open()
  998.  * or truncate().  This function can sleep unless you
  999.  * specified %O_NONBLOCK to your open().
  1000.  */
  1001. int __get_lease(struct inode *inode, unsigned int mode)
  1002. {
  1003. int error = 0, future;
  1004. struct file_lock *new_fl, *flock;
  1005. struct file_lock *fl;
  1006. int alloc_err;
  1007. unsigned long break_time;
  1008. int i_have_this_lease = 0;
  1009. alloc_err = lease_alloc(NULL, mode & FMODE_WRITE ? F_WRLCK : F_RDLCK,
  1010. &new_fl);
  1011. lock_kernel();
  1012. time_out_leases(inode);
  1013. flock = inode->i_flock;
  1014. if ((flock == NULL) || (flock->fl_flags & FL_LEASE) == 0)
  1015. goto out;
  1016. for (fl = flock; fl && (fl->fl_flags & FL_LEASE); fl = fl->fl_next)
  1017. if (fl->fl_owner == current->files)
  1018. i_have_this_lease = 1;
  1019. if (mode & FMODE_WRITE) {
  1020. /* If we want write access, we have to revoke any lease. */
  1021. future = F_UNLCK | F_INPROGRESS;
  1022. } else if (flock->fl_type & F_INPROGRESS) {
  1023. /* If the lease is already being broken, we just leave it */
  1024. future = flock->fl_type;
  1025. } else if (flock->fl_type & F_WRLCK) {
  1026. /* Downgrade the exclusive lease to a read-only lease. */
  1027. future = F_RDLCK | F_INPROGRESS;
  1028. } else {
  1029. /* the existing lease was read-only, so we can read too. */
  1030. goto out;
  1031. }
  1032. if (alloc_err && !i_have_this_lease && ((mode & O_NONBLOCK) == 0)) {
  1033. error = alloc_err;
  1034. goto out;
  1035. }
  1036. break_time = 0;
  1037. if (lease_break_time > 0) {
  1038. break_time = jiffies + lease_break_time * HZ;
  1039. if (break_time == 0)
  1040. break_time++; /* so that 0 means no break time */
  1041. }
  1042. for (fl = flock; fl && (fl->fl_flags & FL_LEASE); fl = fl->fl_next) {
  1043. if (fl->fl_type != future) {
  1044. fl->fl_type = future;
  1045. fl->fl_break_time = break_time;
  1046. kill_fasync(&fl->fl_fasync, SIGIO, POLL_MSG);
  1047. }
  1048. }
  1049. if (i_have_this_lease || (mode & O_NONBLOCK)) {
  1050. error = -EWOULDBLOCK;
  1051. goto out;
  1052. }
  1053. restart:
  1054. break_time = flock->fl_break_time;
  1055. if (break_time != 0) {
  1056. break_time -= jiffies;
  1057. if (break_time == 0)
  1058. break_time++;
  1059. }
  1060. error = locks_block_on_timeout(flock, new_fl, break_time);
  1061. if (error >= 0) {
  1062. if (error == 0)
  1063. time_out_leases(inode);
  1064. /* Wait for the next lease that has not been broken yet */
  1065. for (flock = inode->i_flock;
  1066. flock && (flock->fl_flags & FL_LEASE);
  1067. flock = flock->fl_next) {
  1068. if (flock->fl_type & F_INPROGRESS)
  1069. goto restart;
  1070. }
  1071. error = 0;
  1072. }
  1073. out:
  1074. unlock_kernel();
  1075. if (!alloc_err)
  1076. locks_free_lock(new_fl);
  1077. return error;
  1078. }
  1079. /**
  1080.  * lease_get_mtime
  1081.  * @inode: the inode
  1082.  *
  1083.  * This is to force NFS clients to flush their caches for files with
  1084.  * exclusive leases.  The justification is that if someone has an
  1085.  * exclusive lease, then they could be modifiying it.
  1086.  */
  1087. time_t lease_get_mtime(struct inode *inode)
  1088. {
  1089. struct file_lock *flock = inode->i_flock;
  1090. if (flock && (flock->fl_flags & FL_LEASE) && (flock->fl_type & F_WRLCK))
  1091. return CURRENT_TIME;
  1092. return inode->i_mtime;
  1093. }
  1094. /**
  1095.  * fcntl_getlease - Enquire what lease is currently active
  1096.  * @filp: the file
  1097.  *
  1098.  * The value returned by this function will be one of
  1099.  * (if no lease break is pending):
  1100.  *
  1101.  * %F_RDLCK to indicate a shared lease is held.
  1102.  *
  1103.  * %F_WRLCK to indicate an exclusive lease is held.
  1104.  *
  1105.  * %F_UNLCK to indicate no lease is held.
  1106.  *
  1107.  * (if a lease break is pending):
  1108.  *
  1109.  * %F_RDLCK to indicate an exclusive lease needs to be
  1110.  * changed to a shared lease (or removed).
  1111.  *
  1112.  * %F_UNLCK to indicate the lease needs to be removed.
  1113.  *
  1114.  * XXX: sfr & willy disagree over whether F_INPROGRESS
  1115.  * should be returned to userspace.
  1116.  */
  1117. int fcntl_getlease(struct file *filp)
  1118. {
  1119. struct file_lock *fl;
  1120. int type = F_UNLCK;
  1121. lock_kernel();
  1122. time_out_leases(filp->f_dentry->d_inode);
  1123. for (fl = filp->f_dentry->d_inode->i_flock;
  1124. fl && (fl->fl_flags & FL_LEASE);
  1125. fl = fl->fl_next) {
  1126. if (fl->fl_file == filp) {
  1127. type = fl->fl_type & ~F_INPROGRESS;
  1128. break;
  1129. }
  1130. }
  1131. unlock_kernel();
  1132. return type;
  1133. }
  1134. /**
  1135.  * fcntl_setlease - sets a lease on an open file
  1136.  * @fd: open file descriptor
  1137.  * @filp: file pointer
  1138.  * @arg: type of lease to obtain
  1139.  *
  1140.  * Call this fcntl to establish a lease on the file.
  1141.  * Note that you also need to call %F_SETSIG to
  1142.  * receive a signal when the lease is broken.
  1143.  */
  1144. int fcntl_setlease(unsigned int fd, struct file *filp, long arg)
  1145. {
  1146. struct file_lock *fl, **before, **my_before = NULL;
  1147. struct dentry *dentry;
  1148. struct inode *inode;
  1149. int error, rdlease_count = 0, wrlease_count = 0;
  1150. dentry = filp->f_dentry;
  1151. inode = dentry->d_inode;
  1152. if ((current->fsuid != inode->i_uid) && !capable(CAP_LEASE))
  1153. return -EACCES;
  1154. if (!S_ISREG(inode->i_mode))
  1155. return -EINVAL;
  1156. lock_kernel();
  1157. time_out_leases(inode);
  1158. /*
  1159.  * FIXME: What about F_RDLCK and files open for writing?
  1160.  */
  1161. error = -EAGAIN;
  1162. if ((arg == F_WRLCK)
  1163.     && ((atomic_read(&dentry->d_count) > 1)
  1164. || (atomic_read(&inode->i_count) > 1)))
  1165. goto out_unlock;
  1166. /*
  1167.  * At this point, we know that if there is an exclusive
  1168.  * lease on this file, then we hold it on this filp
  1169.  * (otherwise our open of this file would have blocked).
  1170.  * And if we are trying to acquire an exclusive lease,
  1171.  * then the file is not open by anyone (including us)
  1172.  * except for this filp.
  1173.  */
  1174. for (before = &inode->i_flock;
  1175. ((fl = *before) != NULL) && (fl->fl_flags & FL_LEASE);
  1176. before = &fl->fl_next) {
  1177. if (fl->fl_file == filp)
  1178. my_before = before;
  1179. else if (fl->fl_type == (F_INPROGRESS | F_UNLCK))
  1180. /*
  1181.  * Someone is in the process of opening this
  1182.  * file for writing so we may not take an
  1183.  * exclusive lease on it.
  1184.  */
  1185. wrlease_count++;
  1186. else
  1187. rdlease_count++;
  1188. }
  1189. if ((arg == F_RDLCK && (wrlease_count > 0)) ||
  1190.     (arg == F_WRLCK && ((rdlease_count + wrlease_count) > 0)))
  1191. goto out_unlock;
  1192. if (my_before != NULL) {
  1193. error = lease_modify(my_before, arg);
  1194. goto out_unlock;
  1195. }
  1196. error = 0;
  1197. if (arg == F_UNLCK)
  1198. goto out_unlock;
  1199. error = -EINVAL;
  1200. if (!leases_enable)
  1201. goto out_unlock;
  1202. error = lease_alloc(filp, arg, &fl);
  1203. if (error)
  1204. goto out_unlock;
  1205. error = fasync_helper(fd, filp, 1, &fl->fl_fasync);
  1206. if (error < 0) {
  1207. locks_free_lock(fl);
  1208. goto out_unlock;
  1209. }
  1210. fl->fl_next = *before;
  1211. *before = fl;
  1212. list_add(&fl->fl_link, &file_lock_list);
  1213. filp->f_owner.pid = current->pid;
  1214. filp->f_owner.uid = current->uid;
  1215. filp->f_owner.euid = current->euid;
  1216. out_unlock:
  1217. unlock_kernel();
  1218. return error;
  1219. }
  1220. /**
  1221.  * sys_flock: - flock() system call.
  1222.  * @fd: the file descriptor to lock.
  1223.  * @cmd: the type of lock to apply.
  1224.  *
  1225.  * Apply a %FL_FLOCK style lock to an open file descriptor.
  1226.  * The @cmd can be one of
  1227.  *
  1228.  * %LOCK_SH -- a shared lock.
  1229.  *
  1230.  * %LOCK_EX -- an exclusive lock.
  1231.  *
  1232.  * %LOCK_UN -- remove an existing lock.
  1233.  *
  1234.  * %LOCK_MAND -- a `mandatory' flock.  This exists to emulate Windows Share Modes.
  1235.  *
  1236.  * %LOCK_MAND can be combined with %LOCK_READ or %LOCK_WRITE to allow other
  1237.  * processes read and write access respectively.
  1238.  */
  1239. asmlinkage long sys_flock(unsigned int fd, unsigned int cmd)
  1240. {
  1241. struct file *filp;
  1242. int error, type;
  1243. error = -EBADF;
  1244. filp = fget(fd);
  1245. if (!filp)
  1246. goto out;
  1247. error = flock_translate_cmd(cmd);
  1248. if (error < 0)
  1249. goto out_putf;
  1250. type = error;
  1251. error = -EBADF;
  1252. if ((type != F_UNLCK)
  1253. #ifdef MSNFS
  1254. && !(type & LOCK_MAND)
  1255. #endif
  1256. && !(filp->f_mode & 3))
  1257. goto out_putf;
  1258. lock_kernel();
  1259. error = flock_lock_file(filp, type,
  1260. (cmd & (LOCK_UN | LOCK_NB)) ? 0 : 1);
  1261. unlock_kernel();
  1262. out_putf:
  1263. fput(filp);
  1264. out:
  1265. return error;
  1266. }
  1267. /* Report the first existing lock that would conflict with l.
  1268.  * This implements the F_GETLK command of fcntl().
  1269.  */
  1270. int fcntl_getlk(unsigned int fd, struct flock *l)
  1271. {
  1272. struct file *filp;
  1273. struct file_lock *fl, file_lock;
  1274. struct flock flock;
  1275. int error;
  1276. error = -EFAULT;
  1277. if (copy_from_user(&flock, l, sizeof(flock)))
  1278. goto out;
  1279. error = -EINVAL;
  1280. if ((flock.l_type != F_RDLCK) && (flock.l_type != F_WRLCK))
  1281. goto out;
  1282. error = -EBADF;
  1283. filp = fget(fd);
  1284. if (!filp)
  1285. goto out;
  1286. error = flock_to_posix_lock(filp, &file_lock, &flock);
  1287. if (error)
  1288. goto out_putf;
  1289. if (filp->f_op && filp->f_op->lock) {
  1290. error = filp->f_op->lock(filp, F_GETLK, &file_lock);
  1291. if (error < 0)
  1292. goto out_putf;
  1293. else if (error == LOCK_USE_CLNT)
  1294.   /* Bypass for NFS with no locking - 2.0.36 compat */
  1295.   fl = posix_test_lock(filp, &file_lock);
  1296. else
  1297.   fl = (file_lock.fl_type == F_UNLCK ? NULL : &file_lock);
  1298. } else {
  1299. fl = posix_test_lock(filp, &file_lock);
  1300. }
  1301.  
  1302. flock.l_type = F_UNLCK;
  1303. if (fl != NULL) {
  1304. flock.l_pid = fl->fl_pid;
  1305. #if BITS_PER_LONG == 32
  1306. /*
  1307.  * Make sure we can represent the posix lock via
  1308.  * legacy 32bit flock.
  1309.  */
  1310. error = -EOVERFLOW;
  1311. if (fl->fl_start > OFFT_OFFSET_MAX)
  1312. goto out_putf;
  1313. if ((fl->fl_end != OFFSET_MAX)
  1314.     && (fl->fl_end > OFFT_OFFSET_MAX))
  1315. goto out_putf;
  1316. #endif
  1317. flock.l_start = fl->fl_start;
  1318. flock.l_len = fl->fl_end == OFFSET_MAX ? 0 :
  1319. fl->fl_end - fl->fl_start + 1;
  1320. flock.l_whence = 0;
  1321. flock.l_type = fl->fl_type;
  1322. }
  1323. error = -EFAULT;
  1324. if (!copy_to_user(l, &flock, sizeof(flock)))
  1325. error = 0;
  1326.   
  1327. out_putf:
  1328. fput(filp);
  1329. out:
  1330. return error;
  1331. }
  1332. /* Apply the lock described by l to an open file descriptor.
  1333.  * This implements both the F_SETLK and F_SETLKW commands of fcntl().
  1334.  */
  1335. int fcntl_setlk(unsigned int fd, unsigned int cmd, struct flock *l)
  1336. {
  1337. struct file *filp;
  1338. struct file_lock *file_lock = locks_alloc_lock(0);
  1339. struct flock flock;
  1340. struct inode *inode;
  1341. int error;
  1342. if (file_lock == NULL)
  1343. return -ENOLCK;
  1344. /*
  1345.  * This might block, so we do it before checking the inode.
  1346.  */
  1347. error = -EFAULT;
  1348. if (copy_from_user(&flock, l, sizeof(flock)))
  1349. goto out;
  1350. /* Get arguments and validate them ...
  1351.  */
  1352. error = -EBADF;
  1353. filp = fget(fd);
  1354. if (!filp)
  1355. goto out;
  1356. error = -EINVAL;
  1357. inode = filp->f_dentry->d_inode;
  1358. /* Don't allow mandatory locks on files that may be memory mapped
  1359.  * and shared.
  1360.  */
  1361. if (IS_MANDLOCK(inode) &&
  1362.     (inode->i_mode & (S_ISGID | S_IXGRP)) == S_ISGID) {
  1363. struct address_space *mapping = inode->i_mapping;
  1364. if (mapping->i_mmap_shared != NULL) {
  1365. error = -EAGAIN;
  1366. goto out_putf;
  1367. }
  1368. }
  1369. error = flock_to_posix_lock(filp, file_lock, &flock);
  1370. if (error)
  1371. goto out_putf;
  1372. error = -EBADF;
  1373. switch (flock.l_type) {
  1374. case F_RDLCK:
  1375. if (!(filp->f_mode & FMODE_READ))
  1376. goto out_putf;
  1377. break;
  1378. case F_WRLCK:
  1379. if (!(filp->f_mode & FMODE_WRITE))
  1380. goto out_putf;
  1381. break;
  1382. case F_UNLCK:
  1383. break;
  1384. case F_SHLCK:
  1385. case F_EXLCK:
  1386. #ifdef __sparc__
  1387. /* warn a bit for now, but don't overdo it */
  1388. {
  1389. static int count = 0;
  1390. if (!count) {
  1391. count=1;
  1392. printk(KERN_WARNING
  1393.        "fcntl_setlk() called by process %d (%s) with broken flock() emulationn",
  1394.        current->pid, current->comm);
  1395. }
  1396. }
  1397. if (!(filp->f_mode & 3))
  1398. goto out_putf;
  1399. break;
  1400. #endif
  1401. default:
  1402. error = -EINVAL;
  1403. goto out_putf;
  1404. }
  1405. if (filp->f_op && filp->f_op->lock != NULL) {
  1406. error = filp->f_op->lock(filp, cmd, file_lock);
  1407. if (error < 0)
  1408. goto out_putf;
  1409. }
  1410. error = posix_lock_file(filp, file_lock, cmd == F_SETLKW);
  1411. out_putf:
  1412. fput(filp);
  1413. out:
  1414. locks_free_lock(file_lock);
  1415. return error;
  1416. }
  1417. #if BITS_PER_LONG == 32
  1418. /* Report the first existing lock that would conflict with l.
  1419.  * This implements the F_GETLK command of fcntl().
  1420.  */
  1421. int fcntl_getlk64(unsigned int fd, struct flock64 *l)
  1422. {
  1423. struct file *filp;
  1424. struct file_lock *fl, file_lock;
  1425. struct flock64 flock;
  1426. int error;
  1427. error = -EFAULT;
  1428. if (copy_from_user(&flock, l, sizeof(flock)))
  1429. goto out;
  1430. error = -EINVAL;
  1431. if ((flock.l_type != F_RDLCK) && (flock.l_type != F_WRLCK))
  1432. goto out;
  1433. error = -EBADF;
  1434. filp = fget(fd);
  1435. if (!filp)
  1436. goto out;
  1437. error = flock64_to_posix_lock(filp, &file_lock, &flock);
  1438. if (error)
  1439. goto out_putf;
  1440. if (filp->f_op && filp->f_op->lock) {
  1441. error = filp->f_op->lock(filp, F_GETLK, &file_lock);
  1442. if (error < 0)
  1443. goto out_putf;
  1444. else if (error == LOCK_USE_CLNT)
  1445.   /* Bypass for NFS with no locking - 2.0.36 compat */
  1446.   fl = posix_test_lock(filp, &file_lock);
  1447. else
  1448.   fl = (file_lock.fl_type == F_UNLCK ? NULL : &file_lock);
  1449. } else {
  1450. fl = posix_test_lock(filp, &file_lock);
  1451. }
  1452.  
  1453. flock.l_type = F_UNLCK;
  1454. if (fl != NULL) {
  1455. flock.l_pid = fl->fl_pid;
  1456. flock.l_start = fl->fl_start;
  1457. flock.l_len = fl->fl_end == OFFSET_MAX ? 0 :
  1458. fl->fl_end - fl->fl_start + 1;
  1459. flock.l_whence = 0;
  1460. flock.l_type = fl->fl_type;
  1461. }
  1462. error = -EFAULT;
  1463. if (!copy_to_user(l, &flock, sizeof(flock)))
  1464. error = 0;
  1465.   
  1466. out_putf:
  1467. fput(filp);
  1468. out:
  1469. return error;
  1470. }
  1471. /* Apply the lock described by l to an open file descriptor.
  1472.  * This implements both the F_SETLK and F_SETLKW commands of fcntl().
  1473.  */
  1474. int fcntl_setlk64(unsigned int fd, unsigned int cmd, struct flock64 *l)
  1475. {
  1476. struct file *filp;
  1477. struct file_lock *file_lock = locks_alloc_lock(0);
  1478. struct flock64 flock;
  1479. struct inode *inode;
  1480. int error;
  1481. if (file_lock == NULL)
  1482. return -ENOLCK;
  1483. /*
  1484.  * This might block, so we do it before checking the inode.
  1485.  */
  1486. error = -EFAULT;
  1487. if (copy_from_user(&flock, l, sizeof(flock)))
  1488. goto out;
  1489. /* Get arguments and validate them ...
  1490.  */
  1491. error = -EBADF;
  1492. filp = fget(fd);
  1493. if (!filp)
  1494. goto out;
  1495. error = -EINVAL;
  1496. inode = filp->f_dentry->d_inode;
  1497. /* Don't allow mandatory locks on files that may be memory mapped
  1498.  * and shared.
  1499.  */
  1500. if (IS_MANDLOCK(inode) &&
  1501.     (inode->i_mode & (S_ISGID | S_IXGRP)) == S_ISGID) {
  1502. struct address_space *mapping = inode->i_mapping;
  1503. if (mapping->i_mmap_shared != NULL) {
  1504. error = -EAGAIN;
  1505. goto out_putf;
  1506. }
  1507. }
  1508. error = flock64_to_posix_lock(filp, file_lock, &flock);
  1509. if (error)
  1510. goto out_putf;
  1511. error = -EBADF;
  1512. switch (flock.l_type) {
  1513. case F_RDLCK:
  1514. if (!(filp->f_mode & FMODE_READ))
  1515. goto out_putf;
  1516. break;
  1517. case F_WRLCK:
  1518. if (!(filp->f_mode & FMODE_WRITE))
  1519. goto out_putf;
  1520. break;
  1521. case F_UNLCK:
  1522. break;
  1523. case F_SHLCK:
  1524. case F_EXLCK:
  1525. default:
  1526. error = -EINVAL;
  1527. goto out_putf;
  1528. }
  1529. if (filp->f_op && filp->f_op->lock != NULL) {
  1530. error = filp->f_op->lock(filp, cmd, file_lock);
  1531. if (error < 0)
  1532. goto out_putf;
  1533. }
  1534. error = posix_lock_file(filp, file_lock, cmd == F_SETLKW64);
  1535. out_putf:
  1536. fput(filp);
  1537. out:
  1538. locks_free_lock(file_lock);
  1539. return error;
  1540. }
  1541. #endif /* BITS_PER_LONG == 32 */
  1542. /*
  1543.  * This function is called when the file is being removed
  1544.  * from the task's fd array.
  1545.  */
  1546. void locks_remove_posix(struct file *filp, fl_owner_t owner)
  1547. {
  1548. struct inode * inode = filp->f_dentry->d_inode;
  1549. struct file_lock *fl;
  1550. struct file_lock **before;
  1551. /*
  1552.  * For POSIX locks we free all locks on this file for the given task.
  1553.  */
  1554. if (!inode->i_flock) {
  1555. /*
  1556.  * Notice that something might be grabbing a lock right now.
  1557.  * Consider it as a race won by us - event is async, so even if
  1558.  * we miss the lock added we can trivially consider it as added
  1559.  * after we went through this call.
  1560.  */
  1561. return;
  1562. }
  1563. lock_kernel();
  1564. before = &inode->i_flock;
  1565. while ((fl = *before) != NULL) {
  1566. if ((fl->fl_flags & FL_POSIX) && fl->fl_owner == owner) {
  1567. locks_unlock_delete(before);
  1568. before = &inode->i_flock;
  1569. continue;
  1570. }
  1571. before = &fl->fl_next;
  1572. }
  1573. unlock_kernel();
  1574. }
  1575. /*
  1576.  * This function is called on the last close of an open file.
  1577.  */
  1578. void locks_remove_flock(struct file *filp)
  1579. {
  1580. struct inode * inode = filp->f_dentry->d_inode; 
  1581. struct file_lock *fl;
  1582. struct file_lock **before;
  1583. if (!inode->i_flock)
  1584. return;
  1585. lock_kernel();
  1586. before = &inode->i_flock;
  1587. while ((fl = *before) != NULL) {
  1588. if (fl->fl_file == filp) {
  1589. if (fl->fl_flags & FL_FLOCK) {
  1590. locks_delete_lock(before, 0);
  1591. continue;
  1592. }
  1593. if (fl->fl_flags & FL_LEASE) {
  1594. lease_modify(before, F_UNLCK);
  1595. continue;
  1596. }
  1597.   }
  1598. before = &fl->fl_next;
  1599. }
  1600. unlock_kernel();
  1601. }
  1602. /**
  1603.  * posix_block_lock - blocks waiting for a file lock
  1604.  * @blocker: the lock which is blocking
  1605.  * @waiter: the lock which conflicts and has to wait
  1606.  *
  1607.  * lockd needs to block waiting for locks.
  1608.  */
  1609. void
  1610. posix_block_lock(struct file_lock *blocker, struct file_lock *waiter)
  1611. {
  1612. locks_insert_block(blocker, waiter);
  1613. }
  1614. /**
  1615.  * posix_unblock_lock - stop waiting for a file lock
  1616.  * @waiter: the lock which was waiting
  1617.  *
  1618.  * lockd needs to block waiting for locks.
  1619.  */
  1620. void
  1621. posix_unblock_lock(struct file_lock *waiter)
  1622. {
  1623. if (!list_empty(&waiter->fl_block))
  1624. locks_delete_block(waiter);
  1625. }
  1626. static void lock_get_status(char* out, struct file_lock *fl, int id, char *pfx)
  1627. {
  1628. struct inode *inode = NULL;
  1629. if (fl->fl_file != NULL)
  1630. inode = fl->fl_file->f_dentry->d_inode;
  1631. out += sprintf(out, "%d:%s ", id, pfx);
  1632. if (fl->fl_flags & FL_POSIX) {
  1633. out += sprintf(out, "%6s %s ",
  1634.      (fl->fl_flags & FL_ACCESS) ? "ACCESS" : "POSIX ",
  1635.      (inode == NULL) ? "*NOINODE*" :
  1636.      (IS_MANDLOCK(inode) &&
  1637.       (inode->i_mode & (S_IXGRP | S_ISGID)) == S_ISGID) ?
  1638.      "MANDATORY" : "ADVISORY ");
  1639. } else if (fl->fl_flags & FL_FLOCK) {
  1640. #ifdef MSNFS
  1641. if (fl->fl_type & LOCK_MAND) {
  1642. out += sprintf(out, "FLOCK  MSNFS     ");
  1643. } else
  1644. #endif
  1645. out += sprintf(out, "FLOCK  ADVISORY  ");
  1646. } else if (fl->fl_flags & FL_LEASE) {
  1647. out += sprintf(out, "LEASE  ");
  1648. if (fl->fl_type & F_INPROGRESS)
  1649. out += sprintf(out, "BREAKING  ");
  1650. else if (fl->fl_file)
  1651. out += sprintf(out, "ACTIVE    ");
  1652. else
  1653. out += sprintf(out, "BREAKER   ");
  1654. } else {
  1655. out += sprintf(out, "UNKNOWN UNKNOWN  ");
  1656. }
  1657. #ifdef MSNFS
  1658. if (fl->fl_type & LOCK_MAND) {
  1659. out += sprintf(out, "%s ",
  1660.        (fl->fl_type & LOCK_READ)
  1661.        ? (fl->fl_type & LOCK_WRITE) ? "RW   " : "READ "
  1662.        : (fl->fl_type & LOCK_WRITE) ? "WRITE" : "NONE ");
  1663. } else
  1664. #endif
  1665. out += sprintf(out, "%s ",
  1666.        (fl->fl_type & F_INPROGRESS)
  1667.        ? (fl->fl_type & F_UNLCK) ? "UNLCK" : "READ "
  1668.        : (fl->fl_type & F_WRLCK) ? "WRITE" : "READ ");
  1669. out += sprintf(out, "%d %s:%ld ",
  1670.      fl->fl_pid,
  1671.      inode ? kdevname(inode->i_dev) : "<none>",
  1672.      inode ? inode->i_ino : 0);
  1673. out += sprintf(out, "%Ld ", fl->fl_start);
  1674. if (fl->fl_end == OFFSET_MAX)
  1675. out += sprintf(out, "EOF ");
  1676. else
  1677. out += sprintf(out, "%Ld ", fl->fl_end);
  1678. sprintf(out, "%08lx %08lx %08lx %08lx %08lxn",
  1679. (long)fl, (long)fl->fl_link.prev, (long)fl->fl_link.next,
  1680. (long)fl->fl_next, (long)fl->fl_block.next);
  1681. }
  1682. static void move_lock_status(char **p, off_t* pos, off_t offset)
  1683. {
  1684. int len;
  1685. len = strlen(*p);
  1686. if(*pos >= offset) {
  1687. /* the complete line is valid */
  1688. *p += len;
  1689. *pos += len;
  1690. return;
  1691. }
  1692. if(*pos+len > offset) {
  1693. /* use the second part of the line */
  1694. int i = offset-*pos;
  1695. memmove(*p,*p+i,len-i);
  1696. *p += len-i;
  1697. *pos += len;
  1698. return;
  1699. }
  1700. /* discard the complete line */
  1701. *pos += len;
  1702. }
  1703. /**
  1704.  * get_locks_status - reports lock usage in /proc/locks
  1705.  * @buffer: address in userspace to write into
  1706.  * @start: ?
  1707.  * @offset: how far we are through the buffer
  1708.  * @length: how much to read
  1709.  */
  1710. int get_locks_status(char *buffer, char **start, off_t offset, int length)
  1711. {
  1712. struct list_head *tmp;
  1713. char *q = buffer;
  1714. off_t pos = 0;
  1715. int i = 0;
  1716. lock_kernel();
  1717. list_for_each(tmp, &file_lock_list) {
  1718. struct list_head *btmp;
  1719. struct file_lock *fl = list_entry(tmp, struct file_lock, fl_link);
  1720. lock_get_status(q, fl, ++i, "");
  1721. move_lock_status(&q, &pos, offset);
  1722. if(pos >= offset+length)
  1723. goto done;
  1724. list_for_each(btmp, &fl->fl_block) {
  1725. struct file_lock *bfl = list_entry(btmp,
  1726. struct file_lock, fl_block);
  1727. lock_get_status(q, bfl, i, " ->");
  1728. move_lock_status(&q, &pos, offset);
  1729. if(pos >= offset+length)
  1730. goto done;
  1731. }
  1732. }
  1733. done:
  1734. unlock_kernel();
  1735. *start = buffer;
  1736. if(q-buffer < length)
  1737. return (q-buffer);
  1738. return length;
  1739. }
  1740. #ifdef MSNFS
  1741. /**
  1742.  * lock_may_read - checks that the region is free of locks
  1743.  * @inode: the inode that is being read
  1744.  * @start: the first byte to read
  1745.  * @len: the number of bytes to read
  1746.  *
  1747.  * Emulates Windows locking requirements.  Whole-file
  1748.  * mandatory locks (share modes) can prohibit a read and
  1749.  * byte-range POSIX locks can prohibit a read if they overlap.
  1750.  *
  1751.  * N.B. this function is only ever called
  1752.  * from knfsd and ownership of locks is never checked.
  1753.  */
  1754. int lock_may_read(struct inode *inode, loff_t start, unsigned long len)
  1755. {
  1756. struct file_lock *fl;
  1757. int result = 1;
  1758. lock_kernel();
  1759. for (fl = inode->i_flock; fl != NULL; fl = fl->fl_next) {
  1760. if (fl->fl_flags == FL_POSIX) {
  1761. if (fl->fl_type == F_RDLCK)
  1762. continue;
  1763. if ((fl->fl_end < start) || (fl->fl_start > (start + len)))
  1764. continue;
  1765. } else if (fl->fl_flags == FL_FLOCK) {
  1766. if (!(fl->fl_type & LOCK_MAND))
  1767. continue;
  1768. if (fl->fl_type & LOCK_READ)
  1769. continue;
  1770. } else
  1771. continue;
  1772. result = 0;
  1773. break;
  1774. }
  1775. unlock_kernel();
  1776. return result;
  1777. }
  1778. /**
  1779.  * lock_may_write - checks that the region is free of locks
  1780.  * @inode: the inode that is being written
  1781.  * @start: the first byte to write
  1782.  * @len: the number of bytes to write
  1783.  *
  1784.  * Emulates Windows locking requirements.  Whole-file
  1785.  * mandatory locks (share modes) can prohibit a write and
  1786.  * byte-range POSIX locks can prohibit a write if they overlap.
  1787.  *
  1788.  * N.B. this function is only ever called
  1789.  * from knfsd and ownership of locks is never checked.
  1790.  */
  1791. int lock_may_write(struct inode *inode, loff_t start, unsigned long len)
  1792. {
  1793. struct file_lock *fl;
  1794. int result = 1;
  1795. lock_kernel();
  1796. for (fl = inode->i_flock; fl != NULL; fl = fl->fl_next) {
  1797. if (fl->fl_flags == FL_POSIX) {
  1798. if ((fl->fl_end < start) || (fl->fl_start > (start + len)))
  1799. continue;
  1800. } else if (fl->fl_flags == FL_FLOCK) {
  1801. if (!(fl->fl_type & LOCK_MAND))
  1802. continue;
  1803. if (fl->fl_type & LOCK_WRITE)
  1804. continue;
  1805. } else
  1806. continue;
  1807. result = 0;
  1808. break;
  1809. }
  1810. unlock_kernel();
  1811. return result;
  1812. }
  1813. #endif
  1814. static int __init filelock_init(void)
  1815. {
  1816. filelock_cache = kmem_cache_create("file_lock_cache",
  1817. sizeof(struct file_lock), 0, 0, init_once, NULL);
  1818. if (!filelock_cache)
  1819. panic("cannot create file lock slab cache");
  1820. return 0;
  1821. }
  1822. module_init(filelock_init)