home *** CD-ROM | disk | FTP | other *** search
/ ftp.parl.clemson.edu / 2015-02-07.ftp.parl.clemson.edu.tar / ftp.parl.clemson.edu / pub / pvfs2 / orangefs-2.8.3-20110323.tar.gz / orangefs-2.8.3-20110323.tar / orangefs / patches / posix-ext / posix-statlite.patch < prev    next >
Text File  |  2008-01-07  |  35KB  |  1,113 lines

  1. diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/arch/i386/kernel/syscall_table.S vanilla-new/arch/i386/kernel/syscall_table.S
  2. --- vanilla/arch/i386/kernel/syscall_table.S    2006-05-05 13:59:14.000000000 -0500
  3. +++ vanilla-new/arch/i386/kernel/syscall_table.S    2006-05-05 15:14:31.000000000 -0500
  4. @@ -312,3 +312,9 @@
  5.      .long sys_unshare        /* 310 */
  6.      .long sys_openg
  7.      .long sys_openfh
  8. +    .long sys_newstatlite
  9. +    .long sys_newlstatlite
  10. +    .long sys_newfstatlite
  11. +    .long sys_statlite64
  12. +    .long sys_lstatlite64
  13. +    .long sys_fstatlite64
  14. diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/arch/ia64/kernel/entry.S vanilla-new/arch/ia64/kernel/entry.S
  15. --- vanilla/arch/ia64/kernel/entry.S    2006-05-05 13:59:14.000000000 -0500
  16. +++ vanilla-new/arch/ia64/kernel/entry.S    2006-05-05 15:29:07.000000000 -0500
  17. @@ -1621,5 +1621,8 @@
  18.      data8 sys_unshare
  19.      data8 sys_openg
  20.      data8 sys_openfh
  21. +    data8 sys_newstatlite
  22. +    data8 sys_newlstatlite
  23. +    data8 sys_newfstatlite
  24.  
  25.      .org sys_call_table + 8*NR_syscalls    // guard against failures to increase NR_syscalls
  26. diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/arch/powerpc/kernel/systbl.S vanilla-new/arch/powerpc/kernel/systbl.S
  27. --- vanilla/arch/powerpc/kernel/systbl.S    2006-05-05 13:59:14.000000000 -0500
  28. +++ vanilla-new/arch/powerpc/kernel/systbl.S    2006-05-05 17:02:20.000000000 -0500
  29. @@ -324,3 +324,6 @@
  30.  SYSCALL(unshare)
  31.  SYSCALL(openg)
  32.  SYSCALL(openfh)
  33. +SYSCALL(newstatlite)
  34. +SYSCALL(newlstatlite)
  35. +SYSCALL(newfstatlite)
  36. diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/arch/x86_64/ia32/ia32entry.S vanilla-new/arch/x86_64/ia32/ia32entry.S
  37. --- vanilla/arch/x86_64/ia32/ia32entry.S    2006-05-05 13:59:14.000000000 -0500
  38. +++ vanilla-new/arch/x86_64/ia32/ia32entry.S    2006-05-05 15:15:16.000000000 -0500
  39. @@ -690,6 +690,12 @@
  40.      .quad sys_unshare        /* 310 */
  41.      .quad compat_sys_openg
  42.      .quad compat_sys_openfh
  43. +    .quad compat_sys_newstatlite
  44. +    .quad compat_sys_newlstatlite
  45. +    .quad compat_sys_newfstatlite
  46. +    .quad sys32_statlite64
  47. +    .quad sys32_lstatlite64
  48. +    .quad sys32_fstatlite64
  49.  ia32_syscall_end:        
  50.      .rept IA32_NR_syscalls-(ia32_syscall_end-ia32_sys_call_table)/8
  51.          .quad ni_syscall
  52. diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/arch/x86_64/ia32/sys_ia32.c vanilla-new/arch/x86_64/ia32/sys_ia32.c
  53. --- vanilla/arch/x86_64/ia32/sys_ia32.c    2006-03-19 23:53:29.000000000 -0600
  54. +++ vanilla-new/arch/x86_64/ia32/sys_ia32.c    2006-05-05 16:17:51.000000000 -0500
  55. @@ -106,6 +106,59 @@
  56.      return 0;
  57.  }
  58.  
  59. +int cp_compat_statlite(struct kstat_lite *kbuf, struct compat_stat_lite __user *ubuf)
  60. +{
  61. +    typeof(ubuf->st_uid) uid = 0;
  62. +    typeof(ubuf->st_gid) gid = 0;
  63. +    SET_UID(uid, kbuf->uid);
  64. +    SET_GID(gid, kbuf->gid);
  65. +    if (!old_valid_dev(kbuf->dev) || !old_valid_dev(kbuf->rdev))
  66. +        return -EOVERFLOW;
  67. +    if (SLITE_SIZET(kbuf->lite_mask) && kbuf->size >= 0x7fffffff)
  68. +        return -EOVERFLOW;
  69. +    if (!access_ok(VERIFY_WRITE, ubuf, sizeof(struct compat_stat_lite)) ||
  70. +        __put_user (old_encode_dev(kbuf->dev), &ubuf->st_dev) ||
  71. +        __put_user (kbuf->ino, &ubuf->st_ino) ||
  72. +        __put_user (kbuf->mode, &ubuf->st_mode) ||
  73. +        __put_user (kbuf->nlink, &ubuf->st_nlink) ||
  74. +        __put_user (uid, &ubuf->st_uid) ||
  75. +        __put_user (gid, &ubuf->st_gid) ||
  76. +        __put_user (old_encode_dev(kbuf->rdev), &ubuf->st_rdev))
  77. +        return -EFAULT;
  78. +
  79. +    if (__put_user (kbuf->lite_mask, &ubuf->st_litemask))
  80. +        return -EFAULT;
  81. +
  82. +    if (SLITE_SIZET(kbuf->lite_mask)) {
  83. +        if (__put_user (kbuf->size, &ubuf->st_size))
  84. +             return -EFAULT;
  85. +    }
  86. +    if (SLITE_ATIME(kbuf->lite_mask)) {
  87. +        if (__put_user (kbuf->atime.tv_sec, &ubuf->st_atime) ||
  88. +             __put_user (kbuf->atime.tv_nsec, &ubuf->st_atime_nsec))
  89. +             return -EFAULT;
  90. +    }
  91. +    if (SLITE_MTIME(kbuf->lite_mask)) {
  92. +        if (__put_user (kbuf->mtime.tv_sec, &ubuf->st_mtime) ||
  93. +             __put_user (kbuf->mtime.tv_nsec, &ubuf->st_mtime_nsec))
  94. +             return -EFAULT;
  95. +    }
  96. +    if (SLITE_CTIME(kbuf->lite_mask)) {
  97. +        if (__put_user (kbuf->ctime.tv_sec, &ubuf->st_ctime) ||
  98. +             __put_user (kbuf->ctime.tv_nsec, &ubuf->st_ctime_nsec))
  99. +             return -EFAULT;
  100. +    }
  101. +    if (SLITE_BLKSIZE(kbuf->lite_mask)) {
  102. +        if (__put_user (kbuf->blksize, &ubuf->st_blksize))
  103. +             return -EFAULT;
  104. +    }
  105. +    if (SLITE_BLOCKS(kbuf->lite_mask)) {
  106. +        if (__put_user (kbuf->blocks, &ubuf->st_blocks))
  107. +             return -EFAULT;
  108. +    }
  109. +    return 0;
  110. +}
  111. +
  112.  asmlinkage long
  113.  sys32_truncate64(char __user * filename, unsigned long offset_low, unsigned long offset_high)
  114.  {
  115. @@ -150,6 +203,57 @@
  116.      return 0;
  117.  }
  118.  
  119. +static int
  120. +cp_stat64_lite(struct stat64_lite __user *ubuf, struct kstat_lite *stat_lite)
  121. +{
  122. +    typeof(ubuf->st_uid) uid = 0;
  123. +    typeof(ubuf->st_gid) gid = 0;
  124. +    SET_UID(uid, stat_lite->uid);
  125. +    SET_GID(gid, stat_lite->gid);
  126. +    if (!access_ok(VERIFY_WRITE, ubuf, sizeof(struct stat64_lite)) ||
  127. +        __put_user(huge_encode_dev(stat_lite->dev), &ubuf->st_dev) ||
  128. +        __put_user (stat_lite->ino, &ubuf->__st_ino) ||
  129. +        __put_user (stat_lite->ino, &ubuf->st_ino) ||
  130. +        __put_user (stat_lite->mode, &ubuf->st_mode) ||
  131. +        __put_user (stat_lite->nlink, &ubuf->st_nlink) ||
  132. +        __put_user (uid, &ubuf->st_uid) ||
  133. +        __put_user (gid, &ubuf->st_gid) ||
  134. +        __put_user (huge_encode_dev(stat_lite->rdev), &ubuf->st_rdev))
  135. +        return -EFAULT;
  136. +
  137. +    if (__put_user (stat_lite->lite_mask, &ubuf->st_litemask))
  138. +        return -EFAULT;
  139. +
  140. +    if (SLITE_SIZET(stat_lite->lite_mask)) {
  141. +        if (__put_user (stat_lite->size, &ubuf->st_size))
  142. +             return -EFAULT;
  143. +    }
  144. +    if (SLITE_ATIME(stat_lite->lite_mask)) {
  145. +        if (__put_user (stat_lite->atime.tv_sec, &ubuf->st_atime) ||
  146. +             __put_user (stat_lite->atime.tv_nsec, &ubuf->st_atime_nsec)) 
  147. +             return -EFAULT;
  148. +    }
  149. +    if (SLITE_MTIME(stat_lite->lite_mask)) {
  150. +        if (__put_user (stat->mtime.tv_sec, &ubuf->st_mtime) ||
  151. +             __put_user (stat->mtime.tv_nsec, &ubuf->st_mtime_nsec))
  152. +             return -EFAULT;
  153. +    }
  154. +    if (SLITE_CTIME(stat_lite->lite_mask)) {
  155. +        if (__put_user (stat->ctime.tv_sec, &ubuf->st_ctime) ||
  156. +             __put_user (stat->ctime.tv_nsec, &ubuf->st_ctime_nsec))
  157. +             return -EFAULT;
  158. +    }
  159. +    if (SLITE_BLKSIZE(stat_lite->lite_mask)) {
  160. +        if (__put_user (stat_lite->blksize, &ubuf->st_blksize))
  161. +             return -EFAULT;
  162. +    }
  163. +    if (SLITE_BLOCKS(stat_lite->lite_mask)) {
  164. +         if (__put_user (stat->blocks, &ubuf->st_blocks))
  165. +            return -EFAULT;
  166. +    }
  167. +    return 0;
  168. +}
  169. +
  170.  asmlinkage long
  171.  sys32_stat64(char __user * filename, struct stat64 __user *statbuf)
  172.  {
  173. @@ -161,6 +265,16 @@
  174.  }
  175.  
  176.  asmlinkage long
  177. +sys32_statlite64(char __user * filename, struct stat64_lite __user *statlitebuf)
  178. +{
  179. +    struct kstat_lite stat_lite;
  180. +    int ret = vfs_statlite(filename, &stat_lite);
  181. +    if (!ret)
  182. +        ret = cp_stat64_lite(statlitebuf, &stat_lite);
  183. +    return ret;
  184. +}
  185. +
  186. +asmlinkage long
  187.  sys32_lstat64(char __user * filename, struct stat64 __user *statbuf)
  188.  {
  189.      struct kstat stat;
  190. @@ -171,6 +285,16 @@
  191.  }
  192.  
  193.  asmlinkage long
  194. +sys32_lstatlite64(char __user * filename, struct stat64_lite __user *statlitebuf)
  195. +{
  196. +    struct kstat_lite stat_lite;
  197. +    int ret = vfs_lstatlite(filename, &stat_lite);
  198. +    if (!ret)
  199. +        ret = cp_stat64_lite(statlitebuf, &stat_lite);
  200. +    return ret;
  201. +}
  202. +
  203. +asmlinkage long
  204.  sys32_fstat64(unsigned int fd, struct stat64 __user *statbuf)
  205.  {
  206.      struct kstat stat;
  207. @@ -181,6 +305,16 @@
  208.  }
  209.  
  210.  asmlinkage long
  211. +sys32_fstatlite64(unsigned int fd, struct stat64_lite __user *statlitebuf)
  212. +{
  213. +    struct kstat_lite stat_lite;
  214. +    int ret = vfs_fstatlite(fd, &stat_lite);
  215. +    if (!ret)
  216. +        ret = cp_stat64_lite(statlitebuf, &stat_lite);
  217. +    return ret;
  218. +}
  219. +
  220. +asmlinkage long
  221.  sys32_fstatat(unsigned int dfd, char __user *filename,
  222.            struct stat64 __user* statbuf, int flag)
  223.  {
  224. diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/fs/compat.c vanilla-new/fs/compat.c
  225. --- vanilla/fs/compat.c    2006-05-05 13:59:14.000000000 -0500
  226. +++ vanilla-new/fs/compat.c    2006-05-05 14:16:16.000000000 -0500
  227. @@ -103,6 +103,17 @@
  228.      return error;
  229.  }
  230.  
  231. +asmlinkage long compat_sys_newstatlite(char __user * filename,
  232. +        struct compat_stat_lite __user *statlitebuf)
  233. +{
  234. +    struct kstat_lite stat_lite;
  235. +    int error = vfs_statlite_fd(AT_FDCWD, filename, &stat_lite);
  236. +
  237. +    if (!error)
  238. +        error = cp_compat_statlite(&stat_lite, statlitebuf);
  239. +    return error;
  240. +}
  241. +
  242.  asmlinkage long compat_sys_newlstat(char __user * filename,
  243.          struct compat_stat __user *statbuf)
  244.  {
  245. @@ -114,6 +125,17 @@
  246.      return error;
  247.  }
  248.  
  249. +asmlinkage long compat_sys_newlstatlite(char __user * filename,
  250. +        struct compat_stat_lite __user *statlitebuf)
  251. +{
  252. +    struct kstat_lite stat_lite;
  253. +    int error = vfs_lstatlite_fd(AT_FDCWD, filename, &stat_lite);
  254. +
  255. +    if (!error)
  256. +        error = cp_compat_statlite(&stat_lite, statlitebuf);
  257. +    return error;
  258. +}
  259. +
  260.  asmlinkage long compat_sys_newfstatat(unsigned int dfd, char __user *filename,
  261.          struct compat_stat __user *statbuf, int flag)
  262.  {
  263. @@ -146,6 +168,17 @@
  264.      return error;
  265.  }
  266.  
  267. +asmlinkage long compat_sys_newfstatlite(unsigned int fd,
  268. +        struct compat_stat_lite __user * statlitebuf)
  269. +{
  270. +    struct kstat_lite stat_lite;
  271. +    int error = vfs_fstatlite(fd, &stat_lite);
  272. +
  273. +    if (!error)
  274. +        error = cp_compat_statlite(&stat_lite, statlitebuf);
  275. +    return error;
  276. +}
  277. +
  278.  static int put_compat_statfs(struct compat_statfs __user *ubuf, struct kstatfs *kbuf)
  279.  {
  280.      
  281. diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/fs/stat.c vanilla-new/fs/stat.c
  282. --- vanilla/fs/stat.c    2006-03-19 23:53:29.000000000 -0600
  283. +++ vanilla-new/fs/stat.c    2006-05-05 17:12:15.000000000 -0500
  284. @@ -38,6 +38,33 @@
  285.  
  286.  EXPORT_SYMBOL(generic_fillattr);
  287.  
  288. +void generic_fillattr_lite(struct inode *inode, struct kstat_lite *stat_lite)
  289. +{
  290. +    unsigned long lite_mask = stat_lite->lite_mask;
  291. +
  292. +    stat_lite->dev = inode->i_sb->s_dev;
  293. +    stat_lite->ino = inode->i_ino;
  294. +    stat_lite->mode = inode->i_mode;
  295. +    stat_lite->nlink = inode->i_nlink;
  296. +    stat_lite->uid = inode->i_uid;
  297. +    stat_lite->gid = inode->i_gid;
  298. +    stat_lite->rdev = inode->i_rdev;
  299. +    if (SLITE_ATIME(lite_mask))
  300. +        stat_lite->atime = inode->i_atime;
  301. +    if (SLITE_MTIME(lite_mask))
  302. +        stat_lite->mtime = inode->i_mtime;
  303. +    if (SLITE_CTIME(lite_mask))
  304. +        stat_lite->ctime = inode->i_ctime;
  305. +    if (SLITE_SIZET(lite_mask))
  306. +        stat_lite->size = i_size_read(inode);
  307. +    if (SLITE_BLOCKS(lite_mask))
  308. +        stat_lite->blocks = inode->i_blocks;
  309. +    if (SLITE_BLKSIZE(lite_mask))
  310. +        stat_lite->blksize = inode->i_blksize;
  311. +}
  312. +
  313. +EXPORT_SYMBOL_GPL(generic_fillattr_lite);
  314. +
  315.  int vfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
  316.  {
  317.      struct inode *inode = dentry->d_inode;
  318. @@ -63,6 +90,31 @@
  319.  
  320.  EXPORT_SYMBOL(vfs_getattr);
  321.  
  322. +int vfs_getattr_lite(struct vfsmount *mnt, struct dentry *dentry, struct kstat_lite *stat_lite)
  323. +{
  324. +    struct inode *inode = dentry->d_inode;
  325. +    int retval;
  326. +
  327. +    retval = security_inode_getattr(mnt, dentry);
  328. +    if (retval)
  329. +        return retval;
  330. +
  331. +    if (inode->i_op->getattr_lite)
  332. +        return inode->i_op->getattr_lite(mnt, dentry, stat_lite);
  333. +
  334. +    generic_fillattr_lite(inode, stat_lite);
  335. +    if (!stat_lite->blksize) {
  336. +        struct super_block *s = inode->i_sb;
  337. +        unsigned blocks;
  338. +        blocks = (stat_lite->size+s->s_blocksize-1) >> s->s_blocksize_bits;
  339. +        stat_lite->blocks = (s->s_blocksize / 512) * blocks;
  340. +        stat_lite->blksize = s->s_blocksize;
  341. +    }
  342. +    return 0;
  343. +}
  344. +
  345. +EXPORT_SYMBOL_GPL(vfs_getattr_lite);
  346. +
  347.  int vfs_stat_fd(int dfd, char __user *name, struct kstat *stat)
  348.  {
  349.      struct nameidata nd;
  350. @@ -76,6 +128,19 @@
  351.      return error;
  352.  }
  353.  
  354. +int vfs_statlite_fd(int dfd, char __user *name, struct kstat_lite *stat_lite)
  355. +{
  356. +    struct nameidata nd;
  357. +    int error;
  358. +
  359. +    error = __user_walk_fd(dfd, name, LOOKUP_FOLLOW, &nd);
  360. +    if (!error) {
  361. +        error = vfs_getattr_lite(nd.mnt, nd.dentry, stat_lite);
  362. +        path_release(&nd);
  363. +    }
  364. +    return error;
  365. +}
  366. +
  367.  int vfs_stat(char __user *name, struct kstat *stat)
  368.  {
  369.      return vfs_stat_fd(AT_FDCWD, name, stat);
  370. @@ -83,6 +148,13 @@
  371.  
  372.  EXPORT_SYMBOL(vfs_stat);
  373.  
  374. +int vfs_statlite(char __user *name, struct kstat_lite *stat_lite)
  375. +{
  376. +    return vfs_statlite_fd(AT_FDCWD, name, stat_lite);
  377. +}
  378. +
  379. +EXPORT_SYMBOL_GPL(vfs_statlite);
  380. +
  381.  int vfs_lstat_fd(int dfd, char __user *name, struct kstat *stat)
  382.  {
  383.      struct nameidata nd;
  384. @@ -96,6 +168,19 @@
  385.      return error;
  386.  }
  387.  
  388. +int vfs_lstatlite_fd(int dfd, char __user *name, struct kstat_lite *stat_lite)
  389. +{
  390. +    struct nameidata nd;
  391. +    int error;
  392. +
  393. +    error = __user_walk_fd(dfd, name, 0, &nd);
  394. +    if (!error) {
  395. +        error = vfs_getattr_lite(nd.mnt, nd.dentry, stat_lite);
  396. +        path_release(&nd);
  397. +    }
  398. +    return error;
  399. +}
  400. +
  401.  int vfs_lstat(char __user *name, struct kstat *stat)
  402.  {
  403.      return vfs_lstat_fd(AT_FDCWD, name, stat);
  404. @@ -103,6 +188,13 @@
  405.  
  406.  EXPORT_SYMBOL(vfs_lstat);
  407.  
  408. +int vfs_lstatlite(char __user *name, struct kstat_lite *stat_lite)
  409. +{
  410. +    return vfs_lstatlite_fd(AT_FDCWD, name, stat_lite);
  411. +}
  412. +
  413. +EXPORT_SYMBOL_GPL(vfs_lstatlite);
  414. +
  415.  int vfs_fstat(unsigned int fd, struct kstat *stat)
  416.  {
  417.      struct file *f = fget(fd);
  418. @@ -117,6 +209,20 @@
  419.  
  420.  EXPORT_SYMBOL(vfs_fstat);
  421.  
  422. +int vfs_fstatlite(unsigned int fd, struct kstat_lite *stat_lite)
  423. +{
  424. +    struct file *f = fget(fd);
  425. +    int error = -EBADF;
  426. +
  427. +    if (f) {
  428. +        error = vfs_getattr_lite(f->f_vfsmnt, f->f_dentry, stat_lite);
  429. +        fput(f);
  430. +    }
  431. +    return error;
  432. +}
  433. +
  434. +EXPORT_SYMBOL_GPL(vfs_fstatlite);
  435. +
  436.  #ifdef __ARCH_WANT_OLD_STAT
  437.  
  438.  /*
  439. @@ -239,6 +345,81 @@
  440.      return copy_to_user(statbuf,&tmp,sizeof(tmp)) ? -EFAULT : 0;
  441.  }
  442.  
  443. +static int cp_new_statlite(struct kstat_lite *stat_lite, struct stat_lite __user *statlitebuf)
  444. +{
  445. +    struct stat_lite tmp;
  446. +
  447. +#if BITS_PER_LONG == 32
  448. +    if (!old_valid_dev(stat_lite->dev) || !old_valid_dev(stat_lite->rdev))
  449. +        return -EOVERFLOW;
  450. +#else
  451. +    if (!new_valid_dev(stat_lite->dev) || !new_valid_dev(stat_lite->rdev))
  452. +        return -EOVERFLOW;
  453. +#endif
  454. +
  455. +    memset(&tmp, 0, sizeof(tmp));
  456. +#if BITS_PER_LONG == 32
  457. +    tmp.st_dev = old_encode_dev(stat_lite->dev);
  458. +#else
  459. +    tmp.st_dev = new_encode_dev(stat_lite->dev);
  460. +#endif
  461. +    tmp.st_ino = stat_lite->ino;
  462. +    tmp.st_mode = stat_lite->mode;
  463. +    tmp.st_nlink = stat_lite->nlink;
  464. +    if (tmp.st_nlink != stat_lite->nlink)
  465. +        return -EOVERFLOW;
  466. +    SET_UID(tmp.st_uid, stat_lite->uid);
  467. +    SET_GID(tmp.st_gid, stat_lite->gid);
  468. +#if BITS_PER_LONG == 32
  469. +    tmp.st_rdev = old_encode_dev(stat_lite->rdev);
  470. +#else
  471. +    tmp.st_rdev = new_encode_dev(stat_lite->rdev);
  472. +#endif
  473. +#if BITS_PER_LONG == 32
  474. +    if (SLITE_SIZET(stat_lite->lite_mask) && stat_lite->size > MAX_NON_LFS)
  475. +        return -EOVERFLOW;
  476. +#endif
  477. +    if (SLITE_SIZET(stat_lite->lite_mask)) {
  478. +        tmp.st_size = stat_lite->size;
  479. +        tmp.st_litemask |= S_SLITE_SIZET;
  480. +    }
  481. +    if (SLITE_ATIME(stat_lite->lite_mask)) {
  482. +        tmp.st_atime = stat_lite->atime.tv_sec;
  483. +        tmp.st_litemask |= S_SLITE_ATIME;
  484. +    }
  485. +    if (SLITE_MTIME(stat_lite->lite_mask)) {
  486. +        tmp.st_mtime = stat_lite->mtime.tv_sec;
  487. +        tmp.st_litemask |= S_SLITE_MTIME;
  488. +    }
  489. +    if (SLITE_CTIME(stat_lite->lite_mask)) {
  490. +        tmp.st_ctime = stat_lite->ctime.tv_sec;
  491. +        tmp.st_litemask |= S_SLITE_CTIME;
  492. +    }
  493. +#ifdef STAT_HAVE_NSEC
  494. +    if (SLITE_ATIME(stat_lite->lite_mask)) {
  495. +        tmp.st_atime_nsec = stat_lite->atime.tv_nsec;
  496. +        tmp.st_litemask |= S_SLITE_ATIME;
  497. +    }
  498. +    if (SLITE_MTIME(stat_lite->lite_mask)) {
  499. +        tmp.st_mtime_nsec = stat_lite->mtime.tv_nsec;
  500. +        tmp.st_litemask |= S_SLITE_MTIME;
  501. +    }
  502. +    if (SLITE_CTIME(stat_lite->lite_mask)) {
  503. +        tmp.st_ctime_nsec = stat_lite->ctime.tv_nsec;
  504. +        tmp.st_litemask |= S_SLITE_CTIME;
  505. +    }
  506. +#endif
  507. +    if (SLITE_BLOCKS(stat_lite->lite_mask)) {
  508. +        tmp.st_blocks = stat_lite->blocks;
  509. +        tmp.st_litemask |= S_SLITE_BLOCKS;
  510. +    }
  511. +    if (SLITE_BLKSIZE(stat_lite->lite_mask)) {
  512. +        tmp.st_blksize = stat_lite->blksize;
  513. +        tmp.st_litemask |= S_SLITE_BLKSIZE;
  514. +    }
  515. +    return copy_to_user(statlitebuf,&tmp,sizeof(tmp)) ? -EFAULT : 0;
  516. +}
  517. +
  518.  asmlinkage long sys_newstat(char __user *filename, struct stat __user *statbuf)
  519.  {
  520.      struct kstat stat;
  521. @@ -250,6 +431,17 @@
  522.      return error;
  523.  }
  524.  
  525. +asmlinkage long sys_newstatlite(char __user *filename, struct stat_lite __user *statlitebuf)
  526. +{
  527. +    struct kstat_lite stat_lite;
  528. +    int error = vfs_statlite_fd(AT_FDCWD, filename, &stat_lite);
  529. +
  530. +    if (!error)
  531. +        error = cp_new_statlite(&stat_lite, statlitebuf);
  532. +
  533. +    return error;
  534. +}
  535. +
  536.  asmlinkage long sys_newlstat(char __user *filename, struct stat __user *statbuf)
  537.  {
  538.      struct kstat stat;
  539. @@ -261,6 +453,17 @@
  540.      return error;
  541.  }
  542.  
  543. +asmlinkage long sys_newlstatlite(char __user *filename, struct stat_lite __user *statlitebuf)
  544. +{
  545. +    struct kstat_lite stat_lite;
  546. +    int error = vfs_lstatlite_fd(AT_FDCWD, filename, &stat_lite);
  547. +
  548. +    if (!error)
  549. +        error = cp_new_statlite(&stat_lite, statlitebuf);
  550. +
  551. +    return error;
  552. +}
  553. +
  554.  #ifndef __ARCH_WANT_STAT64
  555.  asmlinkage long sys_newfstatat(int dfd, char __user *filename,
  556.                  struct stat __user *statbuf, int flag)
  557. @@ -295,6 +498,17 @@
  558.      return error;
  559.  }
  560.  
  561. +asmlinkage long sys_newfstatlite(unsigned int fd, struct stat_lite __user *statlitebuf)
  562. +{
  563. +    struct kstat_lite stat_lite;
  564. +    int error = vfs_fstatlite(fd, &stat_lite);
  565. +
  566. +    if (!error)
  567. +        error = cp_new_statlite(&stat_lite, statlitebuf);
  568. +
  569. +    return error;
  570. +}
  571. +
  572.  asmlinkage long sys_readlinkat(int dfd, const char __user *path,
  573.                  char __user *buf, int bufsiz)
  574.  {
  575. @@ -366,6 +580,60 @@
  576.      return copy_to_user(statbuf,&tmp,sizeof(tmp)) ? -EFAULT : 0;
  577.  }
  578.  
  579. +static long cp_new_stat64_lite(struct kstat_lite *stat_lite, struct stat64_lite __user *statlitebuf)
  580. +{
  581. +    struct stat64_lite tmp;
  582. +
  583. +    memset(&tmp, 0, sizeof(struct stat64_lite));
  584. +#ifdef CONFIG_MIPS
  585. +    /* mips has weird padding, so we don't get 64 bits there */
  586. +    if (!new_valid_dev(stat_lite->dev) || !new_valid_dev(stat_lite->rdev))
  587. +        return -EOVERFLOW;
  588. +    tmp.st_dev = new_encode_dev(stat_lite->dev);
  589. +    tmp.st_rdev = new_encode_dev(stat_lite->rdev);
  590. +#else
  591. +    tmp.st_dev = huge_encode_dev(stat_lite->dev);
  592. +    tmp.st_rdev = huge_encode_dev(stat_lite->rdev);
  593. +#endif
  594. +    tmp.st_ino = stat_lite->ino;
  595. +#ifdef STAT64_HAS_BROKEN_ST_INO
  596. +    tmp.__st_ino = stat_lite->ino;
  597. +#endif
  598. +    tmp.st_mode = stat_lite->mode;
  599. +    tmp.st_nlink = stat_lite->nlink;
  600. +    tmp.st_uid = stat_lite->uid;
  601. +    tmp.st_gid = stat_lite->gid;
  602. +
  603. +    if (SLITE_ATIME(stat_lite->lite_mask)) {
  604. +        tmp.st_atime = stat_lite->atime.tv_sec;
  605. +        tmp.st_atime_nsec = stat_lite->atime.tv_nsec;
  606. +        tmp.st_litemask |= S_SLITE_ATIME;
  607. +    }
  608. +    if (SLITE_MTIME(stat_lite->lite_mask)) {
  609. +        tmp.st_mtime = stat_lite->mtime.tv_sec;
  610. +        tmp.st_mtime_nsec = stat_lite->mtime.tv_nsec;
  611. +        tmp.st_litemask |= S_SLITE_MTIME;
  612. +    }
  613. +    if (SLITE_CTIME(stat_lite->lite_mask)) {
  614. +        tmp.st_ctime = stat_lite->ctime.tv_sec;
  615. +        tmp.st_ctime_nsec = stat_lite->ctime.tv_nsec;
  616. +        tmp.st_litemask |= S_SLITE_CTIME;
  617. +    }
  618. +    if (SLITE_SIZET(stat_lite->lite_mask)) {
  619. +        tmp.st_size = stat_lite->size;
  620. +        tmp.st_litemask |= S_SLITE_SIZET;
  621. +    }
  622. +    if (SLITE_BLOCKS(stat_lite->lite_mask)) {
  623. +        tmp.st_blocks = stat_lite->blocks;
  624. +        tmp.st_litemask |= S_SLITE_BLOCKS;
  625. +    }
  626. +    if (SLITE_BLKSIZE(stat_lite->lite_mask)) {
  627. +        tmp.st_blksize = stat_lite->blksize;
  628. +        tmp.st_litemask |= S_SLITE_BLKSIZE;
  629. +    }
  630. +    return copy_to_user(statlitebuf,&tmp,sizeof(tmp)) ? -EFAULT : 0;
  631. +}
  632. +
  633.  asmlinkage long sys_stat64(char __user * filename, struct stat64 __user * statbuf)
  634.  {
  635.      struct kstat stat;
  636. @@ -376,6 +644,18 @@
  637.  
  638.      return error;
  639.  }
  640. +
  641. +asmlinkage long sys_statlite64(char __user * filename, struct stat64_lite __user * statlitebuf)
  642. +{
  643. +    struct kstat_lite stat_lite;
  644. +    int error = vfs_statlite(filename, &stat_lite);
  645. +
  646. +    if (!error)
  647. +        error = cp_new_stat64_lite(&stat_lite, statlitebuf);
  648. +
  649. +    return error;
  650. +}
  651. +
  652.  asmlinkage long sys_lstat64(char __user * filename, struct stat64 __user * statbuf)
  653.  {
  654.      struct kstat stat;
  655. @@ -386,6 +666,18 @@
  656.  
  657.      return error;
  658.  }
  659. +
  660. +asmlinkage long sys_lstatlite64(char __user * filename, struct stat64_lite __user * statlitebuf)
  661. +{
  662. +    struct kstat_lite stat_lite;
  663. +    int error = vfs_lstatlite(filename, &stat_lite);
  664. +
  665. +    if (!error)
  666. +        error = cp_new_stat64_lite(&stat_lite, statlitebuf);
  667. +
  668. +    return error;
  669. +}
  670. +
  671.  asmlinkage long sys_fstat64(unsigned long fd, struct stat64 __user * statbuf)
  672.  {
  673.      struct kstat stat;
  674. @@ -397,6 +689,17 @@
  675.      return error;
  676.  }
  677.  
  678. +asmlinkage long sys_fstatlite64(unsigned long fd, struct stat64_lite __user * statlitebuf)
  679. +{
  680. +    struct kstat_lite stat_lite;
  681. +    int error = vfs_fstatlite(fd, &stat_lite);
  682. +
  683. +    if (!error)
  684. +        error = cp_new_stat64_lite(&stat_lite, statlitebuf);
  685. +
  686. +    return error;
  687. +}
  688. +
  689.  asmlinkage long sys_fstatat64(int dfd, char __user *filename,
  690.                     struct stat64 __user *statbuf, int flag)
  691.  {
  692. diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/asm-i386/stat.h vanilla-new/include/asm-i386/stat.h
  693. --- vanilla/include/asm-i386/stat.h    2006-03-19 23:53:29.000000000 -0600
  694. +++ vanilla-new/include/asm-i386/stat.h    2006-05-05 16:58:22.000000000 -0500
  695. @@ -36,6 +36,28 @@
  696.      unsigned long  __unused5;
  697.  };
  698.  
  699. +struct stat_lite {
  700. +    unsigned long  st_dev;
  701. +    unsigned long  st_ino;
  702. +    unsigned short st_mode;
  703. +    unsigned short st_nlink;
  704. +    unsigned short st_uid;
  705. +    unsigned short st_gid;
  706. +    unsigned long  st_rdev;
  707. +    unsigned long  st_litemask;
  708. +    unsigned long  st_size;
  709. +    unsigned long  st_blksize;
  710. +    unsigned long  st_blocks;
  711. +    unsigned long  st_atime;
  712. +    unsigned long  st_atime_nsec;
  713. +    unsigned long  st_mtime;
  714. +    unsigned long  st_mtime_nsec;
  715. +    unsigned long  st_ctime;
  716. +    unsigned long  st_ctime_nsec;
  717. +    unsigned long  __unused4;
  718. +    unsigned long  __unused5;
  719. +};
  720. +
  721.  /* This matches struct stat64 in glibc2.1, hence the absolutely
  722.   * insane amounts of padding around dev_t's.
  723.   */
  724. @@ -75,4 +97,41 @@
  725.  
  726.  #define STAT_HAVE_NSEC 1
  727.  
  728. +struct stat64_lite {
  729. +    unsigned long long    st_dev;
  730. +    unsigned char    __pad0[4];
  731. +
  732. +#define STAT64_HAS_BROKEN_ST_INO    1
  733. +    unsigned long    __st_ino;
  734. +
  735. +    unsigned int    st_mode;
  736. +    unsigned int    st_nlink;
  737. +
  738. +    unsigned long    st_uid;
  739. +    unsigned long    st_gid;
  740. +
  741. +    unsigned long long    st_rdev;
  742. +    unsigned char    __pad3[4];
  743. +
  744. +    unsigned long  st_litemask;
  745. +    unsigned char  __pad5[4];
  746. +
  747. +    long long    st_size;
  748. +    unsigned long    st_blksize;
  749. +
  750. +    unsigned long    st_blocks;    /* Number 512-byte blocks allocated. */
  751. +    unsigned long    __pad4;        /* future possible st_blocks high bits */
  752. +
  753. +    unsigned long    st_atime;
  754. +    unsigned long    st_atime_nsec;
  755. +
  756. +    unsigned long    st_mtime;
  757. +    unsigned int    st_mtime_nsec;
  758. +
  759. +    unsigned long    st_ctime;
  760. +    unsigned long    st_ctime_nsec;
  761. +
  762. +    unsigned long long    st_ino;
  763. +};
  764. +
  765.  #endif
  766. diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/asm-i386/unistd.h vanilla-new/include/asm-i386/unistd.h
  767. --- vanilla/include/asm-i386/unistd.h    2006-05-05 13:59:14.000000000 -0500
  768. +++ vanilla-new/include/asm-i386/unistd.h    2006-05-05 15:22:38.000000000 -0500
  769. @@ -318,8 +318,14 @@
  770.  #define __NR_unshare        310
  771.  #define __NR_openg      311
  772.  #define __NR_openfh     312
  773. +#define __NR_newstatlite 313
  774. +#define __NR_newlstatlite 314
  775. +#define __NR_newfstatlite 315
  776. +#define __NR_statlite64  316
  777. +#define __NR_lstatlite64 317
  778. +#define __NR_fstatlite64 318
  779.  
  780. -#define NR_syscalls 313
  781. +#define NR_syscalls 319
  782.  
  783.  /*
  784.   * user-visible error numbers are in the range -1 - -128: see
  785. diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/asm-ia64/unistd.h vanilla-new/include/asm-ia64/unistd.h
  786. --- vanilla/include/asm-ia64/unistd.h    2006-05-05 13:59:14.000000000 -0500
  787. +++ vanilla-new/include/asm-ia64/unistd.h    2006-05-05 15:27:03.000000000 -0500
  788. @@ -287,12 +287,15 @@
  789.  #define __NR_unshare            1296
  790.  #define __NR_openg         1297
  791.  #define __NR_openfh        1298
  792. +#define __NR_statlite      1299
  793. +#define __NR_lstatlite     1300
  794. +#define __NR_fstatlite     1301
  795.  
  796.  #ifdef __KERNEL__
  797.  
  798.  #include <linux/config.h>
  799.  
  800. -#define NR_syscalls            275 /* length of syscall table */
  801. +#define NR_syscalls            278 /* length of syscall table */
  802.  
  803.  #define __ARCH_WANT_SYS_RT_SIGACTION
  804.  
  805. diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/asm-powerpc/stat.h vanilla-new/include/asm-powerpc/stat.h
  806. --- vanilla/include/asm-powerpc/stat.h    2006-03-19 23:53:29.000000000 -0600
  807. +++ vanilla-new/include/asm-powerpc/stat.h    2006-05-05 11:48:16.000000000 -0500
  808. @@ -55,6 +55,37 @@
  809.  #endif
  810.  };
  811.  
  812. +struct stat_lite {
  813. +    unsigned long    st_dev;
  814. +    ino_t        st_ino;
  815. +#ifdef __powerpc64__
  816. +    nlink_t        st_nlink;
  817. +    mode_t        st_mode;
  818. +#else
  819. +    mode_t        st_mode;
  820. +    nlink_t        st_nlink;
  821. +#endif
  822. +    uid_t        st_uid;
  823. +    gid_t        st_gid;
  824. +    unsigned long    st_rdev;
  825. +    unsigned long  st_litemask;
  826. +    off_t        st_size;
  827. +    unsigned long    st_blksize;
  828. +    unsigned long    st_blocks;
  829. +    unsigned long    st_atime;
  830. +    unsigned long    st_atime_nsec;
  831. +    unsigned long    st_mtime;
  832. +    unsigned long    st_mtime_nsec;
  833. +    unsigned long    st_ctime;
  834. +    unsigned long    st_ctime_nsec;
  835. +    unsigned long    __unused4;
  836. +    unsigned long    __unused5;
  837. +#ifdef __powerpc64__
  838. +    unsigned long    __unused6;
  839. +#endif
  840. +};
  841. +
  842. +
  843.  /* This matches struct stat64 in glibc2.1. Only used for 32 bit. */
  844.  struct stat64 {
  845.      unsigned long long st_dev;        /* Device.  */
  846. @@ -78,4 +109,28 @@
  847.      unsigned int    __unused5;
  848.  };
  849.  
  850. +/* This matches struct stat64_lite in glibc2.1. Only used for 32 bit. */
  851. +struct stat64_lite {
  852. +    unsigned long long st_dev;        /* Device.  */
  853. +    unsigned long long st_ino;        /* File serial number.  */
  854. +    unsigned int    st_mode;    /* File mode.  */
  855. +    unsigned int    st_nlink;    /* Link count.  */
  856. +    unsigned int    st_uid;        /* User ID of the file's owner.  */
  857. +    unsigned int    st_gid;        /* Group ID of the file's group. */
  858. +    unsigned long long st_rdev;    /* Device number, if device.  */
  859. +    unsigned short    __pad2;
  860. +    unsigned long  st_litemask;
  861. +    long long    st_size;    /* Size of file, in bytes.  */
  862. +    int        st_blksize;    /* Optimal block size for I/O.  */
  863. +    long long    st_blocks;    /* Number 512-byte blocks allocated. */
  864. +    int        st_atime;    /* Time of last access.  */
  865. +    unsigned int    st_atime_nsec;
  866. +    int        st_mtime;    /* Time of last modification.  */
  867. +    unsigned int    st_mtime_nsec;
  868. +    int        st_ctime;    /* Time of last status change.  */
  869. +    unsigned int    st_ctime_nsec;
  870. +    unsigned int    __unused4;
  871. +    unsigned int    __unused5;
  872. +};
  873. +
  874.  #endif /* _ASM_POWERPC_STAT_H */
  875. diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/asm-x86_64/compat.h vanilla-new/include/asm-x86_64/compat.h
  876. --- vanilla/include/asm-x86_64/compat.h    2006-03-19 23:53:29.000000000 -0600
  877. +++ vanilla-new/include/asm-x86_64/compat.h    2006-05-05 13:56:12.000000000 -0500
  878. @@ -69,6 +69,30 @@
  879.      u32        __unused5;
  880.  };
  881.  
  882. +struct compat_stat_lite {
  883. +    compat_dev_t    st_dev;
  884. +    u16        __pad1;
  885. +    compat_ino_t    st_ino;
  886. +    compat_mode_t    st_mode;
  887. +    compat_nlink_t    st_nlink;
  888. +    __compat_uid_t    st_uid;
  889. +    __compat_gid_t    st_gid;
  890. +    compat_dev_t    st_rdev;
  891. +    u16        __pad2;
  892. +    u32      st_litemask;
  893. +    u32        st_size;
  894. +    u32        st_blksize;
  895. +    u32        st_blocks;
  896. +    u32        st_atime;
  897. +    u32        st_atime_nsec;
  898. +    u32        st_mtime;
  899. +    u32        st_mtime_nsec;
  900. +    u32        st_ctime;
  901. +    u32        st_ctime_nsec;
  902. +    u32        __unused4;
  903. +    u32        __unused5;
  904. +};
  905. +
  906.  struct compat_flock {
  907.      short        l_type;
  908.      short        l_whence;
  909. diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/asm-x86_64/stat.h vanilla-new/include/asm-x86_64/stat.h
  910. --- vanilla/include/asm-x86_64/stat.h    2006-03-19 23:53:29.000000000 -0600
  911. +++ vanilla-new/include/asm-x86_64/stat.h    2006-05-05 17:05:54.000000000 -0500
  912. @@ -26,6 +26,30 @@
  913.        long        __unused[3];
  914.  };
  915.  
  916. +struct stat_lite {
  917. +    unsigned long    st_dev;
  918. +    unsigned long    st_ino;
  919. +    unsigned long    st_nlink;
  920. +
  921. +    unsigned int    st_mode;
  922. +    unsigned int    st_uid;
  923. +    unsigned int    st_gid;
  924. +    unsigned int    __pad0;
  925. +    unsigned long    st_rdev;
  926. +    unsigned long  st_litemask;
  927. +    long        st_size;
  928. +    long        st_blksize;
  929. +    long        st_blocks;    /* Number 512-byte blocks allocated. */
  930. +
  931. +    unsigned long    st_atime;
  932. +    unsigned long     st_atime_nsec; 
  933. +    unsigned long    st_mtime;
  934. +    unsigned long    st_mtime_nsec;
  935. +    unsigned long    st_ctime;
  936. +    unsigned long   st_ctime_nsec;
  937. +      long        __unused[3];
  938. +};
  939. +
  940.  /* For 32bit emulation */
  941.  struct __old_kernel_stat {
  942.      unsigned short st_dev;
  943. diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/asm-x86_64/unistd.h vanilla-new/include/asm-x86_64/unistd.h
  944. --- vanilla/include/asm-x86_64/unistd.h    2006-05-05 13:59:14.000000000 -0500
  945. +++ vanilla-new/include/asm-x86_64/unistd.h    2006-05-05 15:18:33.000000000 -0500
  946. @@ -609,8 +609,14 @@
  947.  __SYSCALL(__NR_openg,   sys_openg)
  948.  #define __NR_openfh     274
  949.  __SYSCALL(__NR_openfh,  sys_openfh)
  950. +#define __NR_newstatlite   275
  951. +__SYSCALL(__NR_newstatlite, sys_newstatlite)
  952. +#define __NR_newlstatlite  276
  953. +__SYSCALL(__NR_newlstatlite, sys_newlstatlite)
  954. +#define __NR_newfstatlite  277
  955. +__SYSCALL(__NR_newfstatlite, sys_newfstatlite)
  956.  
  957. -#define __NR_syscall_max __NR_openfh
  958. +#define __NR_syscall_max __NR_newfstatlite
  959.  
  960.  #ifndef __NO_STUBS
  961.  
  962. diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/linux/compat.h vanilla-new/include/linux/compat.h
  963. --- vanilla/include/linux/compat.h    2006-03-19 23:53:29.000000000 -0600
  964. +++ vanilla-new/include/linux/compat.h    2006-05-05 16:19:58.000000000 -0500
  965. @@ -52,6 +52,7 @@
  966.  } compat_sigset_t;
  967.  
  968.  extern int cp_compat_stat(struct kstat *, struct compat_stat __user *);
  969. +extern int cp_compat_statlite(struct kstat_lite *, struct compat_stat_lite __user *);
  970.  extern int get_compat_timespec(struct timespec *, const struct compat_timespec __user *);
  971.  extern int put_compat_timespec(const struct timespec *, struct compat_timespec __user *);
  972.  
  973. diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/linux/fs.h vanilla-new/include/linux/fs.h
  974. --- vanilla/include/linux/fs.h    2006-05-05 13:59:14.000000000 -0500
  975. +++ vanilla-new/include/linux/fs.h    2006-05-05 16:55:19.000000000 -0500
  976. @@ -1065,6 +1065,7 @@
  977.      int (*permission) (struct inode *, int, struct nameidata *);
  978.      int (*setattr) (struct dentry *, struct iattr *);
  979.      int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *);
  980. +    int (*getattr_lite) (struct vfsmount *mnt, struct dentry *, struct kstat_lite *);
  981.      int (*setxattr) (struct dentry *, const char *,const void *,size_t,int);
  982.      ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t);
  983.      ssize_t (*listxattr) (struct dentry *, char *, size_t);
  984. @@ -1702,7 +1703,9 @@
  985.  extern struct inode_operations page_symlink_inode_operations;
  986.  extern int generic_readlink(struct dentry *, char __user *, int);
  987.  extern void generic_fillattr(struct inode *, struct kstat *);
  988. +extern void generic_fillattr_lite(struct inode *, struct kstat_lite *);
  989.  extern int vfs_getattr(struct vfsmount *, struct dentry *, struct kstat *);
  990. +extern int vfs_getattr_lite(struct vfsmount *, struct dentry *, struct kstat_lite *);
  991.  void inode_add_bytes(struct inode *inode, loff_t bytes);
  992.  void inode_sub_bytes(struct inode *inode, loff_t bytes);
  993.  loff_t inode_get_bytes(struct inode *inode);
  994. @@ -1711,10 +1714,15 @@
  995.  extern int vfs_readdir(struct file *, filldir_t, void *);
  996.  
  997.  extern int vfs_stat(char __user *, struct kstat *);
  998. +extern int vfs_statlite(char __user *, struct kstat_lite *);
  999.  extern int vfs_lstat(char __user *, struct kstat *);
  1000. +extern int vfs_lstatlite(char __user *, struct kstat_lite *);
  1001.  extern int vfs_stat_fd(int dfd, char __user *, struct kstat *);
  1002. +extern int vfs_statlite_fd(int dfd, char __user *, struct kstat_lite *);
  1003.  extern int vfs_lstat_fd(int dfd, char __user *, struct kstat *);
  1004. +extern int vfs_lstatlite_fd(int dfd, char __user *, struct kstat_lite *);
  1005.  extern int vfs_fstat(unsigned int, struct kstat *);
  1006. +extern int vfs_fstatlite(unsigned int, struct kstat_lite *);
  1007.  
  1008.  extern int vfs_ioctl(struct file *, unsigned int, unsigned int, unsigned long);
  1009.  
  1010. @@ -1728,6 +1736,7 @@
  1011.  extern loff_t dcache_dir_lseek(struct file *, loff_t, int);
  1012.  extern int dcache_readdir(struct file *, void *, filldir_t);
  1013.  extern int simple_getattr(struct vfsmount *, struct dentry *, struct kstat *);
  1014. +extern int simple_getattr_lite(struct vfsmount *, struct dentry *, struct kstat_lite *);
  1015.  extern int simple_statfs(struct super_block *, struct kstatfs *);
  1016.  extern int simple_link(struct dentry *, struct inode *, struct dentry *);
  1017.  extern int simple_unlink(struct inode *, struct dentry *);
  1018. diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/linux/stat.h vanilla-new/include/linux/stat.h
  1019. --- vanilla/include/linux/stat.h    2006-03-19 23:53:29.000000000 -0600
  1020. +++ vanilla-new/include/linux/stat.h    2006-05-05 17:00:11.000000000 -0500
  1021. @@ -44,6 +44,22 @@
  1022.  #define S_IWOTH 00002
  1023.  #define S_IXOTH 00001
  1024.  
  1025. +#define S_SLITE_SIZET     0x1
  1026. +#define S_SLITE_BLKSIZE   0x2
  1027. +#define S_SLITE_BLOCKS    0x4
  1028. +#define S_SLITE_ATIME     0x8
  1029. +#define S_SLITE_MTIME     0x10
  1030. +#define S_SLITE_CTIME     0x20
  1031. +#define S_SLITE_ALL       (S_SLITE_SIZET | S_SLITE_BLKSIZE | S_SLITE_BLOCKS \
  1032. +                                    S_SLITE_ATIME | S_SLITE_MTIME   | S_SLITE_CTIME)
  1033. +
  1034. +#define SLITE_SIZET(m)    ((m) & S_SLITE_SIZET)
  1035. +#define SLITE_BLKSIZE(m)  ((m) & S_SLITE_BLKSIZE)
  1036. +#define SLITE_BLOCKS(m)   ((m) & S_SLITE_BLOCKS)
  1037. +#define SLITE_ATIME(m)    ((m) & S_SLITE_ATIME)
  1038. +#define SLITE_MTIME(m)    ((m) & S_SLITE_MTIME)
  1039. +#define SLITE_CTIME(m)    ((m) & S_SLITE_CTIME)
  1040. +
  1041.  #endif
  1042.  
  1043.  #ifdef __KERNEL__
  1044. @@ -72,6 +88,24 @@
  1045.      unsigned long    blocks;
  1046.  };
  1047.  
  1048. +struct kstat_lite {
  1049. +    unsigned long    ino;
  1050. +    dev_t        dev;
  1051. +    umode_t        mode;
  1052. +    unsigned int    nlink;
  1053. +    uid_t        uid;
  1054. +    gid_t        gid;
  1055. +    dev_t        rdev;
  1056. +    unsigned long  lite_mask;
  1057. +    /* Fields below this are optional */
  1058. +    loff_t        size;
  1059. +    struct timespec  atime;
  1060. +    struct timespec    mtime;
  1061. +    struct timespec    ctime;
  1062. +    unsigned long    blksize;
  1063. +    unsigned long    blocks;
  1064. +};
  1065. +
  1066.  #endif
  1067.  
  1068.  #endif
  1069. diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/linux/syscalls.h vanilla-new/include/linux/syscalls.h
  1070. --- vanilla/include/linux/syscalls.h    2006-05-05 13:59:14.000000000 -0500
  1071. +++ vanilla-new/include/linux/syscalls.h    2006-05-05 17:12:01.000000000 -0500
  1072. @@ -38,7 +38,9 @@
  1073.  struct shmid_ds;
  1074.  struct sockaddr;
  1075.  struct stat;
  1076. +struct stat_lite;
  1077.  struct stat64;
  1078. +struct stat64_lite;
  1079.  struct statfs;
  1080.  struct statfs64;
  1081.  struct __sysctl_args;
  1082. @@ -226,16 +228,29 @@
  1083.              struct __old_kernel_stat __user *statbuf);
  1084.  asmlinkage long sys_newstat(char __user *filename,
  1085.                  struct stat __user *statbuf);
  1086. +asmlinkage long sys_newstatlite(char __user *filename,
  1087. +                struct stat_lite __user *statlitebuf);
  1088.  asmlinkage long sys_newlstat(char __user *filename,
  1089.                  struct stat __user *statbuf);
  1090. +asmlinkage long sys_newlstatlite(char __user *filename,
  1091. +                struct stat_lite __user *statlitebuf);
  1092.  asmlinkage long sys_newfstat(unsigned int fd, struct stat __user *statbuf);
  1093. +asmlinkage long sys_newfstatlite(unsigned int fd, 
  1094. +                struct stat_lite __user *statlitebuf);
  1095.  asmlinkage long sys_ustat(unsigned dev, struct ustat __user *ubuf);
  1096.  #if BITS_PER_LONG == 32
  1097.  asmlinkage long sys_stat64(char __user *filename,
  1098.                  struct stat64 __user *statbuf);
  1099. -asmlinkage long sys_fstat64(unsigned long fd, struct stat64 __user *statbuf);
  1100. +asmlinkage long sys_statlite64(char __user *filename,
  1101. +                struct stat64_lite __user *statlitebuf);
  1102. +asmlinkage long sys_fstat64(unsigned long fd, 
  1103. +                struct stat64 __user *statbuf);
  1104. +asmlinkage long sys_fstatlite64(unsigned long fd,
  1105. +                struct stat64_lite __user *statlitebuf);
  1106.  asmlinkage long sys_lstat64(char __user *filename,
  1107.                  struct stat64 __user *statbuf);
  1108. +asmlinkage long sys_lstatlite64(char __user *filename,
  1109. +                struct stat64_lite __user *statlitebuf);
  1110.  asmlinkage long sys_truncate64(const char __user *path, loff_t length);
  1111.  asmlinkage long sys_ftruncate64(unsigned int fd, loff_t length);
  1112.  #endif
  1113.