lkml.org 
[lkml]   [2003]   [Nov]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[PATCH] VERSION 2: fs/locks.c fcntl_setlease did not check if a file was opened for writing before granting a read lease
Date
> 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;

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2005-03-22 13:58    [W:2.177 / U:1.044 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site