linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] VERSION 2: fs/locks.c fcntl_setlease did not check if a file was opened for writing before granting a read lease
@ 2003-11-27 18:11 Joseph D. Wagner
  0 siblings, 0 replies; only message in thread
From: Joseph D. Wagner @ 2003-11-27 18:11 UTC (permalink / raw)
  To: Jamie Lokier, Nikita Danilov, Matthew Wilcox; +Cc: linux-fsdevel, linux-kernel

> Sorry, it won't work.

Then try this.  A half-@$$ed patch is better than no patch at all.

Joseph D. Wagner

--- /old/src/linux-2.4.22/fs/locks.c	2003-08-25 17:44:43.000000000 +0600
+++ /new/src/linux-2.4.22/fs/locks.c	2003-11-28 00:05:11.000000000 +0600
@@ -111,10 +111,17 @@
  *  Matthew Wilcox <willy@thepuffingroup.com>, March, 2000.
  *
  *  Leases and LOCK_MAND
  *  Matthew Wilcox <willy@linuxcare.com>, June, 2000.
  *  Stephen Rothwell <sfr@canb.auug.org.au>, June, 2000.
+ *
+ *  PARTIALLY FIXED Leases Issue -- Function fcntl_setlease would only
+ *  check if a file had been opened before granting a F_WRLCK, a.k.a. a
+ *  write lease.  It would not check if the file had be opened for
+ *  writing before granting a F_RDLCK, a.k.a. a read lease.  This issue
+ *  has been partially resolved.  See FIXME below.
+ *  Joseph D. Wagner <wagnerjd@users.sourceforge.net> November 2003
  */

 #include <linux/slab.h>
 #include <linux/file.h>
 #include <linux/smp_lock.h>
@@ -1287,14 +1294,33 @@

 	lock_kernel();

 	time_out_leases(inode);
 
-	/*
-	 * FIXME: What about F_RDLCK and files open for writing?
-	 */
 	error = -EAGAIN;
+	if ((arg == F_RDLCK)
+	    && ((atomic_read(&dentry->d_count) > 1)
+		|| (atomic_read(&inode->i_count) > 1))) {
+
+		/*
+		 * FIXME: Theoretically, what would happen next
+		 * is a loop which checks each open file to see
+		 * if the file is open for writing (i.e. O_WRONLY,
+		 * O_RDWR, O_CREAT, or O_TRUNC).  However, since
+		 * that would require major overhauls in other
+		 * files, it is simply assumed that if a file is
+		 * open that the file is open for writing.  In
+		 * effect, this creates an exclusive read lease
+		 * such that only one process can obtain a read
+		 * lease at any given time.  Theoretically, a file
+		 * should be able to have a virtually limitless
+		 * number of read leases provided that no process
+		 * has the file open for writing.
+		 */
+
+		goto out_unlock;
+	}
 	if ((arg == F_WRLCK)
 	    && ((atomic_read(&dentry->d_count) > 1)
 		|| (atomic_read(&inode->i_count) > 1)))
 		goto out_unlock;



^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2003-11-28  6:12 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-11-27 18:11 [PATCH] VERSION 2: fs/locks.c fcntl_setlease did not check if a file was opened for writing before granting a read lease Joseph D. Wagner

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).