fat: Fix non-atomic NFS i_pos read
PATCH v2 1/1 fat: Fix non-atomic NFS i_pos read
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 <[email protected]>
Acked-by OGAWA Hirofumi <[email protected]>
---
fs/fat/inode.c +6 -7
@@ -738,22 +738,21 @@ 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 msdos_sb_info *sbi =MSDOS_SB (inode->i_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 ;
OGAWA Hirofumi
maintainerQuoted 40 lines · Steven J. Magnani
fat_encode_fh()can fetch an invalidi_posvalue 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 <[email protected]>Acked-by OGAWA Hirofumi <[email protected]>---
diff -uprNlinux-3.5-rc4/fs/fat/inode.cnew/fs/fat/inode.cfs/fat/inode.c +6
-7@@ -738,22 +738,21 @@ 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 msdos_sb_info *sbi =MSDOS_SB (inode->i_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 ;
Signature · 1 line
OGAWA Hirofumi <[email protected]>