patch-2.4.26 linux-2.4.26/fs/fat/inode.c
Next file: linux-2.4.26/fs/hfsplus/wrapper.c
Previous file: linux-2.4.26/fs/devfs/base.c
Back to the patch index
Back to the overall index
- Lines: 93
- Date:
2004-04-14 06:05:40.000000000 -0700
- Orig file:
linux-2.4.25/fs/fat/inode.c
- Orig date:
2004-02-18 05:36:31.000000000 -0800
diff -urN linux-2.4.25/fs/fat/inode.c linux-2.4.26/fs/fat/inode.c
@@ -421,11 +421,13 @@
* 0/ i_ino - for fast, reliable lookup if still in the cache
* 1/ i_generation - to see if i_ino is still valid
* bit 0 == 0 iff directory
- * 2/ i_pos - if ino has changed, but still in cache (hi)
- * 3/ i_pos - if ino has changed, but still in cache (low)
- * 4/ i_logstart - to semi-verify inode found at i_location
- * 5/ parent->i_logstart - maybe used to hunt for the file on disc
+ * 2/ i_pos(8-39) - if ino has changed, but still in cache
+ * 3/ i_pos(4-7)|i_logstart - to semi-verify inode found at i_pos
+ * 4/ i_pos(0-3)|parent->i_logstart - maybe used to hunt for the file on disc
*
+ * Hack for NFSv2: Maximum FAT entry number is 28bits and maximum
+ * i_pos is 40bits (blocknr(32) + dir offset(8)), so two 4bits
+ * of i_logstart is used to store the directory entry offset.
*/
struct dentry *fat_fh_to_dentry(struct super_block *sb, __u32 *fh,
int len, int fhtype, int parent)
@@ -436,7 +438,7 @@
if (fhtype != 3)
return ERR_PTR(-ESTALE);
- if (len < 6)
+ if (len < 5)
return ERR_PTR(-ESTALE);
/* We cannot find the parent,
It better just *be* there */
@@ -444,13 +446,17 @@
return ERR_PTR(-ESTALE);
inode = iget(sb, fh[0]);
- if (!inode || is_bad_inode(inode) ||
- inode->i_generation != fh[1]) {
- if (inode) iput(inode);
+ if (!inode || is_bad_inode(inode) || inode->i_generation != fh[1]) {
+ if (inode)
+ iput(inode);
inode = NULL;
}
if (!inode) {
- loff_t i_pos = ((loff_t)fh[2] << 32) | fh[3];
+ loff_t i_pos;
+ int i_logstart = fh[3] & 0x0fffffff;
+
+ i_pos = (loff_t)fh[2] << 8;
+ i_pos |= ((fh[3] >> 24) & 0xf0) | (fh[4] >> 28);
/* try 2 - see if i_pos is in F-d-c
* require i_logstart to be the same
@@ -458,7 +464,7 @@
*/
inode = fat_iget(sb, i_pos);
- if (inode && MSDOS_I(inode)->i_logstart != fh[4]) {
+ if (inode && MSDOS_I(inode)->i_logstart != i_logstart) {
iput(inode);
inode = NULL;
}
@@ -508,24 +514,26 @@
result->d_op = sb->s_root->d_op;
result->d_flags |= DCACHE_NFSD_DISCONNECTED;
return result;
-
-
}
int fat_dentry_to_fh(struct dentry *de, __u32 *fh, int *lenp, int needparent)
{
int len = *lenp;
struct inode *inode = de->d_inode;
+ u32 ipos_h, ipos_m, ipos_l;
- if (len < 6)
+ if (len < 5)
return 255; /* no room */
- *lenp = 6;
+
+ ipos_h = MSDOS_I(inode)->i_pos >> 8;
+ ipos_m = (MSDOS_I(inode)->i_pos & 0xf0) << 24;
+ ipos_l = (MSDOS_I(inode)->i_pos & 0x0f) << 28;
+ *lenp = 5;
fh[0] = inode->i_ino;
fh[1] = inode->i_generation;
- fh[2] = (__u32)(MSDOS_I(inode)->i_pos >> 32);
- fh[3] = (__u32)MSDOS_I(inode)->i_pos;
- fh[4] = MSDOS_I(inode)->i_logstart;
- fh[5] = MSDOS_I(de->d_parent->d_inode)->i_logstart;
+ fh[2] = ipos_h;
+ fh[3] = ipos_m | MSDOS_I(inode)->i_logstart;
+ fh[4] = ipos_l | MSDOS_I(de->d_parent->d_inode)->i_logstart;
return 3;
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)