patch-2.1.88 linux/fs/umsdos/symlink.c
Next file: linux/fs/vfat/namei.c
Previous file: linux/fs/umsdos/rdir.c
Back to the patch index
Back to the overall index
- Lines: 156
- Date:
Fri Feb 20 09:44:57 1998
- Orig file:
v2.1.87/linux/fs/umsdos/symlink.c
- Orig date:
Tue Feb 17 13:12:48 1998
diff -u --recursive --new-file v2.1.87/linux/fs/umsdos/symlink.c linux/fs/umsdos/symlink.c
@@ -28,19 +28,21 @@
/*
Read the data associate with the symlink.
Return length read in buffer or a negative error code.
- FIXME, this is messed up.
- /mn/ WIP fixing...
*/
+
static int umsdos_readlink_x (
struct dentry *dentry,
char *buffer,
int bufsiz)
{
- int ret = dentry->d_inode->i_size;
+ int ret;
loff_t loffs = 0;
struct file filp;
+
+ ret = dentry->d_inode->i_size;
+
memset (&filp, 0, sizeof (filp));
filp.f_pos = 0;
@@ -51,34 +53,33 @@
if (ret > bufsiz) ret = bufsiz;
- Printk ((KERN_WARNING "umsdos_readlink_x /mn/: Checkin: filp=%p, buffer=%p, size=%ld, offs=%d\n", &filp, buffer, ret, loffs));
- Printk ((KERN_WARNING " f_op=%p\n", filp.f_op));
- Printk ((KERN_WARNING " inode=%d, i_size=%d\n", filp.f_dentry->d_inode->i_ino,filp.f_dentry->d_inode->i_size));
- Printk ((KERN_WARNING " f_pos=%ld\n", filp.f_pos));
- Printk ((KERN_WARNING " name=%12s\n", filp.f_dentry->d_name.name));
- Printk ((KERN_WARNING " i_binary(sb)=%d\n", MSDOS_I(filp.f_dentry->d_inode)->i_binary ));
- Printk ((KERN_WARNING " f_count=%d, f_flags=%d\n", filp.f_count, filp.f_flags));
- Printk ((KERN_WARNING " f_owner=%d\n", filp.f_owner));
- Printk ((KERN_WARNING " f_version=%ld\n", filp.f_version));
- Printk ((KERN_WARNING " f_reada=%ld, f_ramax=%ld, f_raend=%ld, f_ralen=%ld, f_rawin=%ld\n", filp.f_reada, filp.f_ramax, filp.f_raend, filp.f_ralen, filp.f_rawin));
+ PRINTK ((KERN_DEBUG "umsdos_readlink_x /mn/: Checkin: filp=%p, buffer=%p, size=%d, offs=%Lu\n", &filp, buffer, ret, loffs));
+ PRINTK ((KERN_DEBUG " f_op=%p\n", filp.f_op));
+ PRINTK ((KERN_DEBUG " inode=%lu, i_size=%lu\n", filp.f_dentry->d_inode->i_ino, filp.f_dentry->d_inode->i_size));
+ PRINTK ((KERN_DEBUG " f_pos=%Lu\n", filp.f_pos));
+ PRINTK ((KERN_DEBUG " name=%.*s\n", (int) filp.f_dentry->d_name.len, filp.f_dentry->d_name.name));
+ PRINTK ((KERN_DEBUG " i_binary(sb)=%d\n", MSDOS_I(filp.f_dentry->d_inode)->i_binary ));
+ PRINTK ((KERN_DEBUG " f_count=%d, f_flags=%d\n", filp.f_count, filp.f_flags));
+ PRINTK ((KERN_DEBUG " f_owner=%d\n", filp.f_owner.uid));
+ PRINTK ((KERN_DEBUG " f_version=%ld\n", filp.f_version));
+ PRINTK ((KERN_DEBUG " f_reada=%ld, f_ramax=%ld, f_raend=%ld, f_ralen=%ld, f_rawin=%ld\n", filp.f_reada, filp.f_ramax, filp.f_raend, filp.f_ralen, filp.f_rawin));
- /* FIXME */
- Printk (("umsdos_readlink_x: FIXME /mn/: running fat_file_read (%p, %p, %d, %ld)\n", &filp, buffer, ret, loffs));
+ PRINTK ((KERN_DEBUG"umsdos_readlink_x: FIXME /mn/: running fat_file_read (%p, %p, %d, %Lu)\n", &filp, buffer, ret, loffs));
if (fat_file_read (&filp, buffer, (size_t) ret, &loffs) != ret){
ret = -EIO;
}
-#if 0
+#if 0 /* DEBUG */
{
struct umsdos_dirent *mydirent=buffer;
- Printk ((KERN_DEBUG " (DDD) uid=%d\n",mydirent->uid));
- Printk ((KERN_DEBUG " (DDD) gid=%d\n",mydirent->gid));
- Printk ((KERN_DEBUG " (DDD) name=>%20s<\n",mydirent->name));
+ PRINTK ((KERN_DEBUG " (DDD) uid=%d\n",mydirent->uid));
+ PRINTK ((KERN_DEBUG " (DDD) gid=%d\n",mydirent->gid));
+ PRINTK ((KERN_DEBUG " (DDD) name=>%.20s<\n",mydirent->name));
}
#endif
- Printk (("umsdos_readlink_x: FIXME /mn/: fat_file_read returned offs=%ld ret=%d\n", loffs, ret));
+ PRINTK ((KERN_DEBUG "umsdos_readlink_x: FIXME /mn/: fat_file_read returned offs=%Lu ret=%d\n", loffs, ret));
return ret;
}
@@ -88,33 +89,57 @@
{
int ret;
- Printk (("UMSDOS_readlink: calling umsdos_readlink_x for %20s\n", dentry->d_name.name));
+ PRINTK ((KERN_DEBUG "UMSDOS_readlink: calling umsdos_readlink_x for %.*s\n", (int) dentry->d_name.len, dentry->d_name.name));
ret = umsdos_readlink_x (dentry, buffer, buflen);
- Printk (("readlink %d bufsiz %d\n", ret, buflen));
+ PRINTK ((KERN_DEBUG "readlink %d bufsiz %d\n", ret, buflen));
/* dput(dentry); / * FIXME /mn/ */
- Printk (("UMSDOS_readlink /mn/: FIXME! skipped dput(dentry). returning %d\n", ret));
+ Printk ((KERN_WARNING "UMSDOS_readlink /mn/: FIXME! skipped dput(dentry). returning %d\n", ret));
return ret;
}
-static struct dentry *UMSDOS_followlink(struct dentry * dentry, struct dentry * base)
+/* this one mostly stolen from romfs :) */
+static struct dentry *UMSDOS_followlink(struct dentry *dentry, struct dentry *base)
{
- int ret;
- char symname[256];
struct inode *inode = dentry->d_inode;
+ char *symname=NULL;
+ int len, cnt;
mm_segment_t old_fs = get_fs();
- Printk ((KERN_ERR "UMSDOS_followlink /mn/: (%s/%s)\n", dentry->d_parent->d_name.name, dentry->d_name.name));
+ Printk ((KERN_DEBUG "UMSDOS_followlink /mn/: (%.*s/%.*s)\n", (int) dentry->d_parent->d_name.len, dentry->d_parent->d_name.name, (int) dentry->d_name.len, dentry->d_name.name));
+
+ len = inode->i_size;
- set_fs (KERNEL_DS); /* we read into kernel space */
- ret = umsdos_readlink_x (dentry, &symname, 256);
+ if (!(symname = kmalloc(len+1, GFP_KERNEL))) {
+ dentry = ERR_PTR(-EAGAIN); /* correct? */
+ goto outnobuf;
+ }
+
+ set_fs (KERNEL_DS); /* we read into kernel space this time */
+ PRINTK ((KERN_DEBUG "UMSDOS_followlink /mn/: Here goes umsdos_readlink_x %p, %p, %d\n", dentry, symname, len));
+ cnt = umsdos_readlink_x (dentry, symname, len);
+ PRINTK ((KERN_DEBUG "UMSDOS_followlink /mn/: back from umsdos_readlink_x %p, %p, %d!\n", dentry, symname, len));
set_fs (old_fs);
+ Printk ((KERN_DEBUG "UMSDOS_followlink /mn/: link name is %.*s with len %d\n", cnt, symname, cnt));
- base = creat_dentry (symname, ret, NULL);
-/* UMSDOS_lookup (dentry->d_parent->d_inode, base);*/
-
- return base;
+ if (len != cnt) {
+ dentry = ERR_PTR(-EIO);
+ goto out;
+ } else
+ symname[len] = 0;
+
+ dentry = lookup_dentry(symname, base, 1);
+ kfree(symname);
+
+ if (0) {
+out:
+ kfree(symname);
+outnobuf:
+ dput(base);
+ }
+ return dentry;
}
+
static struct file_operations umsdos_symlink_operations = {
NULL, /* lseek - default */
NULL, /* read */
@@ -141,7 +166,7 @@
NULL, /* mknod */
NULL, /* rename */
UMSDOS_readlink, /* readlink */
- NULL/*UMSDOS_followlink*/, /* followlink */ /* /mn/ is this REALLY needed ? I recall seeing it working w/o it... */
+ UMSDOS_followlink, /* followlink */ /* /mn/ is this REALLY needed ? I recall seeing it working w/o it... */
generic_readpage, /* readpage */ /* in original NULL. changed to generic_readpage. FIXME? /mn/ */
NULL, /* writepage */
fat_bmap, /* bmap */ /* in original NULL. changed to fat_bmap. FIXME? /mn/ */
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov