Messages in this thread Patch in this message | | | From | "Steven J. Magnani" <> | Subject | [PATCH] fat: Fix non-atomic NFS i_pos read | Date | Fri, 29 Jun 2012 12:19:10 -0500 |
| |
fat_encode_fh() can fetch an invalid i_pos value on systems where 64-bit accesses are not atomic. Make it use the same accessor as the rest of the FAT code.
Signed-off-by: Steven J. Magnani <steve@digidescorp.com> --- diff -uprN linux-3.5-rc4/fs/fat/inode.c new/fs/fat/inode.c --- linux-3.5-rc4/fs/fat/inode.c 2012-06-29 11:20:12.781348652 -0500 +++ new/fs/fat/inode.c 2012-06-29 11:25:29.484713183 -0500 @@ -738,22 +738,22 @@ static int fat_encode_fh(struct inode *inode, __u32 *fh, int *lenp, struct inode *parent) { int len = *lenp; - u32 ipos_h, ipos_m, ipos_l; + struct super_block *sb = inode->i_sb; + struct msdos_sb_info *sbi = MSDOS_SB(sb); + loff_t i_pos; if (len < 5) { *lenp = 5; return 255; /* no room */ } - 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; + i_pos = fat_i_pos_read(sbi, inode); *lenp = 5; fh[0] = inode->i_ino; fh[1] = inode->i_generation; - fh[2] = ipos_h; - fh[3] = ipos_m | MSDOS_I(inode)->i_logstart; - fh[4] = ipos_l; + fh[2] = i_pos >> 8; + fh[3] = ((i_pos & 0xf0) << 24) | MSDOS_I(inode)->i_logstart; + fh[4] = (i_pos & 0x0f) << 28; if (parent) fh[4] |= MSDOS_I(parent)->i_logstart; return 3;
| |