xattr.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:24k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *   Copyright (c) International Business Machines  Corp., 2000-2002
  3.  *   Copyright (c) Christoph Hellwig, 2002
  4.  *
  5.  *   This program is free software;  you can redistribute it and/or modify
  6.  *   it under the terms of the GNU General Public License as published by
  7.  *   the Free Software Foundation; either version 2 of the License, or 
  8.  *   (at your option) any later version.
  9.  * 
  10.  *   This program is distributed in the hope that it will be useful,
  11.  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
  12.  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
  13.  *   the GNU General Public License for more details.
  14.  *
  15.  *   You should have received a copy of the GNU General Public License
  16.  *   along with this program;  if not, write to the Free Software 
  17.  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  18.  */
  19. #include <linux/fs.h>
  20. #include <linux/xattr.h>
  21. #include "jfs_incore.h"
  22. #include "jfs_dmap.h"
  23. #include "jfs_debug.h"
  24. #include "jfs_dinode.h"
  25. #include "jfs_extent.h"
  26. #include "jfs_metapage.h"
  27. #include "jfs_xattr.h"
  28. /*
  29.  * jfs_xattr.c: extended attribute service
  30.  *
  31.  * Overall design --
  32.  *
  33.  * Format:
  34.  *
  35.  *   Extended attribute lists (jfs_ea_list) consist of an overall size (32 bit
  36.  *   value) and a variable (0 or more) number of extended attribute
  37.  *   entries.  Each extended attribute entry (jfs_ea) is a <name,value> double
  38.  *   where <name> is constructed from a null-terminated ascii string
  39.  *   (1 ... 255 bytes in the name) and <value> is arbitrary 8 bit data
  40.  *   (1 ... 65535 bytes).  The in-memory format is
  41.  *
  42.  *   0       1        2        4                4 + namelen + 1
  43.  *   +-------+--------+--------+----------------+-------------------+
  44.  *   | Flags | Name   | Value  | Name String  | Data . . . .      |
  45.  *   |       | Length | Length |                |                   |
  46.  *   +-------+--------+--------+----------------+-------------------+
  47.  *
  48.  *   A jfs_ea_list then is structured as
  49.  *
  50.  *   0            4                   4 + EA_SIZE(ea1)
  51.  *   +------------+-------------------+--------------------+-----
  52.  *   | Overall EA | First FEA Element | Second FEA Element | ..... 
  53.  *   | List Size  |                   |                    |
  54.  *   +------------+-------------------+--------------------+-----
  55.  *
  56.  *   On-disk:
  57.  *
  58.  *     FEALISTs are stored on disk using blocks allocated by dbAlloc() and
  59.  *     written directly. An EA list may be in-lined in the inode if there is
  60.  *     sufficient room available.
  61.  */
  62. struct ea_buffer {
  63. int flag; /* Indicates what storage xattr points to */
  64. int max_size; /* largest xattr that fits in current buffer */
  65. dxd_t new_ea; /* dxd to replace ea when modifying xattr */
  66. struct metapage *mp; /* metapage containing ea list */
  67. struct jfs_ea_list *xattr; /* buffer containing ea list */
  68. };
  69. /*
  70.  * ea_buffer.flag values
  71.  */
  72. #define EA_INLINE 0x0001
  73. #define EA_EXTENT 0x0002
  74. #define EA_NEW 0x0004
  75. #define EA_MALLOC 0x0008
  76. /* Namespaces */
  77. #define XATTR_SYSTEM_PREFIX "system."
  78. #define XATTR_SYSTEM_PREFIX_LEN (sizeof (XATTR_SYSTEM_PREFIX) - 1)
  79. #define XATTR_USER_PREFIX "user."
  80. #define XATTR_USER_PREFIX_LEN (sizeof (XATTR_USER_PREFIX) - 1)
  81. #define XATTR_OS2_PREFIX "os2."
  82. #define XATTR_OS2_PREFIX_LEN (sizeof (XATTR_OS2_PREFIX) - 1)
  83. /*
  84.  * These three routines are used to recognize on-disk extended attributes
  85.  * that are in a recognized namespace.  If the attribute is not recognized,
  86.  * "os2." is prepended to the name
  87.  */
  88. static inline int is_os2_xattr(struct jfs_ea *ea)
  89. {
  90. /*
  91.  * Check for "system."
  92.  */
  93. if ((ea->namelen >= XATTR_SYSTEM_PREFIX_LEN) &&
  94.     !strncmp(ea->name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN))
  95. return FALSE;
  96. /*
  97.  * Check for "user."
  98.  */
  99. if ((ea->namelen >= XATTR_USER_PREFIX_LEN) &&
  100.     !strncmp(ea->name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN))
  101. return FALSE;
  102. /*
  103.  * Add any other valid namespace prefixes here
  104.  */
  105. /*
  106.  * We assume it's OS/2's flat namespace
  107.  */
  108. return TRUE;
  109. }
  110. static inline int name_size(struct jfs_ea *ea)
  111. {
  112. if (is_os2_xattr(ea))
  113. return ea->namelen + XATTR_OS2_PREFIX_LEN;
  114. else
  115. return ea->namelen;
  116. }
  117. static inline int copy_name(char *buffer, struct jfs_ea *ea)
  118. {
  119. int len = ea->namelen;
  120. if (is_os2_xattr(ea)) {
  121. memcpy(buffer, XATTR_OS2_PREFIX, XATTR_OS2_PREFIX_LEN);
  122. buffer += XATTR_OS2_PREFIX_LEN;
  123. len += XATTR_OS2_PREFIX_LEN;
  124. }
  125. memcpy(buffer, ea->name, ea->namelen);
  126. buffer[ea->namelen] = 0;
  127. return len;
  128. }
  129. /* Forward references */
  130. static void ea_release(struct inode *inode, struct ea_buffer *ea_buf);
  131. /*
  132.  * NAME: ea_write_inline
  133.  *                                                                    
  134.  * FUNCTION: Attempt to write an EA inline if area is available
  135.  *                                                                    
  136.  * PRE CONDITIONS:
  137.  * Already verified that the specified EA is small enough to fit inline
  138.  *
  139.  * PARAMETERS:
  140.  * ip - Inode pointer
  141.  * ealist - EA list pointer
  142.  * size - size of ealist in bytes
  143.  * ea - dxd_t structure to be filled in with necessary EA information
  144.  *   if we successfully copy the EA inline
  145.  *
  146.  * NOTES:
  147.  * Checks if the inode's inline area is available.  If so, copies EA inline
  148.  * and sets <ea> fields appropriately.  Otherwise, returns failure, EA will
  149.  * have to be put into an extent.
  150.  *
  151.  * RETURNS: 0 for successful copy to inline area; -1 if area not available
  152.  */
  153. static int ea_write_inline(struct inode *ip, struct jfs_ea_list *ealist,
  154.    int size, dxd_t * ea)
  155. {
  156. struct jfs_inode_info *ji = JFS_IP(ip);
  157. /*
  158.  * Make sure we have an EA -- the NULL EA list is valid, but you
  159.  * can't copy it!
  160.  */
  161. if (ealist && size > sizeof (struct jfs_ea_list)) {
  162. assert(size <= sizeof (ji->i_inline_ea));
  163. /*
  164.  * See if the space is available or if it is already being
  165.  * used for an inline EA.
  166.  */
  167. if (!(ji->mode2 & INLINEEA) && !(ji->ea.flag & DXD_INLINE))
  168. return -1;
  169. DXDsize(ea, size);
  170. DXDlength(ea, 0);
  171. DXDaddress(ea, 0);
  172. memcpy(ji->i_inline_ea, ealist, size);
  173. ea->flag = DXD_INLINE;
  174. ji->mode2 &= ~INLINEEA;
  175. } else {
  176. ea->flag = 0;
  177. DXDsize(ea, 0);
  178. DXDlength(ea, 0);
  179. DXDaddress(ea, 0);
  180. /* Free up INLINE area */
  181. if (ji->ea.flag & DXD_INLINE)
  182. ji->mode2 |= INLINEEA;
  183. }
  184. mark_inode_dirty(ip);
  185. return 0;
  186. }
  187. /*
  188.  * NAME: ea_write
  189.  *                                                                    
  190.  * FUNCTION: Write an EA for an inode
  191.  *                                                                    
  192.  * PRE CONDITIONS: EA has been verified 
  193.  *
  194.  * PARAMETERS:
  195.  * ip - Inode pointer
  196.  * ealist - EA list pointer
  197.  * size - size of ealist in bytes
  198.  * ea - dxd_t structure to be filled in appropriately with where the
  199.  *   EA was copied
  200.  *
  201.  * NOTES: Will write EA inline if able to, otherwise allocates blocks for an
  202.  * extent and synchronously writes it to those blocks.
  203.  *
  204.  * RETURNS: 0 for success; Anything else indicates failure
  205.  */
  206. static int ea_write(struct inode *ip, struct jfs_ea_list *ealist, int size,
  207.        dxd_t * ea)
  208. {
  209. struct super_block *sb = ip->i_sb;
  210. struct jfs_inode_info *ji = JFS_IP(ip);
  211. struct jfs_sb_info *sbi = JFS_SBI(sb);
  212. int nblocks;
  213. s64 blkno;
  214. int rc = 0, i;
  215. char *cp;
  216. s32 nbytes, nb;
  217. s32 bytes_to_write;
  218. struct metapage *mp;
  219. /*
  220.  * Quick check to see if this is an in-linable EA.  Short EAs
  221.  * and empty EAs are all in-linable, provided the space exists.
  222.  */
  223. if (!ealist || size <= sizeof (ji->i_inline_ea)) {
  224. if (!ea_write_inline(ip, ealist, size, ea))
  225. return 0;
  226. }
  227. /* figure out how many blocks we need */
  228. nblocks = (size + (sb->s_blocksize - 1)) >> sb->s_blocksize_bits;
  229. rc = dbAlloc(ip, INOHINT(ip), nblocks, &blkno);
  230. if (rc)
  231. return -rc;
  232. /*
  233.  * Now have nblocks worth of storage to stuff into the FEALIST.
  234.  * loop over the FEALIST copying data into the buffer one page at
  235.  * a time.
  236.  */
  237. cp = (char *) ealist;
  238. nbytes = size;
  239. for (i = 0; i < nblocks; i += sbi->nbperpage) {
  240. /*
  241.  * Determine how many bytes for this request, and round up to
  242.  * the nearest aggregate block size
  243.  */
  244. nb = min(PSIZE, nbytes);
  245. bytes_to_write =
  246.     ((((nb + sb->s_blocksize - 1)) >> sb->s_blocksize_bits))
  247.     << sb->s_blocksize_bits;
  248. if (!(mp = get_metapage(ip, blkno + i, bytes_to_write, 1))) {
  249. rc = -EIO;
  250. goto failed;
  251. }
  252. memcpy(mp->data, cp, nb);
  253. /*
  254.  * We really need a way to propagate errors for
  255.  * forced writes like this one.  --hch
  256.  *
  257.  * (__write_metapage => release_metapage => flush_metapage)
  258.  */
  259. #ifdef _JFS_FIXME
  260. if ((rc = flush_metapage(mp))) {
  261. /*
  262.  * the write failed -- this means that the buffer
  263.  * is still assigned and the blocks are not being
  264.  * used.  this seems like the best error recovery
  265.  * we can get ...
  266.  */
  267. goto failed;
  268. }
  269. #else
  270. flush_metapage(mp);
  271. #endif
  272. cp += PSIZE;
  273. nbytes -= nb;
  274. }
  275. ea->flag = DXD_EXTENT;
  276. DXDsize(ea, le32_to_cpu(ealist->size));
  277. DXDlength(ea, nblocks);
  278. DXDaddress(ea, blkno);
  279. /* Free up INLINE area */
  280. if (ji->ea.flag & DXD_INLINE)
  281. ji->mode2 |= INLINEEA;
  282. return 0;
  283.       failed:
  284. dbFree(ip, blkno, nblocks);
  285. return rc;
  286. }
  287. /*
  288.  * NAME: ea_read_inline
  289.  *                                                                    
  290.  * FUNCTION: Read an inlined EA into user's buffer
  291.  *                                                                    
  292.  * PARAMETERS:
  293.  * ip - Inode pointer
  294.  * ealist - Pointer to buffer to fill in with EA
  295.  *
  296.  * RETURNS: 0
  297.  */
  298. static int ea_read_inline(struct inode *ip, struct jfs_ea_list *ealist)
  299. {
  300. struct jfs_inode_info *ji = JFS_IP(ip);
  301. int ea_size = sizeDXD(&ji->ea);
  302. if (ea_size == 0) {
  303. ealist->size = 0;
  304. return 0;
  305. }
  306. /* Sanity Check */
  307. if ((sizeDXD(&ji->ea) > sizeof (ji->i_inline_ea)))
  308. return -EIO;
  309. if (le32_to_cpu(((struct jfs_ea_list *) &ji->i_inline_ea)->size)
  310.     != ea_size)
  311. return -EIO;
  312. memcpy(ealist, ji->i_inline_ea, ea_size);
  313. return 0;
  314. }
  315. /*
  316.  * NAME: ea_read
  317.  *                                                                    
  318.  * FUNCTION: copy EA data into user's buffer
  319.  *                                                                    
  320.  * PARAMETERS:
  321.  * ip - Inode pointer
  322.  * ealist - Pointer to buffer to fill in with EA
  323.  *
  324.  * NOTES:  If EA is inline calls ea_read_inline() to copy EA.
  325.  *
  326.  * RETURNS: 0 for success; other indicates failure
  327.  */
  328. static int ea_read(struct inode *ip, struct jfs_ea_list *ealist)
  329. {
  330. struct super_block *sb = ip->i_sb;
  331. struct jfs_inode_info *ji = JFS_IP(ip);
  332. struct jfs_sb_info *sbi = JFS_SBI(sb);
  333. int nblocks;
  334. s64 blkno;
  335. char *cp = (char *) ealist;
  336. int i;
  337. int nbytes, nb;
  338. s32 bytes_to_read;
  339. struct metapage *mp;
  340. /* quick check for in-line EA */
  341. if (ji->ea.flag & DXD_INLINE)
  342. return ea_read_inline(ip, ealist);
  343. nbytes = sizeDXD(&ji->ea);
  344. assert(nbytes);
  345. /* 
  346.  * Figure out how many blocks were allocated when this EA list was
  347.  * originally written to disk.
  348.  */
  349. nblocks = lengthDXD(&ji->ea) << sbi->l2nbperpage;
  350. blkno = addressDXD(&ji->ea) << sbi->l2nbperpage;
  351. /*
  352.  * I have found the disk blocks which were originally used to store
  353.  * the FEALIST.  now i loop over each contiguous block copying the
  354.  * data into the buffer.
  355.  */
  356. for (i = 0; i < nblocks; i += sbi->nbperpage) {
  357. /*
  358.  * Determine how many bytes for this request, and round up to
  359.  * the nearest aggregate block size
  360.  */
  361. nb = min(PSIZE, nbytes);
  362. bytes_to_read =
  363.     ((((nb + sb->s_blocksize - 1)) >> sb->s_blocksize_bits))
  364.     << sb->s_blocksize_bits;
  365. if (!(mp = read_metapage(ip, blkno + i, bytes_to_read, 1)))
  366. return -EIO;
  367. memcpy(cp, mp->data, nb);
  368. release_metapage(mp);
  369. cp += PSIZE;
  370. nbytes -= nb;
  371. }
  372. return 0;
  373. }
  374. /*
  375.  * NAME: ea_get
  376.  *                                                                    
  377.  * FUNCTION: Returns buffer containing existing extended attributes.
  378.  *      The size of the buffer will be the larger of the existing
  379.  *      attributes size, or min_size.
  380.  *
  381.  *      The buffer, which may be inlined in the inode or in the
  382.  *       page cache must be release by calling ea_release or ea_put
  383.  *                                                                    
  384.  * PARAMETERS:
  385.  * inode - Inode pointer
  386.  * ea_buf - Structure to be populated with ealist and its metadata
  387.  * min_size- minimum size of buffer to be returned
  388.  *
  389.  * RETURNS: 0 for success; Other indicates failure
  390.  */
  391. static int ea_get(struct inode *inode, struct ea_buffer *ea_buf, int min_size)
  392. {
  393. struct jfs_inode_info *ji = JFS_IP(inode);
  394. struct super_block *sb = inode->i_sb;
  395. int size;
  396. int ea_size = sizeDXD(&ji->ea);
  397. int blocks_needed, current_blocks;
  398. s64 blkno;
  399. int rc;
  400. /* When fsck.jfs clears a bad ea, it doesn't clear the size */
  401. if (ji->ea.flag == 0)
  402. ea_size = 0;
  403. if (ea_size == 0) {
  404. if (min_size == 0) {
  405. ea_buf->flag = 0;
  406. ea_buf->max_size = 0;
  407. ea_buf->xattr = NULL;
  408. return 0;
  409. }
  410. if ((min_size <= sizeof (ji->i_inline_ea)) &&
  411.     (ji->mode2 & INLINEEA)) {
  412. ea_buf->flag = EA_INLINE | EA_NEW;
  413. ea_buf->max_size = sizeof (ji->i_inline_ea);
  414. ea_buf->xattr = (struct jfs_ea_list *) ji->i_inline_ea;
  415. DXDlength(&ea_buf->new_ea, 0);
  416. DXDaddress(&ea_buf->new_ea, 0);
  417. ea_buf->new_ea.flag = DXD_INLINE;
  418. DXDsize(&ea_buf->new_ea, min_size);
  419. return 0;
  420. }
  421. current_blocks = 0;
  422. } else if (ji->ea.flag & DXD_INLINE) {
  423. if (min_size <= sizeof (ji->i_inline_ea)) {
  424. ea_buf->flag = EA_INLINE;
  425. ea_buf->max_size = sizeof (ji->i_inline_ea);
  426. ea_buf->xattr = (struct jfs_ea_list *) ji->i_inline_ea;
  427. goto size_check;
  428. }
  429. current_blocks = 0;
  430. } else {
  431. assert(ji->ea.flag & DXD_EXTENT);
  432. current_blocks = (ea_size + sb->s_blocksize - 1) >>
  433.     sb->s_blocksize_bits;
  434. }
  435. size = max(min_size, ea_size);
  436. if (size > PSIZE) {
  437. /*
  438.  * To keep the rest of the code simple.  Allocate a
  439.  * contiguous buffer to work with
  440.  */
  441. ea_buf->xattr = kmalloc(size, GFP_KERNEL);
  442. if (ea_buf->xattr == NULL)
  443. return -ENOMEM;
  444. ea_buf->flag |= EA_MALLOC;
  445. ea_buf->max_size = (size + sb->s_blocksize - 1) &
  446.     ~(sb->s_blocksize - 1);
  447. if (ea_size == 0)
  448. return 0;
  449. if ((rc = ea_read(inode, ea_buf->xattr))) {
  450. kfree(ea_buf->xattr);
  451. ea_buf->xattr = NULL;
  452. return rc;
  453. }
  454. goto size_check;
  455. }
  456. blocks_needed = (min_size + sb->s_blocksize - 1) >>
  457.     sb->s_blocksize_bits;
  458. if (blocks_needed > current_blocks) {
  459. rc = dbAlloc(inode, INOHINT(inode), (s64) blocks_needed,
  460.      &blkno);
  461. if (rc)
  462. return -rc;
  463. DXDlength(&ea_buf->new_ea, blocks_needed);
  464. DXDaddress(&ea_buf->new_ea, blkno);
  465. ea_buf->new_ea.flag = DXD_EXTENT;
  466. DXDsize(&ea_buf->new_ea, min_size);
  467. ea_buf->flag = EA_EXTENT | EA_NEW;
  468. ea_buf->mp = get_metapage(inode, blkno,
  469.   blocks_needed << sb->s_blocksize_bits,
  470.   1);
  471. if (ea_buf->mp == NULL) {
  472. dbFree(inode, blkno, (s64) blocks_needed);
  473. return -EIO;
  474. }
  475. ea_buf->xattr = ea_buf->mp->data;
  476. ea_buf->max_size = (min_size + sb->s_blocksize - 1) &
  477.     ~(sb->s_blocksize - 1);
  478. if (ea_size == 0)
  479. return 0;
  480. if ((rc = ea_read(inode, ea_buf->xattr))) {
  481. discard_metapage(ea_buf->mp);
  482. dbFree(inode, blkno, (s64) blocks_needed);
  483. return rc;
  484. }
  485. goto size_check;
  486. }
  487. ea_buf->flag = EA_EXTENT;
  488. ea_buf->mp = read_metapage(inode, addressDXD(&ji->ea),
  489.    lengthDXD(&ji->ea), 1);
  490. if (ea_buf->mp == NULL)
  491. return -EIO;
  492. ea_buf->xattr = ea_buf->mp->data;
  493. ea_buf->max_size = (ea_size + sb->s_blocksize - 1) &
  494.     ~(sb->s_blocksize - 1);
  495.       size_check:
  496. if (EALIST_SIZE(ea_buf->xattr) != ea_size) {
  497. printk(KERN_ERR "ea_get: invalid extended attributen");
  498. dump_mem("xattr", ea_buf->xattr, ea_size);
  499. ea_release(inode, ea_buf);
  500. return -EIO;
  501. }
  502. return ea_size;
  503. }
  504. static void ea_release(struct inode *inode, struct ea_buffer *ea_buf)
  505. {
  506. if (ea_buf->flag & EA_MALLOC)
  507. kfree(ea_buf->xattr);
  508. else if (ea_buf->flag & EA_EXTENT) {
  509. assert(ea_buf->mp);
  510. release_metapage(ea_buf->mp);
  511. if (ea_buf->flag & EA_NEW)
  512. dbFree(inode, addressDXD(&ea_buf->new_ea),
  513.        lengthDXD(&ea_buf->new_ea));
  514. }
  515. }
  516. static int ea_put(struct inode *inode, struct ea_buffer *ea_buf, int new_size)
  517. {
  518. struct jfs_inode_info *ji = JFS_IP(inode);
  519. unsigned long old_blocks, new_blocks;
  520. int rc = 0;
  521. tid_t tid;
  522. if (new_size == 0) {
  523. ea_release(inode, ea_buf);
  524. ea_buf = 0;
  525. } else if (ea_buf->flag & EA_INLINE) {
  526. assert(new_size <= sizeof (ji->i_inline_ea));
  527. ji->mode2 &= ~INLINEEA;
  528. ea_buf->new_ea.flag = DXD_INLINE;
  529. DXDsize(&ea_buf->new_ea, new_size);
  530. DXDaddress(&ea_buf->new_ea, 0);
  531. DXDlength(&ea_buf->new_ea, 0);
  532. } else if (ea_buf->flag & EA_MALLOC) {
  533. rc = ea_write(inode, ea_buf->xattr, new_size, &ea_buf->new_ea);
  534. kfree(ea_buf->xattr);
  535. } else if (ea_buf->flag & EA_NEW) {
  536. /* We have already allocated a new dxd */
  537. flush_metapage(ea_buf->mp);
  538. } else {
  539. /* ->xattr must point to original ea's metapage */
  540. rc = ea_write(inode, ea_buf->xattr, new_size, &ea_buf->new_ea);
  541. discard_metapage(ea_buf->mp);
  542. }
  543. if (rc)
  544. return rc;
  545. tid = txBegin(inode->i_sb, 0);
  546. down(&ji->commit_sem);
  547. old_blocks = new_blocks = 0;
  548. if (ji->ea.flag & DXD_EXTENT) {
  549. invalidate_dxd_metapages(inode, ji->ea);
  550. old_blocks = lengthDXD(&ji->ea);
  551. }
  552. if (ea_buf) {
  553. txEA(tid, inode, &ji->ea, &ea_buf->new_ea);
  554. if (ea_buf->new_ea.flag & DXD_EXTENT) {
  555. new_blocks = lengthDXD(&ea_buf->new_ea);
  556. if (ji->ea.flag & DXD_INLINE)
  557. ji->mode2 |= INLINEEA;
  558. }
  559. ji->ea = ea_buf->new_ea;
  560. } else {
  561. txEA(tid, inode, &ji->ea, 0);
  562. if (ji->ea.flag & DXD_INLINE)
  563. ji->mode2 |= INLINEEA;
  564. ji->ea.flag = 0;
  565. ji->ea.size = 0;
  566. }
  567. inode->i_blocks += LBLK2PBLK(inode->i_sb, new_blocks - old_blocks);
  568. rc = txCommit(tid, 1, &inode, 0);
  569. txEnd(tid);
  570. up(&ji->commit_sem);
  571. return rc;
  572. }
  573. static int can_set_xattr(struct inode *inode, const char *name,
  574.  void *value, size_t value_len)
  575. {
  576. if (IS_RDONLY(inode))
  577. return -EROFS;
  578. if (IS_IMMUTABLE(inode) || IS_APPEND(inode) || S_ISLNK(inode->i_mode))
  579. return -EPERM;
  580. if((strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN) != 0) &&
  581.    (strncmp(name, XATTR_OS2_PREFIX, XATTR_OS2_PREFIX_LEN) != 0))
  582. return -EOPNOTSUPP;
  583. if (!S_ISREG(inode->i_mode) &&
  584.     (!S_ISDIR(inode->i_mode) || inode->i_mode &S_ISVTX))
  585. return -EPERM;
  586. return permission(inode, MAY_WRITE);
  587. }
  588. int __jfs_setxattr(struct inode *inode, const char *name, void *value,
  589.    size_t value_len, int flags)
  590. {
  591. struct jfs_ea_list *ealist;
  592. struct jfs_ea *ea, *old_ea = NULL, *next_ea = NULL;
  593. struct ea_buffer ea_buf;
  594. int old_ea_size = 0;
  595. int xattr_size;
  596. int new_size;
  597. int namelen = strlen(name);
  598. char *os2name = NULL;
  599. int found = 0;
  600. int rc;
  601. int length;
  602. if ((rc = can_set_xattr(inode, name, value, value_len)))
  603. return rc;
  604. if (strncmp(name, XATTR_OS2_PREFIX, XATTR_OS2_PREFIX_LEN) == 0) {
  605. os2name = kmalloc(namelen - XATTR_OS2_PREFIX_LEN + 1,
  606.   GFP_KERNEL);
  607. if (!os2name)
  608. return -ENOMEM;
  609. strcpy(os2name, name + XATTR_OS2_PREFIX_LEN);
  610. name = os2name;
  611. namelen -= XATTR_OS2_PREFIX_LEN;
  612. }
  613. xattr_size = ea_get(inode, &ea_buf, 0);
  614. if (xattr_size < 0) {
  615. rc = xattr_size;
  616. goto out;
  617. }
  618.       again:
  619. ealist = (struct jfs_ea_list *) ea_buf.xattr;
  620. new_size = sizeof (struct jfs_ea_list);
  621. if (xattr_size) {
  622. for (ea = FIRST_EA(ealist); ea < END_EALIST(ealist);
  623.      ea = NEXT_EA(ea)) {
  624. if ((namelen == ea->namelen) &&
  625.     (memcmp(name, ea->name, namelen) == 0)) {
  626. found = 1;
  627. if (flags & XATTR_CREATE) {
  628. rc = -EEXIST;
  629. goto release;
  630. }
  631. old_ea = ea;
  632. old_ea_size = EA_SIZE(ea);
  633. next_ea = NEXT_EA(ea);
  634. } else
  635. new_size += EA_SIZE(ea);
  636. }
  637. }
  638. if (!found) {
  639. if (flags & XATTR_REPLACE) {
  640. rc = -ENODATA;
  641. goto release;
  642. }
  643. if (value == NULL) {
  644. rc = 0;
  645. goto release;
  646. }
  647. }
  648. if (value)
  649. new_size += sizeof (struct jfs_ea) + namelen + 1 + value_len;
  650. if (new_size > ea_buf.max_size) {
  651. /*
  652.  * We need to allocate more space for merged ea list.
  653.  * We should only have loop to again: once.
  654.  */
  655. ea_release(inode, &ea_buf);
  656. xattr_size = ea_get(inode, &ea_buf, new_size);
  657. if (xattr_size < 0) {
  658. rc = xattr_size;
  659. goto out;
  660. }
  661. goto again;
  662. }
  663. /* Remove old ea of the same name */
  664. if (found) {
  665. /* number of bytes following target EA */
  666. length = (char *) END_EALIST(ealist) - (char *) next_ea;
  667. if (length > 0)
  668. memmove(old_ea, next_ea, length);
  669. xattr_size -= old_ea_size;
  670. }
  671. /* Add new entry to the end */
  672. if (value) {
  673. if (xattr_size == 0)
  674. /* Completely new ea list */
  675. xattr_size = sizeof (struct jfs_ea_list);
  676. ea = (struct jfs_ea *) ((char *) ealist + xattr_size);
  677. ea->flag = 0;
  678. ea->namelen = namelen;
  679. ea->valuelen = (cpu_to_le16(value_len));
  680. memcpy(ea->name, name, namelen);
  681. ea->name[namelen] = 0;
  682. if (value_len)
  683. memcpy(&ea->name[namelen + 1], value, value_len);
  684. xattr_size += EA_SIZE(ea);
  685. }
  686. /* DEBUG - If we did this right, these number match */
  687. if (xattr_size != new_size) {
  688. printk(KERN_ERR
  689.        "jfs_xsetattr: xattr_size = %d, new_size = %dn",
  690.        xattr_size, new_size);
  691. rc = -EINVAL;
  692. goto release;
  693. }
  694. /*
  695.  * If we're left with an empty list, there's no ea
  696.  */
  697. if (new_size == sizeof (struct jfs_ea_list))
  698. new_size = 0;
  699. ealist->size = cpu_to_le32(new_size);
  700. rc = ea_put(inode, &ea_buf, new_size);
  701. goto out;
  702.       release:
  703. ea_release(inode, &ea_buf);
  704.       out:
  705. if (os2name)
  706. kfree(os2name);
  707. return rc;
  708. }
  709. int jfs_setxattr(struct dentry *dentry, const char *name, void *value,
  710.  size_t value_len, int flags)
  711. {
  712. if (value == NULL) { /* empty EA, do not remove */
  713. value = "";
  714. value_len = 0;
  715. }
  716. return __jfs_setxattr(dentry->d_inode, name, value, value_len, flags);
  717. }
  718. static inline int can_get_xattr(struct inode *inode, const char *name)
  719. {
  720. return permission(inode, MAY_READ);
  721. }
  722. ssize_t __jfs_getxattr(struct inode *inode, const char *name, void *data,
  723.        size_t buf_size)
  724. {
  725. struct jfs_ea_list *ealist;
  726. struct jfs_ea *ea;
  727. struct ea_buffer ea_buf;
  728. int xattr_size;
  729. ssize_t size;
  730. int namelen = strlen(name);
  731. char *os2name = NULL;
  732. int rc;
  733. char *value;
  734. if ((rc = can_get_xattr(inode, name)))
  735. return rc;
  736. if (strncmp(name, XATTR_OS2_PREFIX, XATTR_OS2_PREFIX_LEN) == 0) {
  737. os2name = kmalloc(namelen - XATTR_OS2_PREFIX_LEN + 1,
  738.   GFP_KERNEL);
  739. if (!os2name)
  740. return -ENOMEM;
  741. strcpy(os2name, name + XATTR_OS2_PREFIX_LEN);
  742. name = os2name;
  743. namelen -= XATTR_OS2_PREFIX_LEN;
  744. }
  745. xattr_size = ea_get(inode, &ea_buf, 0);
  746. if (xattr_size < 0) {
  747. size = xattr_size;
  748. goto out;
  749. }
  750. if (xattr_size == 0)
  751. goto not_found;
  752. ealist = (struct jfs_ea_list *) ea_buf.xattr;
  753. /* Find the named attribute */
  754. for (ea = FIRST_EA(ealist); ea < END_EALIST(ealist); ea = NEXT_EA(ea))
  755. if ((namelen == ea->namelen) &&
  756.     memcmp(name, ea->name, namelen) == 0) {
  757. /* Found it */
  758. size = le16_to_cpu(ea->valuelen);
  759. if (!data)
  760. goto release;
  761. else if (size > buf_size) {
  762. size = -ERANGE;
  763. goto release;
  764. }
  765. value = ((char *) &ea->name) + ea->namelen + 1;
  766. memcpy(data, value, size);
  767. goto release;
  768. }
  769.       not_found:
  770. size = -ENODATA;
  771.       release:
  772. ea_release(inode, &ea_buf);
  773.       out:
  774. if (os2name)
  775. kfree(os2name);
  776. return size;
  777. }
  778. ssize_t jfs_getxattr(struct dentry *dentry, const char *name, void *data,
  779.      size_t buf_size)
  780. {
  781. return __jfs_getxattr(dentry->d_inode, name, data, buf_size);
  782. }
  783. ssize_t jfs_listxattr(struct dentry * dentry, char *data, size_t buf_size)
  784. {
  785. struct inode *inode = dentry->d_inode;
  786. char *buffer;
  787. ssize_t size = 0;
  788. int xattr_size;
  789. struct jfs_ea_list *ealist;
  790. struct jfs_ea *ea;
  791. struct ea_buffer ea_buf;
  792. xattr_size = ea_get(inode, &ea_buf, 0);
  793. if (xattr_size < 0) {
  794. size = xattr_size;
  795. goto out;
  796. }
  797. if (xattr_size == 0)
  798. goto release;
  799. ealist = (struct jfs_ea_list *) ea_buf.xattr;
  800. /* compute required size of list */
  801. for (ea = FIRST_EA(ealist); ea < END_EALIST(ealist); ea = NEXT_EA(ea))
  802. size += name_size(ea) + 1;
  803. if (!data)
  804. goto release;
  805. if (size > buf_size) {
  806. size = -ERANGE;
  807. goto release;
  808. }
  809. /* Copy attribute names to buffer */
  810. buffer = data;
  811. for (ea = FIRST_EA(ealist); ea < END_EALIST(ealist); ea = NEXT_EA(ea)) {
  812. int namelen = copy_name(buffer, ea);
  813. buffer += namelen + 1;
  814. }
  815.       release:
  816. ea_release(inode, &ea_buf);
  817.       out:
  818. return size;
  819. }
  820. int jfs_removexattr(struct dentry *dentry, const char *name)
  821. {
  822. return __jfs_setxattr(dentry->d_inode, name, 0, 0, XATTR_REPLACE);
  823. }