patch-2.4.0-test9 linux/fs/namei.c
Next file: linux/fs/ncpfs/file.c
Previous file: linux/fs/minix/truncate.c
Back to the patch index
Back to the overall index
- Lines: 138
- Date:
Fri Sep 22 14:21:18 2000
- Orig file:
v2.4.0-test8/linux/fs/namei.c
- Orig date:
Sun Sep 3 22:49:25 2000
diff -u --recursive --new-file v2.4.0-test8/linux/fs/namei.c linux/fs/namei.c
@@ -21,6 +21,7 @@
#include <linux/quotaops.h>
#include <linux/pagemap.h>
#include <linux/dcache.h>
+#include <linux/dnotify.h>
#include <asm/uaccess.h>
#include <asm/unaligned.h>
@@ -107,7 +108,7 @@
static inline int do_getname(const char *filename, char *page)
{
int retval;
- unsigned long len = PAGE_SIZE;
+ unsigned long len = PATH_MAX + 1;
if ((unsigned long) filename >= TASK_SIZE) {
if (!segment_eq(get_fs(), KERNEL_DS))
@@ -180,7 +181,7 @@
/* read and search access */
if ((mask == S_IROTH) ||
- (S_ISDIR(mode) && !(mask & ~(S_IROTH | S_IXOTH))))
+ (S_ISDIR(inode->i_mode) && !(mask & ~(S_IROTH | S_IXOTH))))
if (capable(CAP_DAC_READ_SEARCH))
return 0;
@@ -683,7 +684,7 @@
}
/* SMP-safe */
-int path_init(const char *name,unsigned int flags,struct nameidata *nd)
+int path_init(const char *name, unsigned int flags, struct nameidata *nd)
{
nd->last_type = LAST_ROOT; /* if there are only slashes... */
nd->flags = flags;
@@ -912,6 +913,8 @@
unlock_kernel();
exit_lock:
up(&dir->i_zombie);
+ if (!error)
+ inode_dir_notify(dir, DN_CREATE);
return error;
}
@@ -1066,6 +1069,13 @@
goto exit;
}
+ /*
+ * Ensure there are no outstanding leases on the file.
+ */
+ error = get_lease(inode, flag);
+ if (error)
+ goto exit;
+
if (flag & O_TRUNC) {
error = get_write_access(inode);
if (error)
@@ -1183,6 +1193,8 @@
unlock_kernel();
exit_lock:
up(&dir->i_zombie);
+ if (!error)
+ inode_dir_notify(dir, DN_CREATE);
return error;
}
@@ -1250,6 +1262,8 @@
exit_lock:
up(&dir->i_zombie);
+ if (!error)
+ inode_dir_notify(dir, DN_CREATE);
return error;
}
@@ -1338,8 +1352,10 @@
dentry->d_inode->i_flags |= S_DEAD;
}
double_up(&dir->i_zombie, &dentry->d_inode->i_zombie);
- if (!error)
+ if (!error) {
+ inode_dir_notify(dir, DN_DELETE);
d_delete(dentry);
+ }
dput(dentry);
return error;
@@ -1406,6 +1422,8 @@
}
}
up(&dir->i_zombie);
+ if (!error)
+ inode_dir_notify(dir, DN_DELETE);
return error;
}
@@ -1472,6 +1490,8 @@
exit_lock:
up(&dir->i_zombie);
+ if (!error)
+ inode_dir_notify(dir, DN_CREATE);
return error;
}
@@ -1544,6 +1564,8 @@
exit_lock:
up(&dir->i_zombie);
+ if (!error)
+ inode_dir_notify(dir, DN_CREATE);
return error;
}
@@ -1749,10 +1771,20 @@
int vfs_rename(struct inode *old_dir, struct dentry *old_dentry,
struct inode *new_dir, struct dentry *new_dentry)
{
+ int error;
if (S_ISDIR(old_dentry->d_inode->i_mode))
- return vfs_rename_dir(old_dir,old_dentry,new_dir,new_dentry);
+ error = vfs_rename_dir(old_dir,old_dentry,new_dir,new_dentry);
else
- return vfs_rename_other(old_dir,old_dentry,new_dir,new_dentry);
+ error = vfs_rename_other(old_dir,old_dentry,new_dir,new_dentry);
+ if (!error) {
+ if (old_dir == new_dir)
+ inode_dir_notify(old_dir, DN_RENAME);
+ else {
+ inode_dir_notify(old_dir, DN_DELETE);
+ inode_dir_notify(new_dir, DN_CREATE);
+ }
+ }
+ return error;
}
static inline int do_rename(const char * oldname, const char * newname)
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)